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


198

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

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




これはあなたの質問に答えますか?ドメイン駆動設計(DDD)とは何ですか?
Satpal

回答:


112

編集:

これはGoogleでのトップの結果のようであり、以下の私の答えはそうではないので、このはるかに良い答えを参照してください:

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

古い回答(完全ではない:))

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

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

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

登録して書籍の概要をダウンロードする、概要を直接ダウンロードしてください


そのミニバージョンは優れたリファレンスであり、手元にある全文のコピーでも役立ちます。私は通常、最初にそれを読み、次にテキストで詳細を調べます。
キリサランタコス

15
それで、私はこの「この本を読む」という答えから、DDDを数段落に要約することは不可能であると答えましたか?設計哲学はどうしてそんなに複雑になるのでしょうか?
Robin Winslow

不可能だとは言えませんが、それを読むのにもっと良い場所があると思いました。EricEvansの本がimoの最良の情報源です。
MikaelÖstberg2014年

6
読者の皆さん:私と同じように、Googleの上位の検索結果からここにたどり着いて、受け入れられた回答を見つけてがっかりしたので、圧倒的な(謝罪、ミカエル)恐れていない場合は、SOにもっと満足できる説明があります。stackoverflow.com
クリガー

3
そこで、リンクを使って回答を更新しました。それははるかに良い答えでした。ありがとう!
MikaelÖstberg2016

41

ドメイン駆動設計は、問題ドメイン内のアクティビティ、タスク、イベント、およびデータをソリューションドメインのテクノロジーアーティファクトにマッピングすることに重点を置いた複雑なシステムの開発のための方法論とプロセスの処方です。

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

ドメインドリブンデザインのプロセス側には、問題のドメインを知っているドメインの専門家とソリューションドメインを知っているデザイン/アーキテクチャの専門家の間のコラボレーションが含まれます。これらの2つの異なるドメインの2つの異なる視点を持つ人々が2つの異なる視点でソリューションについて話し合うとき、彼らは実際に共有された概念を持つ共有されたナレッジベースについて話し合うように、アイデアは共有言語で共有されたモデルを持つことです。

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

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

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

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

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

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

マーティン・ファウラーは、方法論としてのドメイン駆動設計が言及されている多くの記事を書いています。たとえば、この記事のBoundedContextは、ドメイン駆動開発の境界付きコンテキストの概念の概要を示しています。

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


20

あなたはできるだけで次のことが何であるかをまず把握することで、ドメイン駆動設計を理解します:

ドメインとは何ですか?

システムを構築する分野。空港管理、保険販売、喫茶店、軌道飛行、あなたはそれに名前を付けます。

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

モデルとは?

「目前の問題への有用な近似。」-ジェリーサスマン

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

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

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

ドメインのモデル。

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

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

ここから淘汰


12

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

お役に立てば幸いです。


4

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

システムアナリスト、製品所有者、開発チーム、そしてもちろんコードを実行するときの同様の方法-エンティティ/クラス、変数、関数、ユーザーインターフェイスプロセスは、同じ言語を使用して通信します。

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

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

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

ドメインオブジェクト:

非常にナイーブな言葉では、オブジェクト

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

TDD -テスト駆動開発
ニティンbabariya

BDD-

DDD-

DDD-

4

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

  • 複雑な要件を持つ大きなプロジェクトでは、これは役に立ちません。ただし、これは小さなプロジェクトの優れた設計方法です。

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

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

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


1

次のpdfで全体像がわかると思います。Eric Evansによるドメイン駆動設計

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


0

私は他の人の答えを繰り返したくないので、簡単に言えば、いくつかの一般的な誤解を説明します

  • 実用的なリソース:Scott Millettによるドメイン主導の設計のパターン、原則、および実践
  • 複雑なビジネスシステムの方法論です。ビジネスの専門家と通信するときに、技術的な問題をすべて取り除く
  • これは、開発チーム全体のビジネス(の簡略化および抽出されたモデル)の広範な理解を提供します。
  • ユビキタス言語(開発チーム全体、ビジネスエキスパート、ビジネスアナリストなどが理解する言語)を使用して、ビジネスモデルをコードモデルと同期させます。これは、開発チーム内または他のチームとの開発に使用されます。
  • プロジェクト管理とは何の関係もありません。アジャイルのようなプロジェクト管理方法で完全に使用できますが。
  • プロジェクト全体で使用しないでください。

    DDDは、コアサブドメインに最も力を注ぐ必要性を強調しています。コアサブドメインは、成功と失敗の違いとなる製品の領域です。それは製品のユニークなセールスポイントであり、購入ではなく構築されている理由です。

    基本的に時間と労力がかかりすぎるからです。したがって、ドメイン全体をサブドメインに分割し、ビジネス価値の高いものに適用することをお勧めします。(例:電子メールのような一般的なサブドメインにはない...)

  • オブジェクト指向プログラミングではありません。それは(ほとんど問題解決のアプローチであると、時々、あなたのドメインモデルに(例えば四つのギャングとして)使用OOパターンにする必要はありません)。それはビジネスの専門家には理解できないからです(ファクトリー、デコレーターなどについてはあまり知りません)。DDDには、OOの概念と100%一致しないパターンもいくつかあります(トランザクションスクリプト、テーブルモジュールなど)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.