2009-04-27 12 views
0

ドメイン駆動型デザインでは、アイデンティティを持つオブジェクトがエンティティであることはよく知られています。例えば、どんな人もアイデンティティ(名前など)をいくつか持っています。エンティティ/値オブジェクトの選択

しかし、値オブジェクトは同一性のないオブジェクトです。共通の値オブジェクトの1つはアドレスですが、アドレスには同一性がありません。しかし、データベース層では、複合キーを持つことができます。このコンセプトはDDDで機能しますか?道路名、郵便番号、ドア番号(市町村などの情報は省略)の組み合わせで住所を識別できるようになります。お金は別の価値オブジェクトです。

単一の識別可能なフィールドを持たないオブジェクトでは区別があり、値オブジェクトは実際にエンティティに属していない傾向があります。たとえば、「私」(私の名前に置き換えられる)は靴などを着用するかもしれないが、「私は靴、シャツなどではない」(http://www.lostechies.com/blogs/joe_ocampo/archive/2007/04/23/a-discussion-on-domain-driven-design-value-objects.aspx)。

これは物事を考える正しい方法ですか?また、この考え方/アプローチでは、これをC#の値/参照型選択に適用できます。私はDDDのアプローチにもかかわらず行くかもしれない?おそらく、より良いあなたが一致言って - 私は、彼らがドメイン駆動設計中で理解されているように私はこれまで、この問題の専門家から午前かかわらず、あなたは(正しいエンティティと値型の区別の概念を持っていると思う

おかげ

答えて

0

これらの概念の私の理解)。しかし、これらのオブジェクトをC#で参照または値としてモデル化するかどうかを決定する際には、これを決定メトリックとして使用することをお勧めします。

値と参照型の主な違いは、値型がメソッドに渡されるときに値の型がコピーされることです。これは、ヒープではなくスタック上に座る可能性が高く、渡すコストが高くなる可能性があることを意味します。そのようなサイズは検討の要因になります。構造体は16バイト以下のサイズ(備考hereの下)であり、包括的なアドレス構造(ハウスナンバー、ハウス名、ストリートリージョン、都市、国など)は簡単にこれを破ることが推奨されます。

エンティティ:value :: class:structのセマンティクスは非常によく似ており、そのようにデータをモデリングすることで多くのメリットが得られます(同じ住所に住む2人は共有するは、ある人の住所を変更しても他の人の住所を変更すべきではないので、住所は構造体としてこの種の分離を強制するでしょう。しかし、パフォーマンスとメモリの考慮事項があります。おそらく、不変のクラスは、これらの値の型に適しているでしょうか?

要約:DDDのエンティティと値の区別は、オブジェクトの内容に基づいています。コードでは、あなたがそれを使って何をしようとしているのかに基づいているべきです。

+0

エンティティ/値オブジェクトの区別は、C#のクラスと構造体の選択に役立ちます。私は例外が発生する可能性のある考慮事項があると確信しています(逆のタイプを選択すると、オブジェクトに関する他のすべての事実が1つのタイプに適しています)。ただし、アドレス(建物)を変更することはできます。これは変更可能ではありませんか?エンジンは構造体と小さなアイテムの複合体ですが、変更することもできます。 – dotnetdev

+0

正直なところ私はあなたのコメントに完全に従っているかどうかはわかりませんが、アドレスの変更に関して、私が不変のクラスを提案したのは、人物Aのアドレスへの変更が、あなたがAという人のために新しいユニークなインスタンスを作成するように強制するので、アドレスクラスのインスタンスを作成する必要があります。これはstructから得られる主な利点であり、私はクラスで同じ動作をすることが可能であることを示しています。 –

+0

ビジネスの観点から見ると少し難解です。 たとえば、家族には家がありますが、これも参照型です。子供たちが若いとき、彼らは家を動かすことはないので、家は共通の参考資料です。 – dotnetdev