2009-08-24 6 views
5

this definitionによると、貧血ドメインモデルのファウラーの概念は次のとおりです。貧血ドメインモデルは、ドメインモデルのユーティリティ/サポートクラスを「ヘルパー」として使用できないことを意味しますか?

ビジネスロジックはドメインが付き

オブジェクト 外に実装されているソフトウェアのドメインモデルこのパターンでは、ロジックは通常 で、別のクラスで実装されています。 はstを変換します。ドメイン のオブジェクトを食べました。ファウラーはそのような外部の クラスのトランザクションスクリプトを呼び出します。

ショッピングカートの例を挙げると、Cartオブジェクトはドメインオブジェクトになります。しかし、カートを最終注文まで処理するには、注文在庫を確認し、クレジットカードの支払いを処理する必要があります。 Cartオブジェクトの中のすべてを行うことは、Cartクラスが巨大で扱いにくいことを意味するので、これらの多くのことはユーティリティクラスを必要とします。つまり、この例のカートは貧血ドメインモデルであり、これらのユーティリティクラスは上記の定義に従って「トランザクションスクリプト」となるでしょうか?

答えて

4

ドメイン駆動設計の重要な概念は、ドメイン専門家(ビジネスユーザー)の専門用語を伝達し、反映する豊かなデザインを作成することです。次に、コードをそのドメインモデルの式にします。 (DDD Patterns summariesの「ユビキタス言語」と「モデル駆動設計」を参照)。

このようにすると、ビジネスユーザーがビジネスユーザーを表現する方法を反映するエンティティ(クラス)の名前が作成されます。さらに、それらのクラスにドメインを反映するメソッドを作成します。

これを念頭に置いて、 "ヘルパー"または "ユーティリティ"クラスの考え方を検討すると役に立ちます。私はこれらの例は、完全な、あるいは完全に正確ではありません実現

creditCard = this.getCreditCart(creditCardNumber); 
purchaseNumber = creditCard.Charge(shoppingCart.Total); 

:のようなあなたのCustomer.Purchase方法は、物事を行う可能性があります

product = GetProduct(data.productId); 
shoppingCart.add(product); 
receipt = customer.Purchase(shoppingCart); 

:あなたの記述の一部を使用して、次のようなクラスやメソッドを持っているかもしれませんしかし、そのアイデアが参考になることを願っています。

あなたの元の質問に答えて - はい、ユーティリティをサポートクラスにすることはOKです。ただし、これらのサポートクラスを作成し、それらを実際のドメインエンティティにマップする必要があります。ユーザーと作業した後、トランザクションスクリプトエンティティ以上の意味のあるドメインのエントリを作成できるようになります。

これが役に立ちます。がんばろう!

+1

私の好奇心を許していますが、私が理解したように、ドメインクラスの上記Purchase()のようなメソッドを完全に禁止しています。 貧血ドメインモデルでは、ドメインクラスにはゲッター/セッター以上のものはなく、ドメインクラスの外で実装されたすべての(!)動作に終わります。 したがって、上記の前提で、貧血ドメインモデルを採用すると、他に選択肢がないので、ヘルパー/ユーティリティクラスを使用するよう強制されます。 なぜ両方の世界のベストを使用してください:ドメインモデルのユニバーサルアルゴリズムと外部の残りの部分! Stefan – struppi

+1

@struppi - なぜ上記のPurchase()のようなメソッドは禁止されていますか?この方法は、購入を実行するビジネスロジックが含まれているため、取得/設定する以上の可能性があります。 –

1

Chrisが言ったように、これらのサポートクラスがユーザーの言語から検出された実際のドメインエンティティにマッピングされている場合は、ユーティリティをサポートすることができます。場合によっては、ヘルパークラスの多くは、セッターを主に持つクラスに関連する場合には、貧血モデルの症状です。&ゲッター(ドメインオブジェクトに正しく割り当てられていない動作からヘルパーが成長するシナリオ)

関連する問題