2012年10月19日金曜日

テスト駆動開発と静的型付け言語

テスト駆動開発という開発手法があって、開発する前にまずテストを書きましょうというものだと理解しているのだけど、強い型付けをする言語とはあまり相性が良くないのではないかという話。

テスト駆動開発だと、最初にテストを書くから、テストされるコードの方は最初は未実装かスタブコードになるんじゃないかと思う。例えば、とりあえずあるメソッドを呼んでみて、未実装だと例外が返る、というような。だけど強く型付けられた言語の場合、未実装な関数を呼んだりすることはもちろんできない。assert falseみたいにスタブコードを書くことはできるけど、これコンパイルは通るのにいざ実行するとクラッシュするという静的型付けの意味をなくしてしまうようなコーディングだと思う。スタブコードを出荷コードにうっかり残してしまうと大変。(コンパイラフラグでassert falseを通さないようにできたかもしれないけど)。(できないみたい)

というわけで、テスト駆動開発を強い型付けを持つ言語(OCamlとかHaskellとか)に持ち込むのはあまり自然でない気がする。こういう言語では、私はまず型を書いてコンパイルが通るか見て、そのあとでテストを書いていく。まあテストし忘れてあーってなることも多いけど。