ドメイン駆動設計をざっくり把握したい②
前回の続き。
DDDの戦術的設計をざっくりまとめる。
戦術的設計
レイヤ化アーキテクチャ
アーキテクチャパターンの一つで、下位層から順番にインフラストラクチャ層、ドメイン層、アプリケーション層、UI層に分離される。
原則として下位層にしか依存してはいけない。
- ユーザインタフェース層
- 顧客への情報表示や、顧客のコマンドを解釈する責務
- アプリケーション層
- ドメイン層
- ソフトウェアの価値を生み出すビジネスロジックを表現する責務
- インフラストラクチャ層
- 上位層を支える一般的な技術機能(永続化やメッセージング)を提供する責務
依存関係逆転の原則(DIP)
「上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも抽象に依存すべきである。
抽象は、実装の詳細に依存すべきではない。実装の詳細が、抽象に依存すべきである。」
- DDDにおけるDIP
インフラストラクチャ層のコンポーネントは、ドメイン層が定義するインターフェースに依存するべきである。
具体的には、インターフェースIRepository
をドメイン層に実装し、具象暮らすRepository
をインフラストラクチャ層に実装する。
エンティティ
一意なモノを表現する概念のことで、実装時は一意に特定するポイントとなる属性や振る舞いだけに注目することが重要。
ビジネスロジックを内包した一般的なクラス群の呼称、getterとsetterしかないドメインモデル貧血症というアンチパターンに注意する。
ドメインサービス
とあるドメインにおいてのサービスは、そのドメインに特化したタスクをこなす、ステートレスな操作のこと。
集約
集約とは、エンティティのまとまりを表し、整合性を保ちながらデータを更新する単位のこと。
責務は、エンティティ群の生成/読み込み/変更/保存等のライフサイクル管理。
ファクトリ
ファクトリとは、集約を生成する責務をもつ概念のこと。
特定の集約にて、別のエンティティ(集約も含む)を生成することが多い。
リポジトリ
リポジトリとは、エンティティから構成される集約の保存と取得の責務をもつ概念のこと。
依存関係逆転の原則
の説明にあるように、リポジトリのインターフェースは、集約と同じドメイン層のパッケージに配置。
リポジトリの具象クラスはインフラストラクチャ層に配置する。
アプリケーション
ここでいうアプリケーションとは、
ドメインモデル、ユーザーインターフェース、アプリケーションサービス、インフラストラクチャのコンポーネント全体を指す。
ユーザーインターフェース
JavaのSpringや.NETのASP.NETなどのWAFがこの層に属する。
ドメインモデルのユーザーインターフェースへのレンダリングは、DTOを用いることが多い(当然他の方法もある)。
アプリケーションサービスが集約インスタンスを取得し、それをDTOにレンダリングする。
ドメインモデルに依存するかどうかはケースバイケース。
アプリケーションサービス
アプリケーションサービスとは、ドメインモデルの調整を行う責務をもつコンポーネント。
ユーザーインターフェースとドメインモデルの橋渡し役となるので、それぞれの層の依存関係を調整するのが大切。
インフラストラクチャ
インフラストラクチャは、アプリケーション全体の技術的機能を提供する責務をもつ。
DIPをい、アプリケーション内のあらゆるクライアントは抽象に依存するようにし疎結合化を図る。