DDD の戦術的設計パターンに基づくドメインモデル設計を支援。エンティティ、値オブジェクト、集約、ドメインサービスの設計。「ドメインモデルを設計したい」「DDD で設計したい」「集約を定義したい」「エンティティと値オブジェクトを識別したい」「ユビキタス言語を整理したい」といった場面で発動する。ドメインモデルを先に設計することで、業務ロジックが実装コードに正しく反映される。
DDD(ドメイン駆動設計)の戦術的設計パターンに基づき、エンティティ・値オブジェクト・集約・ドメインサービスを設計する。
ドメインモデルの価値は、業務の専門家と開発者が同じ言葉(ユビキタス言語)で会話できるようになること。モデルとコードが一致することで、「仕様と実装の乖離」という根本的な問題を解消する。
| 種類 | パス | 備考 |
|---|---|---|
| ガイド | @docs/reference/ドメインモデル設計ガイド.md | ドメインモデル設計の進め方詳細 |
| テンプレート | @docs/template/設計.md | 編集禁止。コピーして使用する |
| 入力 | @docs/requirements/requirements_definition.md | 要件定義 |
| 入力 | @docs/requirements/business_usecase.md | ビジネスユースケース |
| 入力 | @docs/requirements/system_usecase.md | システムユースケース |
| 入力 | @docs/requirements/user_story.md | ユーザーストーリー |
| 入力 | @docs/design/architecture_backend.md | バックエンドアーキテクチャ |
| 入力 | @docs/design/architecture_frontend.md |
| フロントエンドアーキテクチャ |
| 成果物 | docs/design/domain-model.md | ドメインモデル設計 |
ライフサイクルを持ち、識別子で区別されるドメインオブジェクトを識別する。「同じ属性値でも別のものとして扱う必要がある」ものがエンティティ。
不変で識別子を持たないドメインオブジェクトを識別する。「属性値が同じなら同じもの」として扱えるものが値オブジェクト。プリミティブ型の代わりに値オブジェクトを使うことで、バリデーションとドメイン知識をカプセル化する。
トランザクション整合性の境界を定義する。集約が大きすぎると競合が発生し、小さすぎると整合性が保てない。適切な境界の見極めが最も重要。
エンティティにも値オブジェクトにも属さないビジネスロジックを識別する。ドメインサービスは動詞で命名し、ステートレスに保て。
PlantUML を使用してクラス図・オブジェクト図を作成する。図はコードと同様にバージョン管理し、設計の変更を追跡可能にせよ。
コンテキストの戦略的分類には Mermaid.js の Quadrant Chart を使用する。
quadrantChart
title 差別化の度合いと業務ロジックの複雑さによる業務領域の分類
x-axis "低い差別化" --> "高い差別化"
y-axis "低い複雑さ" --> "高い複雑さ"
quadrant-1 "中核"
quadrant-2 "一般"
quadrant-3 "一般または補完"
quadrant-4 "補完"
Booking Context: [0.75, 0.82]
Tracking Context: [0.82, 0.68]
Routing Context: [0.62, 0.60]
Handling Context: [0.28, 0.42]
Shipper Context: [0.65, 0.28]
Billing Context: [0.30, 0.65]
Shared Domain: [0.18, 0.22]
docs/design/domain-model.md として出力する既存の docs/design/domain-model.md がある場合は、まずその内容を確認する。不足しているドメインオブジェクトや集約境界の見直しが必要な部分のみを修正する。
Example:
ユーザー: 「エンティティは識別した。集約の境界を決めたい」
回答: 既存の domain-model.md のエンティティ一覧を確認し、
トランザクション整合性が必要な範囲を分析して集約境界を定義する。
集約ルートを決定し、不変条件を明記する。
orchestrating-analysis — 分析フェーズ全体のワークフロー案内analyzing-architecture — 前段のアーキテクチャ設計analyzing-data-model — 並行して進めるデータモデル設計analyzing-usecases — 入力となるユースケース・ユーザーストーリー