ドメイン駆動設計

ドメイン駆動設計（英: Domain-driven design, DDD）とはソフトウェアの設計手法であり、「複雑なドメインの設計は、モデルベースで行うべき」であり、また「大半のソフトウェアプロジェクトでは、システムを実装するための特定の技術ではなく、ドメインそのものとドメインのロジックに焦点を置くべき」であるとする。この名称は、 Eric Evans が同名の著作で用いた。 書籍 Domain-Driven Designでは、たとえば ubiquitous language といった高位の概念と実践について多数述べられている。これは、ドメインモデルがシステムの要求を記述するためにドメインの専門家が提供し、業務上のユーザーやスポンサー、開発者みなにとってうまく働くような common language(共通言語)を形成するべきである、という考えである。同書は多層アーキテクチャを持つオブジェクト指向システムにおいて、一般的なレイヤ構造におけるドメイン層を記述することに重点を置いている。 ドメイン駆動開発では、ドメインモデルを表現する要素として、下記のものを挙げている。 エンティティ (参照オブジェクト): ドメインモデル内のオブジェクトであり、その属性によってではなく、連続性と識別性によって定義される。 値オブジェクト: 事物の特性を記述するオブジェクトである。特に識別する情報はなく、通例、読み出し専用のオブジェクトであり、Flyweight パターンを用いて共有できる。 サービス: 操作がオブジェクトに属さない場合に、問題の自然な解決策として、操作をサービスとして実現することができる。サービスの概念は、GRASPにおいて"純粋人工物"と呼ばれるものである。 リポジトリ:ドメインオブジェクトを取得するメソッドは、記憶域の実装を簡単に切り替えられるようにするため、専門のリポジトリオブジェクトに処理を委譲するべきである。 ファクトリー : ドメインオブジェクトを生成するメソッドは、実装を簡単に切り替えられるようにするため、専門のファクトリーオブジェクトに処理を委譲するべきである。 オブジェクト指向分析設計 ドメイン駆動設計の考え方は、理論上、オブジェクト指向の手法に制約されるものではない。実際、ドメイン駆動設計では、オブジェクト指向の技法が実現する強みを活かそうとしている。 モデル駆動工学 (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: Microsoft の .NET Framework 向けの制御の反転/依存性の注入コンテナであり、サービスとリポジトリ、ファクトリーを利用者に提供する。 Cosmos: ドメイン駆動設計の、中でもAOPの実践をサポートした、アプリケーションフレームワーク。 DataObjects.Net: データベースアプリケーションのフレームワーク/開発環境であり、オブジェクト関係マッピングとドメイン駆動開発をサポートしている。 Domdrides: ドメイン駆動設計を Java で実現する際に有用なライブラリ。 ECO: CapableObjects社によるUML図からのデータベース、コード、状態マシンの生成を行うフレームワーク。 TYPO3 Flow: PHP のアプリケーションフレームワークで、ドメイン駆動開発を中心においている。良質なドメインモデルの形成を促し、またリポジトリ、エンティティ、値オブジェクトをサポートする。また依存性の注入、AOP のフレームワークを提供している。 Habanero.NET (Habanero) : オープンソースのドメイン駆動開発の原則を用いてエンタプライズアプリケーションを開発するためのエンタプライズアプリケーションフレームワークで、.NET上に実現されている。 ManyDesigns_Portofino : ManyDesigns Portofino はオープンソースのモデル駆動型のWebアプリケーションフレームワークで、高い生産性とメンテナンス性を目標にしている。CRUD フォーム、関係、ワークフロー管理、ダッシュボード、パンくずリスト、検索、シングルサインオン、権限、レポートなどを提供する。 Naked Objects: はen:naked objects パターンを実現しており、依存性の注入をサポートしている。またドメイン駆動設計におけるリポジトリ、ファクトリー、サービスの概念を、再利用可能な形で実装している。 NReco: 軽量なオープンソースの .NET 向け ドメイン固有 の MDD を行うフレームワークである。JQuery, Open NIC.NET, OGNL, Log4Net, Lucene.NET, SemWeb などと結合されている OpenMDX: J2EE、.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層レイアのアプリケーション開発が可能となっている。名称からも分かるようにMicrosoftの.NET Frameworkの技術の上に構築されている。 ^ Definition on domaindrivendesign.org ^ a b Evans, E., Domain-Driven Design - Tackling Complexity in the Heart of Software, 2004, Addison-Wesley ^ Haywood, D., Domain-Driven Design using Naked Objects, 2009, Pragmatic Programmers Eric Evans on Domain Driven Design - Putting the Model to Work Eric Evans on Domain Driven Design - Strategic Design Jimmy Nilsson on Domain Driven Design Domain-Driven Design forum (English)