web-dev-qa-db-ja.com

ドメイン駆動設計とは何ですか?

誰かがドメイン駆動設計とは正確に(簡潔に)説明してください。私はこの用語をかなりよく見ますが、それが何であるか、またはどのように見えるかを本当に理解していません。非ドメイン駆動設計とはどう違うのですか?

また、誰かがドメインオブジェクトとは何かを説明できますか?ドメインは通常のオブジェクトとどう違うのですか?

178
Calanus

編集:

これはGoogleで最高の結果であるように見えますが、以下の私の答えはそうではありませんので、このより良い答えを参照してください。

https://stackoverflow.com/a/1222488/1240557

古い回答(完全ではありません:))

優れたソフトウェアを作成するには、そのソフトウェアが何であるかを知る必要があります。銀行業務とは何かを十分に理解していない限り、銀行業務ソフトウェアシステムを作成することはできません。銀行業務の領域を理解する必要があります。

From:Eric Evansによるドメイン駆動設計。

この本は、DDDを説明する上で非常に優れています。

本の要約をダウンロードするために登録する 、または 直接要約をダウンロードする

98
Mikael Östberg

ドメイン駆動設計は、問題領域内のアクティビティ、タスク、イベント、およびデータをソリューション領域の技術成果物にマッピングすることに焦点を当てた複雑なシステムの開発のための方法論およびプロセス処方です。

ドメイン駆動設計の重点は、特定の一連のテクノロジーで実装できる問題ドメインの抽象モデルを作成するために、問題ドメインを理解することです。方法論としてのドメイン駆動設計は、このモデル開発と技術開発が、問題ドメインの変化に直面しても堅牢でありながら、それを使用する人々のニーズを満たすシステムを実現する方法のガイドラインを提供します。

ドメイン駆動設計のプロセス側には、ドメインの専門家、問題領域を知っている人々と、設計/アーキテクチャの専門家、ソリューション領域を知っている人々とのコラボレーションが含まれます。アイデアは、共有言語で共有モデルを持ち、2つの異なる視点を持つ2つの異なるドメインの人々がソリューションを議論する際に、実際には共有の概念で共有の知識ベースを議論することです。

特定のシステムを必要とする人々と、システムを設計および実装している人々との間で共有される問題領域の理解の欠如は、成功するプロジェクトの中心的な障害のようです。ドメイン駆動設計は、この障害に対処する方法論です。

オブジェクトモデルを持っているだけではありません。問題領域内の実際のニーズを発見し、それらのニーズを満たすために適切なソリューションを作成できるように、焦点は本当に共有コミュニケーションとコラボレーションの改善にあります。

ドメイン駆動設計:善と挑戦 はこのコメントで簡単な概要を提供します:

DDDは、トップレベルのアーキテクチャを発見し、ソフトウェアが複製する必要があるドメインのメカニズムとダイナミクスを通知するのに役立ちます。具体的には、DDD分析が適切に行われていれば、ドメインの専門家とソフトウェアアーキテクトの間の誤解が最小限に抑えられ、その後の変更に対する高価なリクエストの数が減ります。ドメインの複雑さをより小さなコンテキストに分割することにより、DDDは、プロジェクトアーキテクトが肥大化したオブジェクトモデルを設計することを回避します。これは、処理するエンティティの数がしばしば会議室のホワイトボードのサイズ。

短い例を提供するこの記事 サービスアーキテクチャのドメイン駆動設計 も参照してください。この記事では、ドメイン駆動設計に関する次のサムネイル説明を提供しています。

Domain Driven Designは、ユースケースに関連するビジネスの現実に基づいたモデリングを提唱しています。現在は古くなり、誇大広告のレベルは低下しているため、多くの人がDDDアプローチが手元の問題を理解し、ソリューションの共通理解に向けてソフトウェアを設計するのに役立つことを忘れています。アプリケーションを構築するとき、DDDはドメインとサブドメインとして問題について話します。問題の独立したステップ/領域を境界付きコンテキストとして説明し、これらの問題について話すために共通言語を強調し、実装をサポートするエンティティ、値オブジェクト、集約ルートルールなどの多くの技術的概念を追加します。

Martin Fowlerは、方法論としてのDomain Driven Designに言及した多くの記事を書いています。たとえば、この記事 BoundedContext は、ドメイン駆動開発の境界付きコンテキストの概念の概要を提供します。

当時、ビジネス全体の統一モデルを構築するよう勧められましたが、DDDは、「大規模システムのドメインモデルの完全な統合は実行可能でも費用効果も高くない」ことを学んだことを認識しています 1 。その代わり、DDDは大規模なシステムを境界付きコンテキストに分割します。各コンテキストは、統一されたモデルを持つことができます-基本的にMultipleCanonicalModelsを構築する方法です。

