2012-02-24 14 views
2

エンティティメソッドに値オブジェクトを(DDDに関して)渡すのがよい方法ですか? たとえば、私は私のエンティティのお客様に方法があります:それは有効な値オブジェクトをエンティティメソッドに渡す

SetAddress(Address invoiceAddress); 

のですか?または、アドレスのパラメータを

SetAddress(string street, string town, string zip, string country); 

として渡し、必要に応じて例外をスローするようにしてください。

アドレスは不変オブジェクトです。

答えて

5

Addressオブジェクトを確実に渡す必要があります。これはDDDの点で有効であり、拡張性にも優れています(つまりAddressオブジェクトにSetAddressメソッドのシグネチャを変更せずにフィールドを追加できます)。

またAddressオブジェクトがCustomer.SetAddress(...)方法はアドレス設定の前に実行することができる、アドレス情報のための検証ロジックを含むべきである:ビューのオブジェクト指向の観点から

public class Customer 
{ 
    public SetAddress(Address invoiceAddress) 
    { 
     // ToDo: Execute validation logic encapsulated in 'Address' object 
     // ToDo: Execute additional validation logic here 
    } 
} 
+0

okありがとう、私はこれが正しいと思ったが、私は確信がなかった – Ivan

+0

あなたは大歓迎です。 –

0

あなたが

public class Address 
{ 
    public static Create(string street, string zip) 
    { 
     return new Address { Street = street, Zip = zip }; 
    } 
} 

アドレス

の一部としてファクトリメソッドを持っている可能性がアイデア Createのためのparamsは、Addressオブジェクトを作成するための必須プロパティが何であるかを示すことがあること。

var address = Address.Create("street", "zip"); 

customer.SetAddress(address); 
+0

住所私はパラメータを使ってコンストラクタを定義していますので、結果は同じです。私の質問:顧客クラスはアドレスVOを作成する責任がありますか、それともメソッドに渡すだけですか?投稿してくれてありがとう。要するに、お客様は住所を作成する責任を負いません。 – Ivan

+0

有効なアドレスがどのようなものかはアドレスのみが知っています。 –

1

SetAddress()の三つの引数はAddress表しますしたがって、Addressクラスのインスタンスにカプセル化する必要があります。 SetAddressを実行する方法がある理由がわかりませんが、代わりにsetterを使用できませんか?

SetAddress()が公に利用可能な場合、メソッドの呼び出し側は、3つのインコヒーレントな文字列引数について心配する必要はありません。さらに重要なのは、引数の順序は、関数名(SetAddress()は、引数の順序がストリート、タウン、ジップ、国または通り、町、国、zipのいずれであるかについての情報を提供しません)を調べることで判断できません。呼び出し元が引数の順序を混同するのは簡単です。

このようなシナリオを避けるには、Addressのインスタンスに明確に示されている型の引数を受け入れることがベストです。

+0

私はアドレスオブジェクトの不変性を破ることができますundrestood。 – Ivan

+0

'Address'インスタンスは町、zipなどのセッターを公開し、コンストラクターを介してのみ初期化されるように設計できます。 –

関連する問題