ドメイン駆動設計(DDD)とは,ビジネス目標を達成する上で,ドメインの専門家と開発者,その他の関係者のコラボレーションを重視したソフトウェア開発アプローチだ – Naresh Bhatia氏は,DDDの基本コンセプトをこのような説明で紹介し,比較的理解が容易と思われる金融取引のドメインから,中程度の複雑性を持ったシステムであるBullsfirstを例として選択した。
Archfirstの創業者でソフトウェアアーキテクトのBhatia氏は,今回の例を説明するにあたり,DDDの基本を学ぶ上で,氏が最も重要であると考えるものを取り上げている。
ドメインにおける共通理解を達成する上で必要不可欠なのが,ユビキタス言語(Ubiquitous Language)である。共通の用語を使うことにより,ドメイン専門家と開発者の議論で誤解の生じるリスクが最小限になると同時に,開発者がドメインの説明において,プログラム的な用語を使用することを回避できる。
コンセプト境界(Bounded Context)は,ビジネス的な視点から,さまざまな問題を個々のコンテキストに分けることによって,巨大なドメインをより小さなものに分割する手法である。ひとつのチームで扱える程度にモデルを小さくするべきだ,とBhatia氏は述べている。
ドメインモデルにおいて最も一般的な概念であるエンティティや値オブジェクト(Value Object)に加えて,氏は,自身が重要と考えるいくつかの概念をまとめている。
- ドメインサービス(Domain Service)は,そのドメインの概念や,場合によってはオブジェクトのグループを対象としたビジネスロジックに関連するものであり,単一のエンティティに包含されない。ステートレスである場合も少なくない。氏が例として紹介したシステムでは,注文を約定して取引を行う,というビジネスロジックを備えたMatchingEngineがこれにあたる。
- ドメインイベント(Domain Event)は,ドメイン内で発生する何らかの重要な事象を表現する。このようなイベントのみを共有することにより,コンポーネントを分離するために使用可能なものだ。
- 集約(Aggregate)は,ユニットとして共同動作する,関連付けられたオブジェクトをグループ化するために用いられる。ひとつのオブジェクトを集約のルートに割り当てて,ユーザはそのメソッドのみを呼び出し可能とすることにより,他のすべてのオブジェクトを効果的に隠蔽できる。集約については以前にも,Vaughn Vemon氏が詳しく説明している。
Bhatia氏が例に挙げたシステムであるBullsfirstは,REST Maturity Level 2準拠のRESTful APIを備えた,証券取引を目的とするオープンプロジェクトで,注文の約定と取引の実行を行う役割のExchangeと,注文を作成するOrder Management Systemで構成されている。使用されている技術はJava,.NET,FIX,メッセージング,Webサービスといったものだ。コードはここからダウンロードできる。