2017-08-10 1 views
1
  1. Les entités ne doivent pas avoir de comparaison d'égalité (https://www.youtube.com/watch?v=xRCOKKUSp9s).
  2. objets de valeur doivent avoir la comparaison de l'égalité (https://www.youtube.com/watch?v=xRCOKKUSp9s)
  3. objets de valeur peuvent faire référence entités (livre de Domain-Driven Design)
  4. objets de valeur sont égaux si tous (ou une?) De leurs attributs sont égaux (celui-ci est pas si explicitement indiqué, mais il semble naturel, 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). Il peut y avoir de rares exceptions (par exemple, (1, min) == (60, secondes)).

Donc, si un objet de valeur a une référence à une entité, comment doit-on inclure dans cette comparaison entité equals() si nous ne pouvons pas appeler equals() sur l 'entité? Où est la faille?Comment implémenter correctement l'égalité des entités et des objets de valeur dans DDD?

Pour moi, il est naturel d'implémenter Entity.equals() (généralement basé sur le type et l'ID). C'est étrange que j'ai rencontré cette vidéo (1).

Répondre

0

Les objets de valeur sont égaux si tous de leurs attributs sont égaux. Voyons maintenant comment cela se passe pour les objets de valeur qui se réfèrent à des entités. Les entités doivent avoir un identifiant unique (id) et cet identifiant permet à l'objet de valeur de se référer à l'entité. En d'autres termes, l'objet value aura un attribut qui aura l'identifiant de l'entité (userID par exemple) et dans le vo.equal() vous incluez simplement cet attribut. Je ne pense pas qu'il soit nécessaire d'implémenter Entity.equals(). Les entités sont conçues pour être uniques même si elles ont toutes les mêmes attributs et c'est pourquoi nous utilisons l'ID pour les différencier. Il pourrait être nécessaire de demander "est-ce que ces deux VO se réfèrent à la même entité?" (même exemple dans la première vidéo deuxième 0:33) mais à part ça je ne vois pas le besoin de comparer les Entités.

+0

Je ne pense pas que ce soit habituellement un bon design si différentes entités ont toutes des champs égaux mais ne diffèrent que par l'ID, qui est généré par la base de données (enfin, il y a peut-être de rares exceptions). Je pense qu'ils devraient généralement avoir au moins un ensemble unique de champs (par exemple, le code de la personne, pas seulement l'ID de la personne générée par la base de données). –

+0

Syntaxe 'entity1.equals (entity2)' est plus propre que 'entity1.getId(). Est égal à (entity2.getId()) && entity1.getClass(). Est égal à (entity2.getClass())' même ne mentionne pas les vérifications manquantes manquantes . Aussi 'entity1.equals (entity2)' est plus propre que 'Entities.equal (entity1, entity2)' ou 'Entities.equalIdsAndTypes (entity1, entity2)' (considérez, par exemple, placer des objets dans une table de hachage). –

+0

Les entités doivent avoir des ID mais pas nécessairement la base de données générée. Si vous commencez à ignorer cet ID et à comparer les entités par champ, il vous manquera le point d'utiliser les entités et les objets de valeur. –