値オブジェクトとエンティティオブジェクト(ドメイン駆動設計) 質問する

値オブジェクトとエンティティオブジェクト(ドメイン駆動設計) 質問する

DDD を読み始めたばかりです。エンティティ オブジェクトと値オブジェクトの概念を完全に理解できません。値オブジェクトがエンティティ オブジェクトとして設計されている場合にシステムが直面する可能性のある問題 (保守性、パフォーマンスなど) について説明していただけますか? 例があると助かります...

ベストアンサー1

本質的な違いをまとめると、エンティティでは ID が重要ですが、値オブジェクトでは重要ではありません。たとえば、誰かの名前は値オブジェクトです。顧客エンティティは、顧客の名前 (値オブジェクト)、List<Order> OrderHistory (エンティティのリスト)、および既定のアドレス (通常は値オブジェクト) で構成される可能性があります。顧客エンティティには ID があり、各注文には ID がありますが、名前にはありません。一般的に、オブジェクト モデル内では、アドレスの ID は重要ではない可能性があります。

値オブジェクトは通常、不変オブジェクトとして表すことができます。値オブジェクトの 1 つのプロパティを変更すると、本質的には古いオブジェクトが破棄され、新しいオブジェクトが作成されます。これは、コンテンツほど ID を気にする必要がないためです。適切には、オブジェクトのプロパティが別のインスタンスのプロパティと同一である限り、Name の Equals インスタンス メソッドは「true」を返します。

ただし、Customer などのエンティティの属性を変更しても、顧客は破壊されません。Customer エンティティは通常、変更可能です。ID は同じままです (少なくともオブジェクトが永続化された後は)。

おそらく、気付かないうちに値オブジェクトを作成しているでしょう。きめ細かなクラスを作成してエンティティの側面を表現するときはいつでも、値オブジェクトが作成されます。たとえば、有効な値に制約があるものの、より単純なデータ型で構成されているクラス IPAddress は値オブジェクトになります。EmailAddress は文字列の場合もあれば、独自の動作セットを持つ値オブジェクトの場合もあります。

データベース内で ID を持つ項目であっても、オブジェクト モデル内では ID を持たない可能性は十分にあります。しかし、最も単純なケースは、一緒に意味を持ついくつかの属性の複合です。Customer.FirstName、Customer.LastName、Customer.MiddleInitial、Customer.Title を Customer.Name として一緒に構成できる場合、これらの属性はおそらく必要ありません。永続性について考える頃には、データベース内で複数のフィールドになっている可能性がありますが、オブジェクト モデルでは気にしません。

おすすめ記事