ドメイン駆動設計

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ドメイン駆動設計: Domain-driven design, DDD)とはソフトウェアの設計手法であり、'複雑なドメインの設計はモデルベースで行うべきであり'、'また大半のソフトウェアプロジェクトではシステムを実装するための特定の技術ではなくドメインそのものとドメインのロジックに焦点を置くべき'とする[1]。この名称は Eric Evans が同名の著作で用いた[2]

書籍 Domain-Driven Design[2]では、たとえば ubiquitous language といった高位の概念と実践について多数述べられている。これは、ドメインモデルがシステムの要求を記述するためにドメインの専門家が提供し、業務上のユーザーやスポンサー、開発者みなにとってうまく働くような common language(共通言語)を形成するべきである、という考えである。同書は多層アーキテクチャを持つオブジェクト指向システムにおいて、一般的なレイヤ構造におけるドメイン層を記述することに重点を置いている。

ドメイン駆動開発では、ドメインモデルを表現する要素として、下記のものを挙げている。

  • エンティティ (参照オブジェクト): ドメインモデル内のオブジェクトであり、その属性によってではなく、連続性と識別性によって定義される。
  • 値オブジェクト: 事物の特性を記述するオブジェクトである。値オブジェクトは特に識別する情報はない。通例読み出し専用のオブジェクトであり、Flyweight パターンを用いて共有できる。
  • サービス: 操作がオブジェクトに属さない場合に、問題の自然な解決策として、操作をサービスとして実現することができる。サービスの概念はGRASPにおいて"純粋人工物"と呼ばれるものである。
  • リポジトリ:ドメインオブジェクトを取得するメソッドは、記憶域の実装を簡単に切り替えられるようにするため、専門のリポジトリオブジェクトに処理を委譲するべきである。
  • ファクトリー : ドメインオブジェクトを生成するメソッドは、実装を簡単に切り替えられるようにするため、専門のファクトリーオブジェクトに処理を委譲するべきである。

他の概念との関係[編集]

オブジェクト指向分析設計
理論上ではあるが、ドメイン駆動設計の考え方はオブジェクト指向の手法に制約されるものではない。実際にドメイン駆動設計ではオブジェクト指向の技法が実現する強みを活かそうとしている。
モデル駆動工学 (MDE)
モデル駆動型アーキテクチャ (MDA)
MDA の考え方はドメイン駆動設計と両立するが、二つの概念の意図するところは多少異なっている。MDA は、ドメインモデルをよりよく定義する方法よりも、技術の異なるプラットフォームに対してモデルをコードに変換する方法の方に関心がある。
POJOPOCO
POJO と POCO は実装上の考え方であり、それぞれ Java.NET Framework に固有のものである。しかし、POJO と POCO という用語が現れたことは、二つのプラットフォームのいずれかにおいて、ドメインオブジェクトは特定のテクノロジーの要求に応じてではなく、純粋に対応するドメインの概念のビジネス上の振る舞いを実現するために定義されるべきである、という考え方が広まりつつあることを示している。
Naked Objectsパターン
このパターンは二つの仮定に基づいている[3]。1.良質なドメインモデルがあれば、ユーザーインターフェイスは単純にドメインモデルを反映したものになる。2.ドメインモデルを直接反映したユーザーインターフェイスが必要であれば、より良いドメインモデルの設計を余儀なくされる。
ドメイン固有言語 (DSL)
ドメイン駆動設計は必ずしも DSL を必要としないが、DSL を定義したり、domain-specific multimodelingのような手法の実践を助ける。
アスペクト指向プログラミング (AOP)
AOP を用いると、技術的な関心(セキュリティ、トランザクション管理、ロギング)をドメインモデルから簡単にくくりだすことができ、純粋にビジネスロジックに焦点をおいたドメインモデルの設計と実装を容易にする。

ドメイン駆動設計をサポートするソフトウェアツール[編集]

ドメイン駆動開発の実践は、特定のソフトウェアツールやフレームワークに依存したものではない。しかし、多数のオープンソースツールとフレームワークが Evans の書籍で推奨しているパターンや、ドメイン駆動開発の方法をサポートしている。以下のようなものがある。

  • Castle Windsor/MicroKernel: Microsoft の .NET Framework 向けの制御の反転/依存性の注入コンテナであり、サービスとリポジトリ、ファクトリーを利用者に提供する。
  • Cosmos: ドメイン駆動設計の、中でもAOPの実践をサポートした、アプリケーションフレームワーク。
  • DataObjects.Net: データベースアプリケーションのフレームワーク/開発環境であり、オブジェクト関係マッピングとドメイン駆動開発をサポートしている。
  • Domdrides: ドメイン駆動設計を Java で実現する際に有用なライブラリ。
  • ECO: CapableObjects社によるUML図からのデータベース、コード、状態マシンの生成を行うフレームワーク。
  • FLOW3: 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 をサポートした簡単に使用できるフレームワークで、これからモデル駆動開発を開始しようというチームに向いている。

参考文献[編集]

  1. ^ Definition on domaindrivendesign.org
  2. ^ a b Evans, E., Domain-Driven Design - Tackling Complexity in the Heart of Software, 2004, Addison-Wesley
  3. ^ Haywood, D., Domain-Driven Design using Naked Objects, 2009, Pragmatic Programmers

外部リンク[編集]