「やる夫で学ぶTDD」八日目 ボウリングのスコア計算 現在のフレームって? #ytdd
今日は遅いのでちょっとだけですがやる夫で学ぶTDD 第8日目 ボウリングのスコア計算 現在のフレームって? を始めます。 #ytdd
2011-02-15 00:26:55やる夫:同期美女とチャットしていて鼻の下を伸ばしている暇があるなら、やる夫とペアプロTDDしてほしいだお!阿部さんなら女の子なんて見向きもしないんだお! #ytdd
2011-02-15 00:28:39やらない夫:でも、阿部さんはチーフプログラマーだかが激務だろう。ともあれ、昨日まででスコアの配列が与えられて全体のスコア計算をするクラスはできているわけだが、今回は #ytdd
2011-02-15 00:29:32さらにこんな拡張要求がきた。一本ずつ倒したピンを渡して、途中段階のスコアも出せるようにしてほしいという要望だ。 #ytdd http://twitpic.com/3zro6q
2011-02-15 00:31:20やる夫:でも、ストライクは、後の2投球を足さないとスコアでないし、スペアの場合は後の1等級が必要だお。 現在のスコアってどういう意味かよく分からんお #ytdd
2011-02-15 00:32:35やらない夫:そこは課題文だけでよく分からんので、ちょっと決め打ちにすることにした。 10 しかない状態は 10 0 0 0 と10で最初のストライク以降はずっとガーター続くという最低点数の場合の値とするというものだ。#ytdd
2011-02-15 00:33:33やる夫: 10 5 の場合は? 10 5 0 0 0ということかお? ということは、1フレー目は 15 2フレーム目は 20 その後のフレームは最後まで20ってことかお? #ytdd
2011-02-15 00:34:35やらない夫:そうだ、スペアの場合も、 6 4 では 6 4 0 0 0 なので、1フレーム目 10 2フレーム目 10 以降10、 6 4 5のような場合、6 4 5 0 0 0と見て、 1フレーム目 15 2フレーム目 20という感じだな。 #ytdd
2011-02-15 00:36:02やらない夫:ここで、現在のスコアというのを現在投げ終わったもしくは投げ途中のフレームと考えることにする。 10の場合は、 1フレーム、10 0の場合は2フレーム、 6の場合は、1フレーム、6 4の場合はやはり1フレーム、6 4 5 #ytdd
2011-02-15 00:38:20やらない夫:で、今回はまずいきなりスコアを求めず、今投げ終わった多状態で、どのフレームにいるかのみをテストしたいと思う。 #ytdd
2011-02-15 00:39:12やらない夫:課題2ではフレームの単位でループを回して、スコアを求めていたよ。実はフレーム単位で処理したほうがボウリングのスコア計算は分かり易いのだ。ゆえにまず投球に対して投球後の現在のフレームのみを求め、その後現在のフレームに対するスコアを求めるというようにしたいわけ #ytdd
2011-02-15 00:43:24やる夫:bowling.bowl(4); assertEquals(1, bowling.getCurrentFrame()); 1回投げて4ピン倒した状態は1フレーム目にいるお。 #ytdd
2011-02-15 00:44:33やらない夫:そうだな。return 1とかで簡単に実装させちゃうのがナイーブなTDDだが。まずはそこから行くか。 #ytdd
2011-02-15 00:45:33やる夫:つぎは、 4 5と投げて、この状態もフレーム1にいるお bowling.bowl(4); bowling.bowl(5); assertEquals(1, bowling.getCurrentFrame()); #ytdd
2011-02-15 00:46:22やらない夫:ここまではまあフレーム1だけど、その後に 4 5 6とかを作るとこれはフレーム2にいることになる。 #ytdd
2011-02-15 00:47:02やる夫:Bolwingクラスに現在のフレームの位置を記憶させる、 private int currentFrame = 0; を作って、これをそのフレームで最初の投球の時に、インクリメントすれば、さっきの三シナリオはいけるお。2投球目ではインクリメントしない。#ytdd
2011-02-15 00:48:55やらない夫:となると、まず、今がそのフレームの最初の投球であるかというフラグが必要なんじゃないか?private boolean firstThrow = true; のように。 #ytdd
2011-02-15 00:49:48やる夫:そうだお。だから、if (firstThrow) { currentFrame++; }で行けるお! #ytdd
2011-02-15 00:51:53やる夫:その後に、if (!firstThrow) { fisrtThrow = true; } else { firstThrow = false; }のように反転させればいいお! #ytdd
2011-02-15 00:52:05やらない夫:やる夫全くストライクの場合考えてないだろう・・・このままだとストライクが来た後に、その次のフレームの投球が来ると、それがストライクを出したフレームと同じフレームにいるとみなされてしまうぞ。つまり、#ytdd
2011-02-15 00:53:57やる夫:一球目がストライクだった場合、firsttThrowをリセットして次のフレームの最初の投球とみなすようにさっきの if (!firstThrow) { を #ytdd
2011-02-15 00:56:33