■
RSpecを使ってみるついでにOverviewを日本語訳してみる。
http://rspec.rubyforge.org/tutorials/index.html
シンプルなスタック
David ChelimskyによるシンプルなチュートリアルこのチュートリアルではRSpecを用いた振る舞い駆動開発(BDD)の開発過程を見ていきます。開発者にとってのゴールはテストするよりも振る舞いの例を記述することを考えるようになることです。その意味と、システム・コンポーネントの仕様策定プロセスに与える影響を検討します。
一例を挙げましょう。私がTDD(テスト駆動開発)を教えるときには例としてスタックを使います。典型的なテストはこのようになるでしょう・・・
#NOT A BDD EXAMPLE
def test_new_stack_should_be_empty
stack = Stack.new
assert_equal(0, stack.size)
end出発地点としては「と・て・も」シンプルです。なぜか?このテストをパスするにはほとんどコードを書く必要がありません・・・
class Stack
def size
0
end
endそしてテストを走らせます。さてここで問題。SIZEが表してる振る舞いってなぁに?スタックが正しく答えていますが、それならば問題は「何が訊かれている?」ということになるのではないでしょうか。
このように考えてみましょう・・・「サイズ」とは本当に問題なのでしょうか?知りたいことなのでしょうか?スタックの使用者にとってはおそらく「ノー」です。ほとんどの使用者はスタックにプッシュ/ポップをできるかどうかを気にするのではないでしょうか?しかし、スタック内のアイテム数が0個か1000個かを知ることだけが使用者を助ける方法なのでしょうか?もっと必要なこと、もっと使われるものがあるのではないでしょうか?
例を挙げましょう。スタックにプッシュしたいが、その前にまずプッシュできるのかをチェックしようとおもうなら・・・stack.push item if stack.size < stack.capacity
しかしもしも、スタックがいっぱいになっていないかを調べたいとしたら・・・
stack.push item unless stack.full?
このほうが使用者にとって役に立つでしょう。これがポイント。考えるべきなのは使用者がオブジェクトを使えるようにすることであってオブジェクトが使用者のニーズを満たせるかどうかではないのです。
「伝えよ、たずねるのではなく」というのは強力なガイドラインです。しかし・・・どうしても訊かなければならないことがあるならば、「伝えよ、たずねるのではなく」に付け加えて「〜しかし尋ねなければならないならば、本当に必要なことを尋ねよ」としましょう。本当にスタックのサイズを知ることが必要ですか?その答えは多分「ノー」です。なぜなら、本当に知りたいこととは、「スタックに空きがあるかどうか」であって「スタックのサイズ」ではないからです。