完成形となったテスト駆動開発によるボウリングスコア計算プログラム
2015年3月4日(水)
- [高梨]だいぶすっきりしましたね。
- [古谷]は、はい…… Frameを使うようになって要求事項が増えたので、コードも増えるかなと思っていたのですが、むしろすっきりしたように思います。おそらく、最初からFrameを実装するのは、私には難しかったでしょうね。Frameの組み込みに関してもそうですが、比較的スムーズにいったのは、その前があったからだと思います。
- [高梨]いや、ここまで本当によく頑張りました。最後に、TDDとはちょっと外れますが、せっかくここまで頑張ったので、「Rubyらしい」プログラミングに触れてみましょう。まずはテストですが、bowling_game_test.rb と frame_test.rbの両方を、まとめてテストできるようにしましょう。
- [古谷]えっ、そんなことできるのですか?
- [高梨] ここは僕がやりましょう。rakefile.rbという名前で、複数ファイルのテストを扱うテストクラスを作成します。
- [高梨]どうですか?
- [古谷]これなら、テストクラスがもっと増えても大丈夫ですね!
- [高梨]ついでに@frameとsetupメソッドを使用して、あっちこっちにある「frame = Frame.new」を整理しましょうか。setupメソッドはテストクラスが提供しているメソッドで、各テストメソッドが呼ばれる前に必ず呼ばれます。ここは、古谷さんが実装してみて下さい。
- [古谷]はい。こんな感じですか?
- [高梨]その通りです!次は僕がやりましょう。ストライクとスペアのメソッド抽出です。
- [高梨]どうでしょう?
- [古谷]はい! しかし細かいですね……
- [高梨]次は、例外処理を入れましょう。これも僕が実装します。
ボーリングはどんな時もピン数は0以上かつ10以下、ボーナスを除いて登録できる点数は10点以下ですよね?それ以外の場合は例外処理としなければいけません。 - [古谷]確かに!
- [高梨]入力値をチェックし、範囲外の場合は例外を発生させる処理をrecord_shotに実装しましょう。Rubyではこんな風に実装します。
- [古谷]私、正直Rubyはあまりできませんが、このコードの意味はなんとなく分かります。
- [高梨]次に、Rubyのeachメソッドは汎用性が高く使いやすいのですが、記述が冗長になりがちです。「inject」「select」といったRuby固有のメソッドを使いこなすことで、eachメソッドをなるべく使わずに簡潔なコードを書くことができます。どうですか?
- [古谷]あっ、確かになんかRubyっぽくなりました!
- [高梨]はい、これで大体おちつきましたね。
- [古谷]お、お、終わったー!!!!
- [高梨]とはいえ、10フレーム目の実装はされていませんし、コンソールから点数を入力させたり、本物のスコアのように整形して出力させたり、改善策はどんどん出てきます。
この先は、もう僕がいなくても古谷さんひとりで大丈夫ですね。 - [古谷]そんな、先輩、さみしいです……
でも、お忙しい中こんなに時間を使っていただいて、本当にすみません。 - [高梨]大丈夫です!
それより忘れないでいてほしいのは、このロジックやコードはほとんど古谷さんが考え、実装したということです。DHH(David Heinemeier Hansson、Ruby on Railsの作者)がTDDを「補助輪」と評していましたが、その言葉通りにTDDは初学者である古谷さんのプログラミングを補助して、自信を与えることができました。TDDは、必ずしもどこの現場でももてはやされているわけではありません。でも古谷さんが開発で行き詰った時、TDDを思い出して肩の力を抜いてインクリメンタルに開発を進めることを、誰も止めることはできません。 - [古谷]ありがとうございます。前よりももっとプログラミングを好きになれそうです。
______________________________________
以上、「初学者のためのTDD入門」について、7回の連載でお伝えしてまいりました。ご愛読ありがとうございました。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。