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

2015年3月4日(水)
吉谷 愛
  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回の連載でお伝えしてまいりました。ご愛読ありがとうございました。

フロイデ株式会社 代表取締役

「最新のアーキテクチャを追及し続ける技術者集団」を目指す、フロイデ株式会社代表取締役社長。現在は、自身のCOBOLからRailsまでの非常に幅広い開発経験や、学生や未経験社員への技術指導経験を糧に、技術講師としてソフトウエアエンジニアの育成に注力している。2013年06月より、初心者向けの「はじめようRuby on Rails開発!」シリーズを考案。“技術者の立場にたった、技術者の心に火をつける”熱い講義をモットーとしている。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています