DDD概要

社内の勉強会に備えてのメモ

DDDとは何か?

エリック・エヴァンスがソフトウェアのドメインモデリングと設計についてオブジェクトコミュニティの底流として現れた哲学をドメイン駆動設計と呼称し書籍にまとめた。
DDD(Domain-Driven Design) とはどのように設計していくかという理論、考え方、概念を指している。
具体的な設計・開発方法を指して言って入るわけではないのでわかりづらい点も多々あるかもしれない。

エヴァンス本の参考文献からもDDDは以下の書籍によって支えられて入ることがわかる
 ・XPエクストリープ プログラミング入門
 ・テスト駆動開発入門
 ・アナリシスパターン
 ・実践UML
 ・オブジェクト指向入門
他にもたくさんあって、DDDはこれらの書籍によって支えられている。

DDD(エヴァンス本)の目次

エヴァンス本の目次一覧をまとめてみる

第1部 ドメインモデルを機能させる

 ・第1章 知識をかみくだく
 ・第2章 コミュニケーションと言語の使い方
 ・第3章 モデルと実装を結びつける
第1章では設計者とドメインエキスパートでのコミュニケーションによりどうやって深いモデルを見つけていくかについて書かれている。そのためにもドキュメントを作ったり言葉を統一することによりコミュニケーションを取る方法を提示している。第3章では知識をかみくだいてえたモデルをコーディングに落とし込む手法としてモデル駆動設計に触れている。

第2部 モデル駆動設計の構成要素

 ・第4章 ドメインを隔離する
 ・第5章 ソフトウェアで表現されたモデル
 ・第6章 ドメインオブジェクトのライフサイクル
 ・第7章 言語を使用する:応用例
第2部ではモデルを実装に落とし込むモデル駆動設計について述べている。ドメインの設計をソフトウェアシステムにおけるその他の関心ごとから分離することで設計とモデルとのつながりを明確にする目的がある。そのためにも"第4章ドメインを隔離する"ではUI層、アプリケーション層、ドメイン層、インフラストラクチャ層のレイヤ化アーキテクチャについて説明している。"第5章ソフトウェアで表現されたモデル"ではモデルの実装部分であるドメイン層の構成要素のエンティティ、値オブジェクト、サービスについて説明している。それから2つのモデルを適切に分割(モジュール化)することによるメリットを述べている。"第6章ドメインオブジェクトのライフサイクル"ではエンティティ、値オブジェクトの集約について述べている。例えば自動車のドメインであったら集約ルートが自動車でそれに紐づいてタイヤエンティティ、車輪エンティティ、位置値オブジェクトが存在する。集約全体のオブジェクト精製方法についてファクトリパターンの説明がある。集約のルートがオブジェクトの永続化と永続化されたオブジェクトの検索に使用するリポジトリにも触れている。

第2部は実装寄りの話でここを理解できていればDDDっぽい実装ができるようになりそう。

第3部 より深い洞察へ向かうリファクタリング

 ・第8章 ブレイクスルー
 ・第9章 暗黙的な概念を明示する
 ・第10章 しなやかな設計
 ・第11章 アナリシスパターンを適用する
 ・第12章 デザインパターンをモデルに関係づける
 ・第13章 より深い洞察へ向かうリファクタリング
第2部ではモデルを実装を一致させる基礎の方法を学び、第3部ではドメインについてさらに深いモデルを開発するために必要不可欠となるリファクタリングを学ぶ。"第8章ブレイクスルー"は最初に思い描いたモデルで開発を進めた後、モデル自体は悪くなさそうであっても不具合が生じることがあって、そういうのは普段からの小さいリファクタリングによりモデルを明確化することである時問題が明確化して解決の糸口になるという話。"第9章暗黙的な概念を明示的にする"ではブレイクスルーを引き起こすための日々のリファクタリングとしてそれまで気づいていなか明白でない概念を見つける方法について書いている。"第10章しなやかな設計"では変更に強いしなやか設計はどうすれば行えるかについて書いてある。第11章と第12章ではアナリシスパターンデザインパターンの利用方法について書いてある。"第13章より深い洞察へ向かうリファクタリング"ではどこからリファクタリングを始めるかについて書いてある。

第4部 戦略的設計

 ・第14章 モデルの生合成を維持する
 ・第15章 蒸留
 ・第16章 大規模な構造
 ・第17章 戦略をまとめ上げる
第4部ではモデルの生合成を維持していくための戦略的設計について述べている。"第14章モデルの生合成を維持する"では、コンテキストマップを描きコンテキストを境界づけておき、コンテキスト間の関係を明示的にしておく。"第15章蒸留"ではコンテキストマップを描いてコンテキスト間を境界づける際に各ドメインの役割となるコアドメインや汎用サブドメインなどの種類を学ぶ。"第16章大規模な構造"では巨大なシステムに包括的な原則を持たせることで設計全体にまたがるパターンにおいてどのような役割を果たすかという観点を分かりやすくする方法を学ぶ。

全17章でソフトウェアの上流部分からリファクタリング、成長までをまとめた長編になって入るのがわかる。DDD自体は具体的な実装についてあまり触れられていないので、実装にどう活かすかを学びたいのであれば実践ドメイン駆動設計を読んだり、サンプルのプロジェクトを調べるのが良さそう