ここで無知を許してください。私はDDDにかなり慣れていないので、優しくしてください。
私は大規模な構成駆動のデータ管理システムに取り組んでいます。システムは、構成の一部 (ビジネス ルール、プロセス、検証など) を外部構文で指定することによって構築されます。構文は、Groovy ベースの DSL と Drools の集合体であるとだけ言っておきましょう。
私は、DDD が提供するシンプルさのアイデアが好きです。具体的には、ドメインのコア コンセプトからインフラストラクチャの問題を分離しています。
ただし、システムの構成可能な性質のために、DDD の概念のいくつかを適用するのに苦労しています。動作 (プロセス)、検証、およびビジネス ルールの両方が、システムの外部で定義されます。したがって、ドメイン内のエンティティは本質的に独自の動作を持ちません。むしろ、彼らは「バリデーター」や「ルールエンジン」、「ワークフローエンジン」に細心の注意を払っています。
例を挙げて説明します。私のシステムが会社の従業員を管理しているとしましょう。あまり深く考えなくても、私のドメインには Employee エンティティと Company エンティティがあると想像できるでしょう。
DDD に続いて、従業員が昇進するシナリオをモデル化しようとしています。従業員に対しては、promote (Employee.promote) という新しいメソッドが作成されることがあります。従業員が同じ年に 2 回昇進できないことを示すビジネス ルールを作成できます (はい、これはすべてでっち上げです)。したがって、次のようなものがあります。
public void promote( EmployeeLevel newLevel ) {
if ( hasBeenPromotedThisYear( this ) {
throw new InvalidPromotionException
さて、私が使用しているアプリケーションでは、このビジネス ルールはルール エンジンに外部化されます。DDDに続いて、次のようなことができます:
if( promotionRules.isEligibleForPromotion(this)
私のルールを外部化する。ただし、システムはこれよりもはるかに一般的です。「プロモーション」操作自体は、外部構成によって「プロセス」として定義されます。したがって、コンパイル時には、この従業員に「昇格」操作を使用できるかどうかさえわかりません。したがって、私の従業員オブジェクトは、コードの観点からはかなりむき出しになり、すべての機能が構成に委譲されます。次のようになります。
public class Employee {
public void execute( Process process )
または代わりに
public class EmployeeProcess {
public void process( Employee employee )
私の質問は、DDD はこのアプリケーションでも意味があるのでしょうか? 代わりに、DDD 以外の意味で、プロセス、検証、ビジネス ルール (ルール エンジン) のコラボレーションをモデル化する必要がありますか?
私は Onion Architecture が好きで、UI -> App Services -> Core -> Infrastructure を使用して、問題を適切に分離することができます。しかし、コアは、実際の「ドメイン概念」とは対照的に、上記の協力者である可能性があります。
この場合、「ドメインの概念」はバリデーター、プロセッサー、ビジネス ルールであると、私の一部は信じています。この場合、(ほとんどの場合) 実際の動作を持たないエンティティと、システム内の動作を実現するプロセッサ、バリデーター、ルール エンジンに関するドメイン コンセプトを使用します。
もう少し情報を追加します。上記の私の質問を踏まえて、私は次のような解決策に取り組んでいました。
org.example.app
org.example.domain - 従業員 - 会社 - 従業員レベル
org.example.domain.shared - プロセス - ビジネスルール - バリデーター
org.example.infrastructure
うまくいけば、この小さなスニペットが少し明確になります。
したがって、Process、BusinessRule、および Validator の概念はドメイン内にありますが、システムが行うことに関してドメイン モデルをサポートします。