ドメイン駆動設計(DDD) どめいんくどうせっけい
DDDドメインモデルユビキタス言語境界付けられたコンテキストエンティティ設計手法
ドメイン駆動設計(DDD)について教えて
簡単に言うとこんな感じ!
「ビジネスの言葉をそのままプログラムに反映しよう」という設計思想だよ! 「注文」「顧客」「在庫」という業務用語をコードの中にも使うことで、システムとビジネスのズレをなくすんだ。発注担当者と開発者が同じ言葉で話せるようにする、橋渡しの設計手法なんだ!
ドメイン駆動設計(DDD)とは
ドメイン駆動設計(Domain-Driven Design:DDD)は、ソフトウェア設計をビジネスの「ドメイン(業務領域)」を中心に行うアプローチです。2003年にエリック・エヴァンス(Eric Evans)が著書「Domain-Driven Design」で体系化しました。
DDDの核心は「ユビキタス言語(Ubiquitous Language)」の概念です。「注文」「商品」「配送」といったビジネス用語を、業務担当者・設計者・開発者が統一して使うことで、仕様の伝達ミスを防ぎます。従来は業務用語とプログラムの変数名が大きく乖離し、仕様書とコードの整合を取るだけで膨大な時間がかかっていました。
発注側の視点では、DDDを実践しているベンダーとは「注文が入ったら在庫を引き当てる」という会話がそのままシステムの言語と一致しているため、要件変更の伝達が格段にスムーズになります。
DDDの主要概念
| 概念 | 内容 |
|---|---|
| ユビキタス言語 | 業務担当者と開発者が使う共通言語。コードにも反映する |
| ドメイン | ソフトウェアが解決しようとしている業務領域 |
| エンティティ | ID(識別子)を持つオブジェクト(例:顧客、注文) |
| 値オブジェクト | IDを持たず値で識別するオブジェクト(例:金額、住所) |
| 集約(Aggregate) | 関連するエンティティをまとめた境界のある塊 |
| ドメインサービス | 特定のオブジェクトに属さないドメインロジック |
| リポジトリ | エンティティの保存・取得を担うオブジェクト |
| 境界付けられたコンテキスト | ユビキタス言語が有効な範囲の境界 |
戦略的設計 vs 戦術的設計
| 区分 | 内容 | 主なパターン |
|---|---|---|
| 戦略的設計 | システム全体の構造・境界の設計 | 境界付けられたコンテキスト、コンテキストマップ |
| 戦術的設計 | 個々のコンポーネントの実装方法 | エンティティ、値オブジェクト、集約、リポジトリ |
歴史と背景
- 2003年 — エリック・エヴァンスが「Domain-Driven Design: Tackling Complexity in the Heart of Software」を出版。DDDの概念が体系化される
- 2004〜2010年代 — Javaエンタープライズ開発者の間でDDDが注目される。Spring Frameworkとの組み合わせで実践例が増加
- 2013年 — Vaughn Vernonが「実装ドメイン駆動設計(IDDD)」を出版。具体的な実装例を提示し普及に貢献
- 2015年頃 — マイクロサービスアーキテクチャとDDDの「境界付けられたコンテキスト」との親和性が認識され、マイクロサービス設計の基礎として活用される
- 2020年代 — Event Storming(ドメインモデリングワークショップ手法)の普及でDDDがより実践しやすく
DDDの境界付けられたコンテキスト
関連する規格・RFC
※ DDDは特定の標準規格ではなく設計思想ですが、以下と深く関連しています。
| 書籍・手法 | 内容 |
|---|---|
| 「Domain-Driven Design」Eric Evans著 | DDDの原典。2003年刊行 |
| 「実装ドメイン駆動設計」Vaughn Vernon著 | DDDの実装ガイド。2013年刊行 |
| Event Storming | ドメインモデルをワークショップで可視化する手法 |
関連用語
- ヘキサゴナルアーキテクチャ — ドメインを中心に置くアーキテクチャパターン
- クリーンアーキテクチャ — ビジネスロジックを外部依存から分離する設計
- マイクロサービス — 境界付けられたコンテキストとマイクロサービスは対応する
- SOLID原則 — DDDの実装基盤となるオブジェクト指向設計原則
- テスト駆動開発(TDD) — DDDと組み合わせることでモデルの品質を高める
- REST API — コンテキスト間の通信に使われる典型的な手段