『ドメイン駆動設計』の5つの基本アイデア

エヴァンス氏の『ドメイン駆動設計』の背景にある基本アイデアは何かという私の捉え方のメモ書き。

ドメイン駆動設計にはいろいろな側面がある。また書籍『ドメイン駆動設計』は体系だった設計方法論ではなく、設計の考え方とやり方を経験則として言語化してみた、と捉えている。

その経験則(100%ではないが多くの場合に役に立つ原則)の背景にあるエヴァンス氏の基本的な発想は次の5つに要約できると考えている。

ソフトウェアの複雑さは事業活動の複雑さに起因する

技術的な複雑さもあるが、ソフトウェアが複雑になるのは対象領域の複雑さが主たる理由という考え方。

業務アプリケーションであれば、事業活動の複雑さが業務アプリケーションの複雑さの原因と捉える。

ドメイン駆動設計は、この事業活動の複雑さに起因するソフトウェアの複雑さをうまく扱うための工夫、というのが私の捉え方。

ドメイン駆動設計という設計のアプローチを取り入れるなら、まず第一に対象領域の複雑さに焦点を合わせることが大前提になる。

モデル駆動設計の効果

複雑さに取り組む時の工夫の大きな柱がこれ。 モデルと実装を一致させることで複雑さが扱いやすくなる、という考え方。

エヴァンス氏が「まえがき」で紹介している三つのプロジェクトの例で「精緻なモデルを作ったが実装と乖離(かいり)してうまくいかなった」という経験からモデルと実装を強く結びつけ、モデルとコードを相互に作用させながら設計を改善していくという発想が生まれたのだろう。

ドメインモデルの活用

モデルといっても、プロセスモデルユースケースモデル、データモデル、状態遷移モデルなどいろいろなモデルがある。

ドメイン駆動設計が「モデル駆動設計」で重視しているのは「ドメインモデル」。エヴァンス氏のドメインモデルの解釈はファウラー氏と同じ「オブジェクト指向」のモデルであることが基本になっている。

ユースケースモデルやデータモデルとの一番の違いは、複雑な業務ロジックをどう記述するかを重視する点。

業務ルールに基づく複雑な計算判断ロジックをうまく整理する方法として、トランザクションスクリプトやテーブルモジュールではなくドメインモデルを選択するという考え方。

また、ドメインモデル作りは、開発者が業務知識を取得する手段の一つであり、関係者が同じ言葉(ユビキタス言語)を使って意図を伝えあう語彙の骨格になり、モデルとコードを一致させる道具である、という発想。

深い洞察に向かうリファクタリングの重要性

設計改善の手法としてかなり普及してきたリファクタリングの考え方を、事業活動を深く理解するための手段として活用する、という発想。

リファクタリングの目的として以下の二つを重視する。

  • 暗黙の概念の発見と言語化
  • ソフトウェアの発展性の改善

複雑な事業活動で価値を生み出すソフトウェアの開発は、最初からうまくいくわけではない。表面的かつ断片的な知識を元にした設計から出発して、実際に動くプログラムを記述し、そのコードをリファクタリングをしながら、事業活動の深い理解と、ソフトウェアの構造の改善に継続的に取り組みつづけるという発想。

戦略的な設計への取り組み方

規模が大きなソフトウェアを長期的に成長させていくという課題に対する『ドメイン駆動設計』の考え方とやり方。

  • コードに責任を持つ開発者が全体的・長期的な設計課題に取り組むことの重要性と効果
  • そのために開発の文脈を明確に区切って、全体的・長期的な課題を明確にして扱いやすくする
  • 文脈と文脈の境界で生まれる課題とその対応方法の選択肢の検討
  • クラス粒度ではあつかえない複雑さの扱い方の工夫(レイヤー構造や蒸留)