NEGAKULIFE

ネ学生のQoLを上げるブログ

ネ学生のQoLを上げるブログ

課題が終わらないのは仕様

SD攻略決死隊 - 意地でも定時に帰りたい #1

先週(2016/5/12)のSD、ヤバかったですね。死屍累々というかなんというかって感じでした。
担当教諭が変わったのもあり、相当問題が難しくなったなーと感じました。

今回の課題

今回は二問出題されました。皆さんはどこまで進めましたか?

  • TurtleFrameクラスを拡張して、以下に示すような MyTurtleFrame クラスを作成しなさい。
  • java.util.Listインターフェースを実装するクラスMyListを定義せよ。

しょっぱなの出題から「???」ってなった人も多いと思います。
と、言うか、課題1のほうが難しいと思います。(個人の感想)

出題の分析

簡単だと言った課題2から考えてみます。
今回は、個人の適当な知見に基いて書いているので、間違え等多々あると思います。許してください。

課題2

java.util.Listインターフェースって言われて意味が分からなかったら、恐らく勉強不足です。
意味がある程度分かるのであれば、この課題はただの作業ゲーと化します。 APIリファレンスを読んで、必要な物をガリガリ実装していきましょう。
ここで詰まるのであれば、それはJavaの「書き方」を知らないだけです。勉強すればバッチリ取り戻せます。多分。

課題1

地味に厄介なのがこいつです。厄介な理由は「今までとプログラムの性質が異なるから」であると考えます。
ここで詰まるのは、ある意味当然です。これはJavaの「うまい使い方」を知らないだけです。だけって言っても知らないんだから無理です。つらい。

今までのプログラミングは、「何かに指示を出す」という処理が中心でした。 f:id:ne5oku:20160517005826p:plain

しかし、今回のプログラミングは「何かあった時に指示を出す」というある意味受動的な処理を行う必要があります。 f:id:ne5oku:20160517010138p:plain

このようなプログラミングは、実はしてきませんでした(厳密にはProcessingでやったかもしれない)。

このようなことを実現可能にするのが「イベント」という考え方です。

イベントってなんだ

Minecraftのプログラミングでもめちゃくちゃ出てきます(が故に知っているのですが)。

このようなイメージを考えてください。 f:id:ne5oku:20160517011112p:plain

「ピンポーンという音が聞こえたので、亀に指示を出す。」
と言った感じです。

この時の、「ピンポーン」という音が「イベント」です。キッカケみたいなものです。
「ピンポーン」という「イベント」が発生したことを知るのは「リスナ」です。
「リスナ」は、適当な処理を投げます。

「リスナ」というのは、「どんなイベントに対して反応するか」というのが重要です。
留守番を頼まれる人がリスナだとすると、その人に「郵便が来たら出て受け取って」「新聞勧誘が来たらぶん殴って」と色々とするべきことを頼みます。
これのことを「リスナに登録する」とかいいます。

イベント風に考える前にコードを追ってみる

最初に提示されているソースコードには、予め「一つ」だけの処理が書かれています。これが非常にいじわるです。
11行目にてnewされた「add」を追いかけてみましょう。

  1. 15行目で「addActionListner」が呼び出される
    ↑この処理はaddにしかされてない!いじわる
  2. 17行目で「setActionCommand」が呼び出される
    ↑この処理は普通に4つ分ある
  3. 21行目で「turtles」というJMenu(8行目で作られたヤツ)に追加される →そして31行目でコマンドをキャッチして処理を実行している。

とてもゴチャゴチャしていますが、一つの処理に着目していると、これだけのことしかしていません。
つまり、例えばDelete Headを追加したいとすると、以下のような作業が必要です

  1. 12行目でnewされたdelHeadに、addActionListnerを呼び出す
  2. setActionCommandはすでにもう呼び出されてる(なんでだよって感じ)
  3. 8行目で作られたJMenuのturtlesにdelHeadをぶち込む(けどもうすでにされてる)
  4. actionPerfomedメソッド(29行目)の中の、if文に分岐を追加して、実際の処理を書く

イベント風に理解しておく

ここまで書いて気付いたんですけど、今回あまりイベント関係なかったですね(クソ)
せっかく書いたので、イベントについても考えておきます。

ソースコード内に「イベント」というのが登場するのは、29行目の「actionPerfomedメソッド」の引数内です。
「ActionEvent」というのが見えると思います。

つまり、actionPerfomedメソッドは「なんか物事が起きた時に呼ばれるメソッド」であると言える訳です(詳しくは割愛)
この「なんか物事が起きた」というのはすげー大雑把です。大雑把すぎるのでもう少し細く見る必要があります。

なので、今回は「ActionCommand」という物を上手く利用しています。
先ほどの、コードを追った時に「setActionCommand」という物があったと思います。
これを設定してあげることで、そのボタンが押された時に「今何か物事が起きたっしょ?実はそれ"addTurtle"なんすよw」みたいな情報を持たせることが出来ます。

後は、actionPerfomedメソッド内で「なんか物事起きたのは分かったけど、結局それってなんなん?」って処理をif文で書いてあげれば万事オッケーという訳です。

まとめ

  • いじわるかよ~~~
  • 課題1はむずかしい
  • 課題2はめんどくさい

最後の方、かなり投げやりですが飽きただけです。