ドメイン駆動設計
ソフトウェア開発 |
---|
中心となる活動 |
パラダイムとモデル |
方法論とフレームワーク |
開発支援 |
プラクティス |
ツール |
標準と機関 |
用語集 |
|
ドメイン駆動設計(ドメインくどうせっけい、英語: domain-driven design、DDD)は主要なソフトウェア設計手法の一つであり[1]、モデルをドメインエキスパートの知識に基づくドメインに一致させることに主眼を置くものである[2]。DDDは”単一の統一されたモデル”という考え方に反対し、1つの大きなシステムを複数の区切られた文脈に分割する。区切られた文脈は、それぞれが個別に自らのドメインモデルを持つ[3]。
DDDにおいては、ソフトウェアコード(e.g. クラス名、クラスメソッド、クラス変数)における「言葉」や構造をビジネスドメインに一致させる必要がある。例えば、ソフトウェアがローン申請(loan application)を処理する場合、ソフトウェアは「loan application」「customer」といった名前のクラスや「accept offer」「withdraw」といったメソッドを持つことが考えられる。
DDDは以下のような目的に基づく。
- プロジェクトにおける主な焦点を中核の業務領域(コアドメイン)と業務ロジック(ドメインロジック)のレイヤーに置くこと
- 複雑な設計をドメインモデルで表現すること
- 技術者とドメインエキスパートの間にクリエイティブな協働関係を構築し、特定のドメイン問題を扱う概念的なモデルを継続的に洗練させること
ドメイン駆動設計には、開発者がドメインモデルを純粋で有用な構造として維持するためには、通常大量の分離とカプセル化を行う必要があるという批判がある一方で、DDDは保守性などの利点を提供する。Microsoftは、ドメインに対する共通理解を構築することで明確な利点のある複雑なドメインにのみDDDを導入することを推奨している[4]。
DDDという名称は、エリック・エヴァンス(英語版)による著書の中で初めて提唱されたものである[5]。
概要
DDDは、多くの高水準な概念と実践を明確に示している[6]。もっとも重要なものは、ソフトウェアにおける「ドメイン」であり、これはユーザがプログラムを適用する対象領域を指す。ソフトウェアの開発者は「ドメインモデル」を構築するが、これは特定のドメインのある側面を表現し、ドメインにおける問題を解決するために用いることができるような抽象化のシステムである。
DDDのこれらの側面は、ドメインエキスパートと開発者、そしてユーザー間で「同じ言葉(ユビキタス言語)」を共有することを目的としている。ドメインモデルや、システム要件の記述において、「同じ言葉」が用いられる。
「同じ言葉」を用いることは「戦略的設計」「戦術的設計」と並んでDDDの核心的な考え方の一つである。
DDDにおけるドメイン層は、オブジェクト指向の多層アーキテクチャにおける一般的な層の一つである。
モデルの種類
ドメイン駆動設計は複数の種類のモデルを区別している。例えばエンティティは、属性ではなくIDによって定義されるオブジェクトである。例としてほとんどの航空会社はすべてのフライトの座席に一意のIDを割り当てて識別している。対照的に値オブジェクトは、属性を含むが概念的なアイデンティティを持たない不変オブジェクトである。例えば、人々が名刺を交換するとき、一意の名刺を区別しようとはせず、名刺に書かれた情報(属性)だけを利用する。モデルはイベント(過去に起こったこと)を定義することもできる。ドメインイベントとは、ドメインの専門家が関心を持っているイベントである。モデルはルートエンティティによって結合され、集約になることができる。集約外のオブジェクトはそのルートへの参照を保持できる一方で集約の他のオブジェクトへの参照は保持できない。集約ルートは、集約内の変更の一貫性をチェックする。例えば、ドライバーは車の各ホイールを個別に制御する必要はなく単に車を運転するだけである。このコンテキストでは、車は他のいくつかのオブジェクト(エンジン、ブレーキ、ヘッドライトなど)の集約と言える。
モデルの操作
ドメイン駆動型設計では、オブジェクトの作成はオブジェクト自体から切り離されることがよくある。例えばリポジトリは、データストア(データベースなど)からドメインオブジェクトを取得するためのメソッドを備えたオブジェクトであり、同様にファクトリはドメインオブジェクトを直接作成するためのメソッドを持つオブジェクトである。プログラムの機能の一部が概念的にどのオブジェクトにも属さない場合、通常はサービスとして表現される。
他の概念との関係
- オブジェクト指向分析設計
- ドメイン駆動設計の考え方は、理論上、オブジェクト指向の手法に制約されるものではない。実際、ドメイン駆動設計では、オブジェクト指向の技法が実現する強みを活かそうとしている。
- モデル駆動工学(MDE)
- モデル駆動型アーキテクチャ(MDA)
- MDAの考え方は、ドメイン駆動設計と両立するが、二つの概念の意図するところは多少異なっている。MDAは、ドメインモデルをよりよく定義する方法よりも、技術の異なるプラットフォームに対してモデルをコードに変換する方法の方に関心がある。
- POJOとPOCO
- POJOとPOCOは実装上の考え方であり、それぞれJavaと.NET Frameworkに固有のものである。しかし、POJOとPOCOという用語が現れたことは、二つのプラットフォームのいずれかにおいて、特定のテクノロジの要求に応じてではなく、純粋に対応するドメインの概念のビジネス上の振る舞いを実現するためにドメインオブジェクトが定義されるべきである、という考え方が広まりつつあることを示している。
- Naked Objectsパターン
- このパターンは、次の二つの仮定に基づいている[7]。
- 良質なドメインモデルがあれば、ユーザインターフェイスは、単純にドメインモデルを反映したものになる。
- ドメインモデルを直接反映したユーザインターフェイスが必要であれば、より良いドメインモデルの設計を余儀なくされる。
- ドメイン固有言語(DSL)
- ドメイン駆動設計は、必ずしもDSLを必要としないが、DSLを定義し、domain-specific multimodeling(英語版)のような手法の実践を助ける。
- アスペクト指向プログラミング(AOP)
- AOPを用いると、技術的な関心(セキュリティ、トランザクション管理、ロギング)をドメインモデルから簡単にくくりだすことができ、純粋にビジネスロジックに焦点をおいたドメインモデルの設計と実装を容易にする。
ドメイン駆動設計をサポートするソフトウェアツール
ドメイン駆動開発の実践は、特定のソフトウェアツールやフレームワークに依存したものではない。しかし、多数のオープンソースツールとフレームワークがEvansの書籍で推奨しているパターンや、ドメイン駆動開発の方法をサポートしている。以下のようなものがある。
- Castle Windsor/MicroKernel[8]:マイクロソフトの.NET Framework向けの制御の反転/依存性の注入コンテナであり、サービスとリポジトリ、ファクトリーを利用者に提供する。
- Cosmos[9]:ドメイン駆動設計の、中でもAOPの実践をサポートした、アプリケーションフレームワーク。
- DataObjects.Net:データベースアプリケーションのフレームワーク/開発環境であり、オブジェクト関係マッピングとドメイン駆動開発をサポートしている。
- Domdrides[10]:ドメイン駆動設計をJavaで実現する際に有用なライブラリ。
- ECO:CapableObjects社[11]によるUML図からのデータベース、コード、状態マシンの生成を行うフレームワーク。
- Flow[12]:PHPのアプリケーションフレームワークで、ドメイン駆動開発を中心においている。良質なドメインモデルの形成を促し、またリポジトリ、エンティティ、値オブジェクトをサポートする。また依存性の注入、AOPのフレームワークを提供している。
- Habanero.NET(Habanero):オープンソースのドメイン駆動開発の原則を用いてエンタプライズアプリケーションを開発するためのエンタプライズアプリケーションフレームワークで、.NET Framework上に実現されている。
- ManyDesigns_Portofino:ManyDesigns Portofinoはオープンソースのモデル駆動型のWebアプリケーションフレームワークで、高い生産性とメンテナンス性を目標にしている。CRUDフォーム、関係、ワークフロー管理、ダッシュボード、パンくずリスト、検索、シングルサインオン、権限、レポートなどを提供する。
- NakedObjectsFramework[13]、Apache Isis[14]:naked objectsパターンを実現しており、依存性の注入をサポートしている。またドメイン駆動設計におけるリポジトリ、ファクトリー、サービスの概念を、再利用可能な形で実装している。
- NReco[15]:軽量なオープンソースの.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[16]:ドメイン駆動開発を中心においたフレームワークで、新しい全体的な方法により、設計者・開発者がGUI、国際化、永続化など、何もかもPOJOとして見えるようにする。
- Sculptor[17]:ドメイン駆動開発の用語を用いるコード生成フレームワーク。
- Sculpture - Model Your Life[18]:オープンソースのモデル駆動開発のコード生成ツールの中で、Sculpture は最も強力なものの一つである。単純なCRUDアプリケーションから、複雑な大規模アプリケーションまで、SculptureはNHibernate、Entity Framework、WCF、CSLA、Silverlight、WPF、ASP.NET MVC などの一般的なフレームワークのための型をあらかじめ用意している。
- Strandz[19]:ドメイン駆動のフレームワークで、アプリケーションのUI層と、ドメイン層双方の実装に非依存である。プログラマーは、特殊なクラスを用いてアプリケーションのワイヤモデルを記述する。
- TrueView for .NET[20]:モデル駆動開発とnaked objectsをサポートした簡単に使用できるフレームワークで、これからモデル駆動開発を開始しようというチームに向いている。
- ASP.NET Boilerplate[21]:ドメイン駆動開発のWebアプリケーション作成フレームワークで、N層レイアのアプリケーション開発が可能となっている。名称からも分かるようにマイクロソフトの.NET Frameworkの技術の上に構築されている。
出典
- ^ Millet, Scott; Tune, Nick (2015). Patterns, Principles, and Practices of Domain-Driven Design. Indianapolis: Wrox. ISBN 978-1-118-71470-6
- ^ Vernon, Vaughn (2013). Implementing Domain-Driven Design. Upper Sadle River, NJ: Addison-Wesley. p. 3. ISBN 978-0-321-83457-7
- ^ Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison-Wesley Professional. (2003). ISBN 978-0321125217
- ^ Microsoft Application Architecture Guide, 2nd Edition. Retrieved from http://msdn.microsoft.com/en-us/library/ee658117.aspx#DomainModelStyle.
- ^ Evans, Eric (2004). Domain-Driven Design: Tackling Complexity in the Heart of Software. Boston: Addison-Wesley. ISBN 978-032-112521-7. http://dddcommunity.org/book/evans_2003/ 2012年8月12日閲覧。
- ^ Evans, Eric (August 22, 2003). Domain-Driven Design: Tackling Complexity in the Heart of Software. Boston: Addison-Wesley. ISBN 978-032-112521-7. http://dddcommunity.org/book/evans_2003/ 2012年8月12日閲覧。
- ^ Haywood, D., Domain-Driven Design using Naked Objects, 2009, Pragmatic Programmers
- ^ “Castle Project”. www.castleproject.org. 2022年8月23日閲覧。
- ^ “Microsoft – Cloud, Computers, Apps & Gaming” (英語). www.microsoft.com. 2022年8月23日閲覧。
- ^ “Domdrides - Overview”. domdrides.sourceforge.net. 2022年8月23日閲覧。
- ^ “CapableObjects” (英語). CapableObjects. 2022年8月23日閲覧。
- ^ “Home” (英語). Home. 2022年8月23日閲覧。
- ^ Naked Objects, Naked Objects Group Ltd, (2022-07-30), https://github.com/NakedObjectsGroup/NakedObjectsFramework 2022年8月23日閲覧。
- ^ “Apache Isis”. isis.apache.org. 2022年8月23日閲覧。
- ^ “NReco: .NET REusable COmponents”. www.nrecosite.com. 2022年8月23日閲覧。
- ^ “Roma Framework: The new way to conceive Web Applications”. www.romaframework.org. 2022年8月23日閲覧。
- ^ “Sculptor - Generating Java code from DDD-inspired textual DSL”. sculptorgenerator.org. 2022年8月23日閲覧。
- ^ Dawilasoft - Sculpture - ウェイバックマシン(2012年4月22日アーカイブ分)
- ^ Standz - ウェイバックマシン(2016年10月28日アーカイブ分)
- ^ “TrueView for .NET | Agile development tools for Domain Driven Design | Home” (英語). TrueView | Agile development tools for .NET & Domain Driven Design. 2022年8月23日閲覧。
- ^ Technology, Volosoft Computer and. “AspNet Boilerplate - Web Application Framework” (英語). ASP.NET Boilerplate. 2022年8月23日閲覧。
外部リンク
- 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