3.3. コードの前にまずサンプル (スペック) から

一連の手法を進めていくと、次のようなことが頭に浮かぶようになります。 もし私たちが作成したサンプル/テストがそんなにすばらしいドキュメント だというのなら、もしそれがクラスやアプリケーションの振る舞いをきちんと説明しており 繰り返し実行可能なものなのだとしたら、 設計ドキュメントを書くかわりにまずサンプルを最初に書くようにして、 それをもとにコードを実装していくという方法はどうでしょう?

これはまさに、テスト駆動開発 における悪名高い "テストファースト! テストファースト!" と同じことです。PHPSpec は振舞駆動開発用のフレームワークなので、 ここではその代わりに "スペックファースト! スペックファースト!" と叫ぶことにします。

3.3.1. なぜ先にサンプルから書き始めるの?

サンプルから先に書き始める理由は、ごく単純なものです。

まずはじめに、自分たちが直面している問題を把握することで これからやるべきことをはっきりさせるという効果があります。 スペックやテストを書かず、 堅いことを考えずにさっさとコーディングを始めようとしてしまい、 結局方向性を見失ってしまう。 誰でも一度はそんな経験があるはずです! 一方、サンプルを書くということは、 まず最初に公開 API をどのようにするかを検討しなければならないということを意味します。 また各部品間のロジックの流れや出力内容、実装に必要なロジックなども検討することになります。

もうひとつの効用は、 すこしずつ一歩一歩進めていくことでよりよいコードを書けるということです。 「仕様を考えてサンプルを書き、それを満たすコードを実装し、 リファクタリングし、そしてまた最初に戻る」 という一連の流れを細かく繰り返すことで、 よりよい設計のコードができあがるようになります。 その結果できあがったコードは保守しやすいものとなり、 またシンプルですっきりしたものとなるでしょう。 一般に、そのようなコードのほうがバグも少なくなります。

それ以外にもさまざまな利点がありますが、 中でも最大の利点は確信を持てるようになるということでしょう 。 自分の設計、コードの品質、プログラマとしてのスキルなどに自信が持てるようになり、 コードを変更する際にも怖がることはなくなります。 また、ソースコードがきちんと設計されていてテストが行われているということに対する 他のプログラマやユーザからの信頼も得られます。

3.3.2. PHPSpec を使用した BDD の流れ

普段のコーディング作業に BDD を適用する手順をまとめます。 サンプルを書いたらまず一度それを実行し、失敗することを確認するようにしましょう。 あとは、そのサンプルが成功するようになるまで実装を行います。

  1. 実装したい振る舞いを特定する

  2. それを "it should ... (... でなければならない)" 形式の普通の文章 (仕様) にまとめる

  3. その仕様の中の "it should" 部分に対応するスペック/ サンプルを書く

  4. そのスペックが定義している振る舞いを実装する

  5. 必要に応じて実装コードをリファクタリングする

  6. 1 に戻る

後で振舞駆動開発について説明するときに、 これらについてより詳しく取り上げます。 これは、TDD における「テストを書いて、コードを書いて、 そしてリファクタリングする」という手順に似ていますが、 BDD ではそれだけでなく ドキュメント/仕様 という観点も重視しています。本書では、テスト手法については特に取り上げません (作成したスペックがテストとしても有効であるというのは偶然の産物であり、 BDD の真の目的はよりよい設計を目指すということです)。