オルタナティブ・ブログ > An Agile Way >

アジャイルに行こう!

Haskell で Bowling Score

»

ボーリングのスコアを計算するプログラムを設計、実装、テストせよ。

この問題は、Robert C. Martin の『アジャイルの奥義』の中でも、TDD(テスト駆動開発)的なアプローチがしばしば直感とは異なったクラス設計に行き着くことを示す例としても取り上げられている。

また、実はJUDEチームの定番の教育練習問題となっていて、新メンバーが来ると必ずこの問題を解き、良い設計とは何か、という議論をすることになっている。受け入れテストのみを示して、それを通るコードを書いてもらう。

ぼくは、この問題の回答として、かなり普通のクラス構造と名前(たとえば、FrameとかGameとか)が現れくるオブジェクト指向的な設計構造を含んだものを好む。特に第10フレームの扱い(他のFrameとの汎化関係)や、GameとFrameの集約関係に目が行く。もう1つのポイントは、ボーリングのスコア計算ルール(スペアやストライクの時の次フレーム以降のスコアを含む計算)が、コードの中で見やすく表現されているか、という点。if/else が3段を超え、30行以上におよぶプログラムを良しとせず、それをうまく自然な構造と名前群の中に(ポリモフィズム等を使って)封じ込められないか、と考える。実際、自然なクラス構造を作ると、この計算ルールはとてもシンプルにコーディングできる。

ところで、今日発見した、Haskellの例は、大分様相が違う。Haskellのパターンマッチングを利用して、かなり簡便にこの「スコア計算ルール」を、そのまま表現できている、と感じる。言語には得意・不得意があることを改めて感じる瞬間である。

Ron Jeffries の記事:『Haskell Bowling』
http://xprogramming.com/xpmag/dbcHaskellBowling.htm

Comment(1)