私は DDD が初めてで、いくつかの概念を理解しようと懸命に努力しています。ドメイン内でどのオブジェクトが Entity オブジェクトで、どのオブジェクトが Value オブジェクトであるかをどのように判断し、どのように正確に異なる扱いをするのでしょうか?
2 に答える
エンティティ「これは私のエンティティです。似たようなものはたくさんありますが、これは私のものです」</p>
エンティティの重要な特徴を定義するのは、アイデンティティを持っていることです。エンティティはシステム内で一意であり、同じアイデンティティを持たない限り、同じエンティティがどれほど類似していても、他のエンティティは存在しません。
ID はエンティティでさまざまな方法で表すことができます。数値識別子 (従来の CustomerID)、Guid (従来の ... 気にしないでください)、または自然キー (顧客の CustomerNumber など) である可能性があります。最初にあなたから購入したときに、CRM システムによって提供されます)。
どちらの表現方法を選択しても、エンティティは ID を持つことによって定義されます。
値オブジェクト 値オブジェクトの重要な特徴は、ID がないことです。少し単純化されているかもしれませんが、値オブジェクトの意図は、属性のみで何かを表すことです。2 つの VO が同一の属性を持つ場合があり、その場合、それらは同一です。ただし、属性以外の価値はありません。
VO に共通するもう 1 つの側面は、VO はおそらく不変であるべきであり、一度作成されると変更または変更できないことです。新しいものを作成できますが、ID がないため、別のものを変更するのと同じです。
自動車工場システム アプリケーション (プレートなし) の POO のカー クラスを考えてみましょう。2 台の車が同じ (同じモデル、エンジン、色、重量など) であっても、すべての車は一意であり、ID車両識別番号によって区別できます。
2 台の車は、その属性Car1.equals(Car2)
が同じであることはありますが、VIN が原因で同じ車ではありませんCar1 != Car2
。車の色が変わった場合、それは他の車ではなく、他の属性を持つ同じ車です。これはエンティティです。
name
ここで、とフィールドを使用して (車の) カラー クラスを考えRGB
ます。シアン色は'Cyan'
名前に とがありR = 0 G = 255 B = 255
ます。その属性が ID であるため、他の ID フィールドは必要ありません。色はVOであり、名前またはRBG(またはその両方)を変更すると他の色を表すため、不変でなければなりません...または名前とRGBが一致しない場合、この場合のバグ;)
Color1.equals(Color)
Color1 == Color2
常に同じ結果が得られる必要があります。
私が見ているように、ドメイン オブジェクトは基本的にビジネス ドメインの名詞を表し、ID を持っていますが、値オブジェクトはビジネスにとって特別な意味を持たず (MonetaryAmount を考えてください)、ID を持っていません。