DDD(ドメイン駆動設計: Domain Driven Design)とは、ビジネスドメイン、つまりソフトウェアが対応しようとする専門分野やアプリケーションを理解することの重要性を強調するソフトウェア開発のアプローチです。
ドメイン(領域)とは、アプリケーションを構築するための知識や活動の範囲のことです。例えば、図書館のためのソフトウェアシステムを構築する場合、「ドメイン」には、本、著者、ローン、借り手などの概念が含まれます。
DDDでは、ビジネスドメインの知識と活動を表す概念の集合であるドメインモデルに焦点を当てます。ドメインモデルを使用してソフトウェアを作成し、その目標は、ソフトウェアが表現するビジネスの現実に可能な限り近づけることです。
ドメインモデルを中心に構成され、チームのすべての活動をソフトウェアに結びつけるために、チームメンバー全員が使用する言語です。図書館の例では、「本」、「著者」、「ローン」、「借り手」がこのユビキタス言語の一部となります。
DDDは、異なるグループが異なるドメインのモデルを持っていることを認識します(例えば、図書館の司書の視点と借り手の視点からの図書館の見方など)。境界付きコンテキストは、あるモデルが適用されるコンテキストを定義します。
これらは、モデルの主要な構成要素です。エンティティは特定の本のような明確なアイデンティティを持つオブジェクト、バリューオブジェクトは著者の名前のようなその属性によってのみ定義されるオブジェクト、サービスはドメインが実行する操作で、エンティティやバリューオブジェクトに自然に属さないものをいいます。
リポジトリはドメインオブジェクトを取得するための方法を提供し、ファクトリーは複雑なドメインオブジェクトを作成するために使用されます。
ドメインオブジェクトを1つのユニットとして扱うことができるクラスタです。
例えば、オンライン書店を考えてみましょう。このドメインには、本、著者、顧客、ショッピングカート、注文などの概念が含まれます。ユビキタス言語には、「カートに入れる」「注文する」「本を閲覧する」などの用語が含まれるでしょう。ソフトウェアチームは、ドメインエキスパート(書店や電子商取引に詳しい人々)と緊密に連携し、開発するソフトウェアがこれらの概念や活動を正確に表現できるようにします。その結果、ユーザーの真のニーズに応え、メンテナンスと拡張が容易なソフトウェアが完成するのです。