ドメイン駆動設計(Domain Driven Design)通称DDDについてのまとめです(੭ु ´・ω・)੭ु⁾⁾
まとめはこれからどんどん完成してきます・・・
ドメイン駆動設計とは?
2004年にEric Evansにより出版されたデザインパターン本 “Domain-Driven Design: Tackling Complexity in the Heart of Software” に書かれている43のパターン、およびその背後にある設計思想のことを指します。
Domain-Driven Design: Tackling Complexity in the Heart of Software
- 著者Eric Evans
- 参考価格¥ 8,610
価格¥ 8,335(2017/11/19 21:06時点) - 出版日2003/08/22
- 商品ランキング39,192位
- ハードカバー560ページ
- ISBN-100321125215
- ISBN-139780321125217
- 出版社Addison-Wesley Professional
これが大変に評価の高い本で、邦訳が長らく待たれましたが、ようやく2011年に「エリック・エヴァンスのドメイン駆動設計」というタイトルで出版されました。
エリック・エヴァンスのドメイン駆動設計
- 著者Eric Evans
- 出版日2011/04/08
- 商品ランキング13,343位
- Kindle版665ページ
- 出版社翔泳社
このドメイン駆動設計ですが、技術者の間ではしばしばDDDと呼ばれます。
これらのパターンのうち必要なものを状況に応じて適用することによって、オブジェクト指向が本来持っている、再利用性や保守性といった利点を最大限に生かすことができます(`・ω・´)
前提となる知識
DDDはオブジェクト指向デザインパターンの本ですので、オブジェクト指向設計における一定の経験と知識は必須となります(デザインパターンについての知識は必須ではありません)。
リレーショナルデータベースを備えたエンタープライズWebアプリケーションを前提としているので、サーバーアプリケーション設計・開発の経験があると理解がスムーズです。
アーキテクト向けの本ですので、UMLのクラス図やシーケンス図、あるいはER図といった図が頻繁に出てきます。すべての記法を暗記する必要はありませんが、継承の矢印の向きや、1:N関係の表し方など、基本的な記法はおさえておきましょう。
43のパターン一覧
各パターンの詳細は今後すこしずつ書き足されます…φ(.. *)
ドメインモデルを機能させる
これら3つのパターンは空気のようなものです。Eric EvansのDDDを実践して身につけていく過程で、特にパターンを運用しているという自覚のないまま、無意識に行われるようになります。
用語としてよく使われるのはユビキタス言語です。
モデル駆動設計については、「モデル駆動(Model-Driven)」というと別のものを連想させてしまうため、Eric EvansのDDDにおけるモデル駆動設計パターンを狭義に「ドメイン駆動設計」と呼ぶこともしばしばです。
- ユビキタス言語(Ubiquitous Language)
- モデル駆動設計(Moodel-Driven Design)
- 実践的モデラ(Hands On Modelers)
モデル駆動設計の構成要素
以下のパターンはDDDの基本的な構成要素ですから、すべてのパターンを記憶しておかなければなりません。ただし、これらのパターンが意味するところを正確に把握するためには多少の経験が求められます。
これらの用語はしばしば、原書と同じ英語(スマートUI、バリューオブジェクト、アグリゲート)で呼ばれます。特に「利口なUI」に関しては、通常は日本語訳ではなく、原書と同じSmart UIという言葉を使うのが一般的です。
スマートUIだけはこの本の中で唯一「やってはいけない」アンチパターンに分類されるので注意しましょう・・・。
- レイヤ化アーキテクチャ(Layered Architecture)
- 利口なUI「アンチパターン」(Smart UI Anti-Pattern)
- エンティティ (Entities)
- 値オブジェクト (Value Objects)
- サービス (Services)
- モジュール (Modules)
- 集約 (Aggregates)
- ファクトリ (Factories)
- リポジトリ (Repository)
より深い洞察へ向かうリファクタリング
これらのパターンのうち多くはEric EvansのDDDに固有のものではありません。例えば、StrategyやCompositeは、私たちがすでによく知っているGang of Fourのデザインパターンと同一のものです。
Eric EvansのDDDを実践するにあたって、特に本質的な内容ではありません。しかしながら、モデル駆動設計を行った際に、それが果たしてエンティティなのか、値オブジェクトなのか、迷ってしまうような対象があるのも事実です。
それらを本来あるべき場所にあるべき状態で置くためのガイドラインあるいは応用例として、これらのパターンは有用です。
- 仕様 (Specification)
- 意図の明確なインタフェース (Intention-Revealing Interfaces)
- 副作用のない関数 (Side-Effect-Free-Function)
- 表明 (Assertions)
- 概念の輪郭 (Conceptual Contours)
- 独立したクラス (Standalone Classes)
- 閉じた操作 (Closure Of Operations)
- ストラテジー (Strategy)
- コンポジット (Composite)
戦略的設計
ソフトウェアの規模が大きくなるにつれて、「たった1つのモデルを一貫して使い、それを維持する」ことは現実的ではなくなります。
ひとつのソフトウェアの中に複数のモデルが内包されていることはめずらしくありません。それらのモデルどうしの関係もまた、設計の重要な要素です。
このうち境界付けられたコンテキストと腐敗防止層は設計用語として特に広く使われていますので、その意味を理解しておく必要があります。
- 境界付けられたコンテキスト (Bounded Context)
- 継続的な統合 (Continuous Integration)
- コンテキストマップ (Context Map)
- 共有カーネル (Shared Kernel)
- 顧客/供給者の開発チーム (Customer/Supplier Development Teams)
- 順応者 (Conformist)
- 腐敗防止層 (Anticorruption Layer)
- 別々の道 (Separate Ways)
- 公開ホストサービス (Open Host Service)
- 公表された言語 (Published Language)
- コアドメイン (Core Domain)
- 汎用サブドメイン (Generic Subdomains)
- ドメインビジョン声明文 (Domain Vision Statement)
- 強調されたコア (Highlighted Core)
- 凝集されたメカニズム (Cohesive Mechanisms)
- 隔離されたコア (Segregated Core)
- 抽象化されたコア (Abstract Core)
- 進化する秩序 (Evolving Order)
- システムのメタファ (System Metaphor)
- 責務のレイヤ (Responsibility Layers)
- 知識レベル (Knowledge Level)
- 着脱可能コンポーネントのフレームワーク (Pluggable Component Framework)