よこなさんが作ったじゃんけんプログラムの話の続きです。(→前編)
同様のじゃんけんプログラムを自分でも書いてみました。
なお、メソッド名と乱数についてはさくらばさんのじゃんけんプログラムを参考にさせていただきました。
プログラムを3つ公開しますが、作っていった過程を示している感じです。
自分のプログラムのポイントは、じゃんけんの手をenumにし、勝敗の判定メソッドもenumに持たせたところです。
(compareToで比較できるようにしようかとも思ったけれどもw、推移律(a<bかつb<cならa<c)を満たさなくなるので駄目な気がした))
1つ目のプログラムでは、loopメソッドの中に全処理をべたーっと書いています(苦笑)
これではテストのしようもないので(元々コンソール入力のあるプログラムのテストを書くのは面倒ですが)、せめて判定部分だけでもメソッド分割を…と思って出来たのが2つ目です。
入出力も別メソッドに切り出せたので、loopメソッドはとてもシンプルになったと思います。
ただし、loopメソッド内に収まっていたローカル変数がフィールドになってしまいましたが^^;
あ、ちなみに、OptionalのifPresentメソッドを使って判定している箇所があります。
「ifPresentを使ったら敗北だ」という人に、この場合どうすればいいかぜひ教えていただきたく(笑)
3つ目のプログラムは、入力するキーの文字列もenumに持たせました。
2つ目までは、入力するキーの情報があちこちに散らばっていたので、例えばキーをa,b,cに変更しようと思ったら大変です。
キーのMapを作ったりする箇所でStreamを使いました。こういうのはほんと便利です(笑) (同じループを何回も行う富豪的プログラミングですが…)
ただ、やっぱりメソッド参照を使うと分かりにくい気はしますねぇ。慣れれば問題ないかなぁ。
ちなみに、enumにキーの情報を持たせたけれども、それが良いかというと、実は悩ましい。
例えばEclipseのように実行中にキーを設定できるようにするなら、enumに持たせるのはありえないです。
なお、privateでよさそうなメソッドがほとんどprotectedになっているのは、趣味です(爆)
フレームワークやユーティリティーと呼ばれるものがガチガチにprivateで作られていて拡張できないことに日頃からうんざりしているので、自分で作るものは基本的にprotectedにします!(きっぱり)
ちなみに、privateメソッドにしていたとしたら、privateメソッドのテストがしたい問題が再発ですw
あー、あと、Randomのフィールドがクラスの途中にあります。
標準的なコーディング規約では、クラスの先頭にフィールドがあり、その後はメソッド定義が続くことになります。
が、個人的には、あるメソッドの中でしか使わないようなものは、このように使うメソッドの直前に置いたりします。
(Javaでは無理だけど、メソッドの中で永続的な変数を定義できると良かった)
(getComputerHandメソッドのテストを行うことを考えたら、randomフィールドも差し替えられるようにパッケージプライベートにしておいた方が良かったかも?)
4つ目は作っていませんが、PlayerクラスとComputerクラスを作って入力方法をそこに隠蔽する形には出来そうですね。
そういえば、さくらばさんのプログラムでSystem.console()というのが使われていて、初めて知りました。(Eclipse上で実行したらnullが返ってきたけど(爆) コマンドプロンプトで実行したら大丈夫だった)
一点気になったのが、コンストラクターで全部処理していることですね。JavaFXのサンプルプログラムなんかでもたまに見かける方法ですが、個人的には不安です。
コンストラクターの初期化処理が終わっていない状態がずっと続くことになるわけですが、(JavaVMあるいはJava仕様的に?)大丈夫なのでしょうか。
それにしても、よこなさんのじゃんけんプログラム、とても良い題材でした。
※コメント投稿者のブログIDはブログ作成者のみに通知されます