「やる夫で学ぶTDD」八日目 ボウリングのスコア計算 現在のフレームって? #ytdd

某SIerで if(true == false) のような神コードのインスペクションで廃人化しているやらない夫こと太田先生の「やる夫で学ぶTDD」八日目です。
3
Kenichiro Ota @oota_ken

今日は遅いのでちょっとだけですがやる夫で学ぶTDD 第8日目 ボウリングのスコア計算 現在のフレームって? を始めます。 #ytdd

2011-02-15 00:26:55
Kenichiro Ota @oota_ken

やる夫:やらない夫ー、やらない夫、今日は医療ドラマ見てたのかお? #ytdd

2011-02-15 00:27:33
Kenichiro Ota @oota_ken

やらない夫:それもあるが、いろいろ忙しいのだ。 #ytdd

2011-02-15 00:27:52
Kenichiro Ota @oota_ken

やる夫:同期美女とチャットしていて鼻の下を伸ばしている暇があるなら、やる夫とペアプロTDDしてほしいだお!阿部さんなら女の子なんて見向きもしないんだお! #ytdd

2011-02-15 00:28:39
Kenichiro Ota @oota_ken

やらない夫:でも、阿部さんはチーフプログラマーだかが激務だろう。ともあれ、昨日まででスコアの配列が与えられて全体のスコア計算をするクラスはできているわけだが、今回は #ytdd

2011-02-15 00:29:32
Kenichiro Ota @oota_ken

さらにこんな拡張要求がきた。一本ずつ倒したピンを渡して、途中段階のスコアも出せるようにしてほしいという要望だ。 #ytdd http://twitpic.com/3zro6q

2011-02-15 00:31:20
拡大
Kenichiro Ota @oota_ken

やる夫:でも、ストライクは、後の2投球を足さないとスコアでないし、スペアの場合は後の1等級が必要だお。 現在のスコアってどういう意味かよく分からんお #ytdd

2011-02-15 00:32:35
Kenichiro Ota @oota_ken

やらない夫:そこは課題文だけでよく分からんので、ちょっと決め打ちにすることにした。 10 しかない状態は 10 0 0 0 と10で最初のストライク以降はずっとガーター続くという最低点数の場合の値とするというものだ。#ytdd

2011-02-15 00:33:33
Kenichiro Ota @oota_ken

やる夫: 10 5 の場合は? 10 5 0 0 0ということかお? ということは、1フレー目は 15 2フレーム目は 20 その後のフレームは最後まで20ってことかお? #ytdd

2011-02-15 00:34:35
Kenichiro Ota @oota_ken

やらない夫:そうだ、スペアの場合も、 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
Kenichiro Ota @oota_ken

やらない夫:ここで、現在のスコアというのを現在投げ終わったもしくは投げ途中のフレームと考えることにする。 10の場合は、 1フレーム、10 0の場合は2フレーム、 6の場合は、1フレーム、6 4の場合はやはり1フレーム、6 4 5 #ytdd

2011-02-15 00:38:20
Kenichiro Ota @oota_ken

やらない夫:で、今回はまずいきなりスコアを求めず、今投げ終わった多状態で、どのフレームにいるかのみをテストしたいと思う。 #ytdd

2011-02-15 00:39:12
Kenichiro Ota @oota_ken

やる夫:なんでだお?なんでそんな回りくどいことするんだお?#ytdd

2011-02-15 00:39:51
Kenichiro Ota @oota_ken

やる夫:なんで、そんな回りくどいことするんだお?一気にスコア求めたほうが楽じゃないのかお? #ytdd

2011-02-15 00:41:28
Kenichiro Ota @oota_ken

やらない夫:課題2ではフレームの単位でループを回して、スコアを求めていたよ。実はフレーム単位で処理したほうがボウリングのスコア計算は分かり易いのだ。ゆえにまず投球に対して投球後の現在のフレームのみを求め、その後現在のフレームに対するスコアを求めるというようにしたいわけ #ytdd

2011-02-15 00:43:24
Kenichiro Ota @oota_ken

やる夫:bowling.bowl(4); assertEquals(1, bowling.getCurrentFrame()); 1回投げて4ピン倒した状態は1フレーム目にいるお。 #ytdd

2011-02-15 00:44:33
Kenichiro Ota @oota_ken

やらない夫:そうだな。return 1とかで簡単に実装させちゃうのがナイーブなTDDだが。まずはそこから行くか。 #ytdd

2011-02-15 00:45:33
Kenichiro Ota @oota_ken

やる夫:つぎは、 4 5と投げて、この状態もフレーム1にいるお bowling.bowl(4); bowling.bowl(5); assertEquals(1, bowling.getCurrentFrame()); #ytdd

2011-02-15 00:46:22
Kenichiro Ota @oota_ken

やらない夫:ここまではまあフレーム1だけど、その後に 4 5 6とかを作るとこれはフレーム2にいることになる。 #ytdd

2011-02-15 00:47:02
Kenichiro Ota @oota_ken

やる夫:Bolwingクラスに現在のフレームの位置を記憶させる、 private int currentFrame = 0; を作って、これをそのフレームで最初の投球の時に、インクリメントすれば、さっきの三シナリオはいけるお。2投球目ではインクリメントしない。#ytdd

2011-02-15 00:48:55
Kenichiro Ota @oota_ken

やらない夫:となると、まず、今がそのフレームの最初の投球であるかというフラグが必要なんじゃないか?private boolean firstThrow = true; のように。 #ytdd

2011-02-15 00:49:48
Kenichiro Ota @oota_ken

やる夫:そうだお。だから、if (firstThrow) { currentFrame++; }で行けるお! #ytdd

2011-02-15 00:51:53
Kenichiro Ota @oota_ken

やる夫:その後に、if (!firstThrow) { fisrtThrow = true; } else { firstThrow = false; }のように反転させればいいお! #ytdd

2011-02-15 00:52:05
Kenichiro Ota @oota_ken

やらない夫:やる夫全くストライクの場合考えてないだろう・・・このままだとストライクが来た後に、その次のフレームの投球が来ると、それがストライクを出したフレームと同じフレームにいるとみなされてしまうぞ。つまり、#ytdd

2011-02-15 00:53:57
Kenichiro Ota @oota_ken

やる夫:一球目がストライクだった場合、firsttThrowをリセットして次のフレームの最初の投球とみなすようにさっきの if (!firstThrow) { を #ytdd

2011-02-15 00:56:33