初学者のためのTDD(テスト駆動開発)入門 7

完成形となったテスト駆動開発によるボウリングスコア計算プログラム(3ページ目)

  1. [高梨]だいぶすっきりしましたね。
  2. [古谷]は、はい…… Frameを使うようになって要求事項が増えたので、コードも増えるかなと思っていたのですが、むしろすっきりしたように思います。おそらく、最初からFrameを実装するのは、私には難しかったでしょうね。Frameの組み込みに関してもそうですが、比較的スムーズにいったのは、その前があったからだと思います。
  3. [高梨]いや、ここまで本当によく頑張りました。最後に、TDDとはちょっと外れますが、せっかくここまで頑張ったので、「Rubyらしい」プログラミングに触れてみましょう。まずはテストですが、bowling_game_test.rb と frame_test.rbの両方を、まとめてテストできるようにしましょう。
  4. [古谷]えっ、そんなことできるのですか?
  5. [高梨] ここは僕がやりましょう。rakefile.rbという名前で、複数ファイルのテストを扱うテストクラスを作成します。
複数のテストをまとめて実行する

図15:複数のテストをまとめて実行する(クリックで拡大)

  1. [高梨]どうですか?
  2. [古谷]これなら、テストクラスがもっと増えても大丈夫ですね!
  3. [高梨]ついでに@frameとsetupメソッドを使用して、あっちこっちにある「frame = Frame.new」を整理しましょうか。setupメソッドはテストクラスが提供しているメソッドで、各テストメソッドが呼ばれる前に必ず呼ばれます。ここは、古谷さんが実装してみて下さい。
  4. [古谷]はい。こんな感じですか?
setupメソッドで、テストもリファクタリングする

図16:setupメソッドで、テストもリファクタリングする(クリックで拡大)

  1. [高梨]その通りです!次は僕がやりましょう。ストライクとスペアのメソッド抽出です。
ストライク、スペアの処理をもメソッドとして抽出してリファクタリング

図17:ストライク、スペアの処理をもメソッドとして抽出してリファクタリング(クリックで拡大)

  1. [高梨]どうでしょう?
  2. [古谷]はい! しかし細かいですね……
  3. [高梨]次は、例外処理を入れましょう。これも僕が実装します。
    ボーリングはどんな時もピン数は0以上かつ10以下、ボーナスを除いて登録できる点数は10点以下ですよね?それ以外の場合は例外処理としなければいけません。
  4. [古谷]確かに!
  5. [高梨]入力値をチェックし、範囲外の場合は例外を発生させる処理をrecord_shotに実装しましょう。Rubyではこんな風に実装します。
入力値をチェックする

図18:入力値をチェックする(クリックで拡大)

  1. [古谷]私、正直Rubyはあまりできませんが、このコードの意味はなんとなく分かります。
  2. [高梨]次に、Rubyのeachメソッドは汎用性が高く使いやすいのですが、記述が冗長になりがちです。「inject」「select」といったRuby固有のメソッドを使いこなすことで、eachメソッドをなるべく使わずに簡潔なコードを書くことができます。どうですか?
inject、selectメソッドを用いて、Rubyらしいコードに

図19:inject、selectメソッドを用いて、Rubyらしいコードに(クリックで拡大)

  1. [古谷]あっ、確かになんかRubyっぽくなりました!
  2. [高梨]はい、これで大体おちつきましたね。
ついに完成! 最終形のコード

図20:ついに完成! 最終形のコード(クリックで拡大)

  1. [古谷]お、お、終わったー!!!!
  2. [高梨]とはいえ、10フレーム目の実装はされていませんし、コンソールから点数を入力させたり、本物のスコアのように整形して出力させたり、改善策はどんどん出てきます。
    この先は、もう僕がいなくても古谷さんひとりで大丈夫ですね。
  3. [古谷]そんな、先輩、さみしいです……
    でも、お忙しい中こんなに時間を使っていただいて、本当にすみません。
  4. [高梨]大丈夫です!
    それより忘れないでいてほしいのは、このロジックやコードはほとんど古谷さんが考え、実装したということです。DHH(David Heinemeier Hansson、Ruby on Railsの作者)がTDDを「補助輪」と評していましたが、その言葉通りにTDDは初学者である古谷さんのプログラミングを補助して、自信を与えることができました。TDDは、必ずしもどこの現場でももてはやされているわけではありません。でも古谷さんが開発で行き詰った時、TDDを思い出して肩の力を抜いてインクリメンタルに開発を進めることを、誰も止めることはできません。
  5. [古谷]ありがとうございます。前よりももっとプログラミングを好きになれそうです。

______________________________________

以上、「初学者のためのTDD入門」について、7回の連載でお伝えしてまいりました。ご愛読ありがとうございました。

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る