ドメイン駆動設計

用語解説

定義

ドメイン駆動設計(Domain-Driven Design: DDD)とは、ソフトウェア開発において、対象となる業務領域(ドメイン)の知識をモデル化し、そのモデルをソフトウェアの設計や実装の中心に据える手法である。エリック・エヴァンスによって提唱され、複雑なビジネスロジックを扱うシステム開発において、コードとビジネス概念の乖離を防ぐことを目的とする。

背景

従来の開発手法では、データベースの構造を先行して設計するデータ中心設計や、機能の処理手順を優先する手続き型設計が主流であった。しかし、ビジネス要件が複雑化するにつれ、コードがドメインの意図を反映しなくなり、保守や拡張が困難になる問題が顕在化した。DDDは、開発者とドメインエキスパートが共通の言語を用いることで、この構造的な問題を解決するために考案された。

技術的仕組みと構造

DDDは、戦略的設計と戦術的設計の二層で構成される。戦略的設計では、システムを論理的な境界で分割する「境界づけられたコンテキスト(Bounded Context)」を定義し、各コンテキスト間の関係を「コンテキストマップ」として可視化する。戦術的設計では、以下の構成要素を用いて実装を行う。

  • エンティティ:一意の識別子を持ち、ライフサイクルを通じて状態が変化するオブジェクト。
  • 値オブジェクト:識別子を持たず、属性の集合として定義される不変のオブジェクト。
  • 集約:整合性を維持するための単位であり、境界内のエンティティや値オブジェクトを管理する。
  • リポジトリ:集約の永続化と再構築を担うインターフェース。
  • ドメインサービス:エンティティや値オブジェクトに含めるのが不自然なロジックを記述する場所。

具体例

例えば、ECサイトにおける「注文」という概念を扱う場合、注文IDを持つ「注文エンティティ」を作成し、配送先住所や注文明細といった属性を「値オブジェクト」として定義する。これらを「注文集約」としてまとめ、注文の確定やキャンセルといった整合性が必要な操作をこの集約内で行う。データベースへの保存や読み込みは「注文リポジトリ」を介して実行され、ビジネスロジックはデータベースのテーブル構造に依存せず、ドメインモデルとして独立して記述される。

IT業界における重要性

現代のITシステムはマイクロサービス化が進んでおり、サービス間の境界を明確に定義することが不可欠である。DDDは、境界づけられたコンテキストという概念を通じて、大規模なシステムを疎結合なモジュールに分割する指針を提供する。また、ユビキタス言語(開発者とドメインエキスパートが共有する共通言語)の導入により、要件定義から実装に至るまでのコミュニケーションコストを低減し、ビジネスの変化に追従可能なソフトウェア構造を維持する役割を担っている。

コメント

タイトルとURLをコピーしました