私はRobert C. MartinによってClean Architecture(CA)を研究しており、大規模なアプリケーションのアーキテクチャ標準を促進するのに非常に役立つことがわかりました。ケーススタディの実装を通じて、より柔軟で堅牢でスケーラブルなアプリケーションの構築にどのように役立つかについて、少し経験があります。最後に、潜在的な欠点(その多くは this 優れた応答で説明されています)にも対応しています。
しかし、私の質問は、クリーンアーキテクチャがエリックエバンスによるドメイン駆動設計(DDD)とどのように関連しているかです。 DDDについてはあまり詳しくありませんが、DDDとCAの間には多くの類似点があることに気づきました。だからここに私の質問があります:
調査から、これについて私が見つけた唯一のことは、CAが here をソースとする「ビジネスオブジェクトでより高いレベルの抽象化を使用している」ということでした。
どちらもドメインコードをアプリケーションコードとインフラストラクチャコードから分離することに重点を置いているのは正しいです。しかし、ここで類似点が終わります。
Clean/Hexagonal/Onion(略してCHO)アーキテクチャでは、この分離の目的はテスト容易性とモジュール性であり、意図された効果により、当社のソフトウェアの「コア」を他の世界から切り離して推論することができます。
DDDの主な目標は、ビジネスの専門家と共通の言語を確立することです。アプリケーションコードの残りの部分からドメインを分離することは、この主要な目標の副次的な効果にすぎません。また、エンティティおよび集合体としてのクラスの設計についてもいくつかの意見がありますが、それはドメイン自体にのみあります。ドメインコード外の設計については言うまでもありません。
実際には、両方を同時に使用する場合があります。 CHOアーキテクチャを使用してシステムの全体構造を設計し、「ドメインコア」を個別のモジュールに分離します。次に、DDDを使用して、ドメインエキスパートと協力して、おそらくEntitesやAggregatesなどのDDDの概念を使用して、このドメインコアを設計します。
DDDは、特定の戦略と戦術を適用することにより、特定の種類のソフトウェアを開発する方法を決定するのに役立つパラダイムです。ドメインの理解を深め、ドメインの用語を使用してドメインロジックを実装するコードでドメインのモデルを作成することは、基本的な部分です。したがって、ドメイン中心の設計は、ドメインロジックの実装と進化に役立ちます。
クリーンなアーキテクチャは、ドメイン中心のアーキテクチャの一例として、進化の過程で特定のプロパティを実現するようにコードを構造化する特定の方法です。特に、ドメイン層は、上記のドメインロジックを実装するために使用できます。 CAは、ソフトウェア設計内のドメインレイヤーの配置場所と、依存関係がレイヤー間でどのように流れるかを通知します。
DDDは、ドメインモデルをコードに反映する必要があると単に述べているだけであり、CAのようにコードの残りの部分でレイヤーモデルを構成する方法を示していません。 CAは、DDDのように戦略的または戦術的なパターンを使用してドメインに合わせる方法を教えていません。一緒に使用すると、CAはドメインレイヤーが1つの部分であるコードの全体的な構造を定義し、DDDはドメインレイヤーの詳細を見つける方法を指示します。