2017-08-10 4 views
1
  1. エンティティは等価比較(https://www.youtube.com/watch?v=xRCOKKUSp9s)を持つべきではありません。
  2. 値オブジェクトが等価比較を持っている必要があります(https://www.youtube.com/watch?v=xRCOKKUSp9s)は、エンティティ(ドメイン駆動設計・ブック)すべて(または一部?)その属性のが等しい場合
  3. 値のオブジェクトが等しいを参照することができ
  4. 値オブジェクト(これは、そのように明示されていないが、自然のようだ、https://martinfowler.com/bliki/ValueObject.html,http://enterprisecraftsmanship.com/2016/01/11/entity-vs-value-object-the-ultimate-list-of-differences/https://projectlombok.org/features/Value)。まれな例外がある可能性があります(たとえば、(1、min)==(60、seconds))。

値オブジェクトは、エンティティへの参照を持っている場合、我々は実体上equals()を呼び出すことはできませんのであれば、どのように我々はそのequals()比較してエンティティを含める必要がありますか?欠陥はどこですか?DDDでエンティティと値オブジェクトの等価性を正しく実装するにはどうすればよいですか?

私にとっては、Entity.equals()(通常はタイプとIDに基づいて)を実装するのは当然です。私はそのビデオ(1)に遭遇したことは奇妙です。

答えて

0

のすべての属性が等しい場合、値オブジェクトは等しいです。次に、エンティティを参照する値オブジェクトの仕組みを見てみましょう。エンティティは一意の識別子(ID)を持つ必要があり、そのIDは値オブジェクトがエンティティを参照できるようにしています。言い換えれば、値オブジェクトにはエンティティID(たとえばuserID)を持つ属性があり、vo.equal()にはその属性を含めるだけです。

Entity.equals()を実装する必要はありません。エンティティはすべて同じ属性を持っていても一意になるように設計されているため、IDを使用してそれらを区別するのはそのためです。 「この2つのVOは同じエンティティを指していますか?」と尋ねる必要があるかもしれません。 (最初のビデオの2番目の0:33の同じ例ですが)エンティティを比較する必要はありません。

+0

構文 'entity1.equals(entity2)'は 'entity1.getId()。equals(entity2.getId())&&& entity1.getClass()。equals(entity2.getClass())'よりもクリーンです。 。また、 'entity1.equals(entity2)'は 'Entities.equal(entity1、entity2)'や 'Entities.equalIdsAndTypes(entity1、entity2)'よりもクリーンです(たとえば、オブジェクトをハッシュテーブルに置くことを考えてください)。 –

+0

エンティティにはIDが必要ですが、必ずしもデータベースが生成される必要はありません。そのIDを無視してエンティティをフィールドごとに比較を開始すると、エンティティと値オブジェクトを使用するポイントがなくなります。 –

関連する問題