ドメイン駆動設計

ドメイン駆動設計（ドメインくどうせっけい、英語: domain-driven design、DDD）とは、ドメインの専門家からの入力に従ってドメインに一致するようにソフトウェアをモデル化することに焦点を当てるソフトウェア設計手法である。オブジェクト指向プログラミングに関しては、ソースコード（クラス名・クラスメソッド・クラス変数）の構造と名称がビジネスドメインと一致させる必要があることを意味する。例えばローンの申し込みを処理するソフトウェアには、LoanApplicationやCustomerなどのクラスと、AcceptOfferやWithdrawどのメソッドが含まれることになる。ドメイン駆動設計は次の目標に基づいている。 プロジェクトの主な焦点をコアドメインとドメインロジックに置く。 ドメインのモデルに基づく複雑な設計。 特定のドメインの問題に対処する概念モデルを繰り返し改良するために、技術とドメインの専門家の間で創造的なコラボレーションを開始する。 ドメイン駆動設計では、開発者は通常モデルを純粋で有用な構造として維持するために大量の分離とカプセル化を実装する必要があると批判されているが、ドメイン駆動型設計は保守性などの利点を提供する。一方でMicrosoftは、モデルがドメインの共通理解を策定する上で明確な利点を提供する複雑なドメインにのみ推奨している。この名称は、Eric Evansが著作Domain-Driven Design: Tackling Complexity in the Heart of Softwareで用いた。 ドメイン駆動型設計は、多くの高レベルの概念と実践を明確に示している。最も重要なのはドメインであり、ユーザーがプログラムを適用するサブジェクト領域は、ソフトウェアのドメインである。ソフトウェアのドメインは、そのコンテキスト、つまり、その意味を決定する単語またはステートメントが表示される設定を管理する。このことから、開発者はドメインモデルを構築する。これは、ドメインの選択された側面を記述し、そのドメインに関連する問題を解決するために使用できる抽象化のシステムである。ドメイン駆動設計のこれらの側面は、ユビキタス言語を促進することを目的としている。つまり、ドメインモデルは、システム要件、ビジネスユーザー、スポンサー、および開発者を記述するためにドメインの専門家によって共有されるcommon language（共通言語）を形成するべきである、という考えである。ドメイン駆動設計では、ドメイン層（英語版）はオブジェクト指向の多層アーキテクチャの共通層（英語版）の1つである。 ドメイン駆動設計は複数の種類のモデルを区別している。例えばエンティティは、属性ではなくIDによって定義されるオブジェクトである。例としてほとんどの航空会社はすべてのフライトの座席に一意のIDを割り当てて識別している。対照的に値オブジェクトは、属性を含むが概念的なアイデンティティを持たない不変オブジェクトである。例えば、人々が名刺を交換するとき、一意の名刺を区別しようとはせず、名刺に書かれた情報（属性）だけを利用する。モデルはイベント（過去に起こったこと）を定義することもできる。ドメインイベントとは、ドメインの専門家が関心を持っているイベントである。モデルはルートエンティティによって結合され、集約になることができる。集約外のオブジェクトはそのルートへの参照を保持できる一方で集約の他のオブジェクトへの参照は保持できない。集約ルートは、集約内の変更の一貫性をチェックする。例えば、ドライバーは車の各ホイールを個別に制御する必要はなく単に車を運転するだけである。このコンテキストでは、車は他のいくつかのオブジェクト（エンジン、ブレーキ、ヘッドライトなど）の集約と言える。 ドメイン駆動型設計では、オブジェクトの作成はオブジェクト自体から切り離されることがよくある。例えばリポジトリは、データストア（データベースなど）からドメインオブジェクトを取得するためのメソッドを備えたオブジェクトであり、同様にファクトリはドメインオブジェクトを直接作成するためのメソッドを持つオブジェクトである。プログラムの機能の一部が概念的にどのオブジェクトにも属さない場合、通常はサービスとして表現される。 オブジェクト指向分析設計 ドメイン駆動設計の考え方は、理論上、オブジェクト指向の手法に制約されるものではない。実際、ドメイン駆動設計では、オブジェクト指向の技法が実現する強みを活かそうとしている。 モデル駆動工学（MDE） モデル駆動型アーキテクチャ（MDA） MDAの考え方は、ドメイン駆動設計と両立するが、二つの概念の意図するところは多少異なっている。MDAは、ドメインモデルをよりよく定義する方法よりも、技術の異なるプラットフォームに対してモデルをコードに変換する方法の方に関心がある。 POJOとPOCO POJOとPOCOは実装上の考え方であり、それぞれJavaと.NET Frameworkに固有のものである。しかし、POJOとPOCOという用語が現れたことは、二つのプラットフォームのいずれかにおいて、特定のテクノロジの要求に応じてではなく、純粋に対応するドメインの概念のビジネス上の振る舞いを実現するためにドメインオブジェクトが定義されるべきである、という考え方が広まりつつあることを示している。 Naked Objectsパターン このパターンは、次の二つの仮定に基づいている。 良質なドメインモデルがあれば、ユーザインターフェイスは、単純にドメインモデルを反映したものになる。 ドメインモデルを直接反映したユーザインターフェイスが必要であれば、より良いドメインモデルの設計を余儀なくされる。 ドメイン固有言語（DSL） ドメイン駆動設計は、必ずしもDSLを必要としないが、DSLを定義し、domain-specific multimodeling（英語版）のような手法の実践を助ける。 アスペクト指向プログラミング（AOP） AOPを用いると、技術的な関心（セキュリティ、トランザクション管理、ロギング）をドメインモデルから簡単にくくりだすことができ、純粋にビジネスロジックに焦点をおいたドメインモデルの設計と実装を容易にする。 ドメイン駆動開発の実践は、特定のソフトウェアツールやフレームワークに依存したものではない。しかし、多数のオープンソースツールとフレームワークがEvansの書籍で推奨しているパターンや、ドメイン駆動開発の方法をサポートしている。以下のようなものがある。 Castle Windsor/MicroKernel：マイクロソフトの.NET Framework向けの制御の反転/依存性の注入コンテナであり、サービスとリポジトリ、ファクトリーを利用者に提供する。 Cosmos：ドメイン駆動設計の、中でもAOPの実践をサポートした、アプリケーションフレームワーク。 DataObjects.Net：データベースアプリケーションのフレームワーク/開発環境であり、オブジェクト関係マッピングとドメイン駆動開発をサポートしている。 Domdrides：ドメイン駆動設計をJavaで実現する際に有用なライブラリ。 ECO：CapableObjects社によるUML図からのデータベース、コード、状態マシンの生成を行うフレームワーク。 Flow：PHPのアプリケーションフレームワークで、ドメイン駆動開発を中心においている。良質なドメインモデルの形成を促し、またリポジトリ、エンティティ、値オブジェクトをサポートする。また依存性の注入、AOPのフレームワークを提供している。 Habanero.NET（Habanero）：オープンソースのドメイン駆動開発の原則を用いてエンタプライズアプリケーションを開発するためのエンタプライズアプリケーションフレームワークで、.NET Framework上に実現されている。 ManyDesigns_Portofino：ManyDesigns Portofinoはオープンソースのモデル駆動型のWebアプリケーションフレームワークで、高い生産性とメンテナンス性を目標にしている。CRUDフォーム、関係、ワークフロー管理、ダッシュボード、パンくずリスト、検索、シングルサインオン、権限、レポートなどを提供する。 NakedObjectsFramework、Apache Isis：naked objectsパターンを実現しており、依存性の注入をサポートしている。またドメイン駆動設計におけるリポジトリ、ファクトリー、サービスの概念を、再利用可能な形で実装している。 NReco：軽量なオープンソースの.NET向けドメイン固有のMDDを行うフレームワークである。JQuery、Open NIC.NET、OGNL、Log4Net、Lucene.NET、SemWebなどと結合されている。 OpenMDX：Jakarta EE、.NETをサポートするオープンソースのJava向けMDAフレームワークである。OpenMDXは典型的なMDAフレームワークとは異なり、「実際のシステムの振る舞いを直接操作するためにモデルを使用する」。 OpenXava：はJPAのエンティティからAjaxアプリケーションを生成する。実行可能なアプリケーションを作成するために、ドメインクラスを記述するだけでよい。 Roma Meta Framework：ドメイン駆動開発を中心においたフレームワークで、新しい全体的な方法により、設計者・開発者がGUI、国際化、永続化など、何もかもPOJOとして見えるようにする。 Sculptor:ドメイン駆動開発の用語を用いるコード生成フレームワーク。 Sculpture - Model Your Life：オープンソースのモデル駆動開発のコード生成ツールの中で、Sculpture は最も強力なものの一つである。単純なCRUDアプリケーションから、複雑な大規模アプリケーションまで、SculptureはNHibernate、Entity Framework、WCF、CSLA、Silverlight、WPF、ASP.NET MVC などの一般的なフレームワークのための型をあらかじめ用意している。 Strandz：ドメイン駆動のフレームワークで、アプリケーションのUI層と、ドメイン層双方の実装に非依存である。プログラマーは、特殊なクラスを用いてアプリケーションのワイヤモデルを記述する。 TrueView for .NET：モデル駆動開発とnaked objectsをサポートした簡単に使用できるフレームワークで、これからモデル駆動開発を開始しようというチームに向いている。 ASP.NET Boilerplate：ドメイン駆動開発のWebアプリケーション作成フレームワークで、N層レイアのアプリケーション開発が可能となっている。名称からも分かるようにマイクロソフトの.NET Frameworkの技術の上に構築されている。