BDDとDDD - Dan North

この記事はDan North氏が、QCon London 2009において行った発表"BDD and DDD"のスライドを、氏の許可を得て翻訳したものです。



ドメイン駆動デザインとは何か?

  • ドメインにフォーカスを当て、そのドメインがソフトウェアに大きな影響を与えるようにしむけること。」-Jimmy Nilsson (ADDDP)

「コア・ドメイン」を識別する

  • 「コア・ドメイン」とは、ステークホルダが最も重要だと考えるもの
  • 輸送会社は品物を移動させる。この会社のコア・ドメインは何だろうか?
    • 手配
    • 経路指定
    • 品物がどこにあるかを把握すること
  • コア・ドメインは最も有益な会話がどの部分にあるのかを教えてくれる
    • ・・・つまり、知識の咀嚼("knowledge crunching")を行う上で、最も豊かな縫い目("seams")が何かということを教えてくれる

共通理解を発展させる

  • ドメインをステークホルダと共にモデリングする
  • 共有された理解を構築する。
    • ・・・それが、言語の共有へとつながっていく
  • この共有された言語をあらゆる所で使う
  • ユビキタス・ランゲージ("Ubiquitous Language")を発展させよう

戦略的DDD

  • どうすれば、ドメイン駆動デザインをスケールさせることができるのか?
    • 複数のチームがある場合には?
    • 複数のシステムの中の一部である場合には?
  • ユビキタス・ランゲージはそれほどユビキタスではない
  • これは境界の限られたコンテキスト("Bounded Context")でしか有効ではない

ふるまい駆動開発とは何か?

  • 「ステークホルダの視点から見たアプリケーションのふるまいに焦点を当てたもの」 - 私 (^^)

アウトサイド・インの開発

  • 要件をストーリーとして表現する

ストーリー28:患者情報の詳細を参照する
最も適したガスを選択するために
麻酔医は
患者の手術歴を参照したい

完了についての合意

  • 受入基準を複数のステップからなるストーリーとして定義する

シナリオ:履歴がある患者
Given: ファイル上にその患者の情報があって
And: その患者が過去に手術を受けたことがあることを前提に
When: 患者の手術歴を要求した場合
Then: 過去の処置を全て見ることができる

シナリオの自動化

  • シナリオの各ステップが実行可能なコードになる
In Ruby:
Given “we have a patient on file” do 
# ... 
end
In Java: 
@Given(“we have a patient on file”) 
public void createPatientOnFile() { 
// ... 
} 

実装のためのコード例

  • TDDとしても知られている
  • 分かっているものを使って、端から始める
  • 最も外側のオブジェクトとサービスを実装する
  • 内部で協力して動作するものを発見し、差し当たりMock化しておく
  • 終わるまで繰り返す

すべてを統合する

  • 具体例が単体テストになる
    • ドキュメントにもなる
  • シナリオが受入テストになる
  • 受入テストが回帰テストになる

要約

  • DDDとは
    • ドメインについての共有されたモデルを発展させる
    • ドメインモデルによってデザインを導く
  • BDDとは
    • 「完了("Done")」に関する理解を共有する
    • 外側から作業を始め、内側へと向かう

ドメインモデルって何だったっけ?

  • ステークホルダーのメンタルモデル
    • 「地図は領土ではない。」
  • そうだった!
  • そうすると、ステークホルダとは?

ステークホルダとはアプリケーションを気にかける人全て

  • アプリケーションのコストについて
  • アプリケーションが何をしてくれるかについて
  • セキュリティが大丈夫かどうかについて
  • ネットワークを破壊しないかどうかについて
  • コンプライアンスについて
  • デプロイと診断が簡単かどうかについて
  • コードとアーキテクチャがきれいかどうかについて
    • 変更が容易かどうかについて

ステークホルダはたくさんいる

  • だから多くのドメインがあり、
  • かれらはそれぞれが自分たちの言語で語り
  • 皆が同時に話す
  • それってデスマーチの方程式じゃないの?

実際、いつも起こっていること

  • 患者のレコードを検索したい
  • だから、こういうクラスを定義することになる
    • class HibernatePatientRecordRepository {
    • IDEドメイン固有のフォントを制御できたらどうだろう?

それではDDDはどうBDDと関連するか?

  • DDDとは、ステークホルダが用いているドメイン・モデルをどう調査するかに関するもの
    • そして問題をそのドメインにおいて表現するもの
  • BDDとは、ソフトウェアを作るためにユビキタス・ランゲージを用いて行う会話に関するもの
  • これはイテレーティブなもの
    • 異なる種類の会話を通じて、ドメインモデルが現れてくる

言葉を変えれば、DDDはBDDを可能にする

  • ドメインがデザインを導く
  • ふるまいが何を開発するかということを導く
    • だからふるまい駆動開発
  • BDDは、DDDを行うために必要な会話を構築する助けとなる

何か質問は?