38

あなたは、CAN ONLYで、次のことを最初に理解することにより、ドメイン駆動設計を理解できます。

ドメインとは何ですか?

システムが構築されるフィールド。空港管理、保険の販売、コーヒーショップ、軌道飛行、あなたはそれに名前を付けます。

アプリケーションが複数の異なるドメインにまたがることは珍しいことではありません。たとえば、オンライン小売システムは、配送(商品と配送先に応じて適切な配送方法を選択)、価格設定(プロモーション、場所などのユーザー固有の価格設定を含む)、および推奨事項(関連する計算購入履歴による製品)。

モデルとは何ですか?

「当面の問題に対する有用な近似。」 -ジェリー・サスマン

Employeeクラスは実際の従業員ではありません。実際の従業員をモデル化しています。モデルが実際の従業員に関するすべてをキャプチャするわけではないことはわかっていますが、それがポイントではありません。これは、現在のコンテキストに興味があるものをキャプチャすることのみを目的としています。

異なるドメインは、同じものをモデル化するさまざまな方法に関心があるかもしれません。たとえば、給与部門と人事部門では、従業員をさまざまな方法でモデル化できます。

ドメインモデルとは何ですか?

ドメインのモデル。

ドメイン駆動設計(DDD)とは何ですか?

これは、ドメインモデルを深く評価し、それを実装に結び付ける開発アプローチです。 DDDは、Eric Evansによって作成され、最初に開発されました。

here から取得

14
Edwin Ikechukwu

Domain Driven Design で確認できる別の良い記事を次に示します。あなたのアプリケーションが大学の割り当てよりも深刻なものである場合。基本的な前提は、エンティティの周りのすべてを構造化し、強力なドメインモデルを持っていることです。インフラストラクチャに関連するもの(電子メールの送信、データの永続化など)を提供するサービスと、実際のビジネス要件であるものを実際に行うサービスを区別します。

それが役に立てば幸いです。

12
Nilesh

TDDとBDDの場合のように、あなた/チームは、コードの実装よりもシステムのテストと動作に最も焦点を合わせます。

システムアナリスト、製品所有者、開発チーム、そしてもちろんコード-エンティティ/クラス、変数、関数、ユーザーインターフェイスプロセスが同じ言語を使用して通信する場合、ドメイン駆動設計と呼ばれる同様の方法

DDDは思考プロセスです。ソフトウェアの設計をモデリングする場合、データ構造、データフロー、テクノロジー、内部および外部の依存関係ではなく、ビジネスドメイン/プロセスを中心に置く必要があります。

DDDを使用してsystermをモデル化する多くのアプローチがあります

  • イベントソーシング(イベントを単一の真実のソースとして使用)
  • リレーショナルデータベース
  • グラフデータベース
  • 関数型言語を使用する

ドメインオブジェクト:

非常に素朴な言葉では、オブジェクト

  • ビジネスプロセス/フローに基づいた名前を持つ
  • 内部状態を完全に制御します。つまり、状態を操作するメソッドを公開します。
  • 常にその使用状況に応じて、すべてのビジネス不変条件/ビジネスルールを満たします。
  • 単一の責任原則に従う
2
Nitin babariya

次のpdfがあなたに大きな全体像を与えると信じています。 エリックエバンスによるドメイン駆動設計

注:作業できるプロジェクトについて考え、理解したささいなことを適用して、ベストプラクティスを確認してください。また、マイクロサービスアーキテクチャの設計アプローチに対する能力を高めるのに役立ちます。

1
Hedego

DDD(ドメイン駆動設計)は、プロジェクトの要件を分析し、これらの要件の複雑さを処理するための便利な概念です。以前は、人々はクラスとテーブル間の関係を考慮してこれらの要件を分析していました。関係は古くありませんが、いくつかの問題があります。

  • 複雑な要件を持つ大規模なプロジェクトでは、これは有用ではありませんが、これは小規模なプロジェクトの優れた設計方法です。

  • 技術的な概念を持っていない技術者を扱っていない場合、この競合がプロジェクトに大きな問題を引き起こす可能性があります。

したがって、DDDはメインプロジェクトをドメインと見なし、このプロジェクトの各部分をバウンドコンテキストで有名な小さな部分に分割し、各部分が他の部分に影響を与えないという最初の問題を処理します。そして、2番目の問題は、技術チームメンバーと技術的ではないが要件について十分な知識を持っているプロダクトオーナーとの間の共通言語であるユビキタス言語で解決さ​​れました。

一般的に、Domainの簡単な定義は、所有者や他のチームに利益をもたらすメインプロジェクトです。

1
sajadre