システム開発

ドメイン駆動設計(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の境界付けられたコンテキスト

境界付けられたコンテキストの例(ECサイト) 受注コンテキスト ・注文(Order) ・注文明細(LineItem) ・顧客(Customer) ・割引(Discount) ・合計金額(Amount) 在庫コンテキスト ・商品(Product) ・在庫数(StockQty) ・引当(Reservation) ・倉庫(Warehouse) 配送コンテキスト ・配送(Shipment) ・追跡番号(Tracking) ・配送先(Address) ・配送業者(Carrier) ・配送ステータス ユビキタス言語の重要性 「顧客」という言葉も文脈によって意味が違う → 境界を明確にして誤解を防ぐ

関連する規格・RFC

※ DDDは特定の標準規格ではなく設計思想ですが、以下と深く関連しています。

書籍・手法内容
「Domain-Driven Design」Eric Evans著DDDの原典。2003年刊行
「実装ドメイン駆動設計」Vaughn Vernon著DDDの実装ガイド。2013年刊行
Event Stormingドメインモデルをワークショップで可視化する手法

関連用語