2017-08-10 1 views
1
  1. Entitäten sollten keinen Gleichheitsvergleich haben (https://www.youtube.com/watch?v=xRCOKKUSp9s).
  2. Wert Objekte Gleichheitsvergleich haben sollen (https://www.youtube.com/watch?v=xRCOKKUSp9s)
  3. Wert Objekte können gleich Entitäten (Domain-Driven Design Buch)
  4. Wert Objekte verweisen, wenn alle (oder einige?) Ihre Attribute gleich sind (dies ist nicht so explizit angegeben, aber es scheint natürlich, 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). Es kann seltene Ausnahmen geben (zB (1, min) == (60, Sekunden)).

Wenn also ein Wertobjekt eine Referenz auf ein Unternehmen hat, wie sollen wir sind Unternehmen in diesem equals() Vergleich, wenn wir nicht equals() auf Unternehmen anrufen können? Wo ist der Fehler?Wie wird die Gleichheit von Entitäten und Wertobjekten in DDD ordnungsgemäß implementiert?

Für mich ist es natürlich zu implementieren Entity.equals() (in der Regel basierend auf Typ und ID). Es ist seltsam, dass ich auf dieses Video gestoßen bin (1).

Antwort

0

Wertobjekte sind gleich, wenn alle ihrer Attribute gleich sind. Jetzt sehen wir, wie es für Wertobjekte ist, die sich auf Entitäten beziehen. Entitäten müssen eine eindeutige Kennung (ID) haben und diese ID ermöglicht dem Wertobjekt, auf die Entität Bezug zu nehmen. Mit anderen Worten, das Wertobjekt hat ein Attribut mit der Entitäts-ID (z. B. Benutzer-ID), und in vo.equal() fügen Sie einfach dieses Attribut ein.

Ich glaube nicht, dass es erforderlich ist, Entity.equals() zu implementieren. Entitäten sind so konzipiert, dass sie einzigartig sind, auch wenn sie alle die gleichen Attribute haben. Aus diesem Grund verwenden wir ID, um sie zu unterscheiden. Es könnte sein, dass man fragen muss "beziehen sich diese beiden VOs auf dieselbe Entität?" (dasselbe Beispiel im ersten Video, Sekunde 0:33), aber ansonsten sehe ich keine Notwendigkeit, Entitäten zu vergleichen.

+0

Ich denke nicht, dass es normalerweise ein gutes Design ist, wenn verschiedene Entitäten alle gleiche Felder haben, aber sich nur in der ID unterscheiden, die von der Datenbank erzeugt wird (naja, vielleicht gibt es einige seltene Ausnahmen). Ich denke, sie sollten in der Regel mindestens einen eindeutigen Satz von Feldern haben (z. B. Personencode, nicht nur Datenbank-generierte Personen-ID). –

+0

Syntax 'entity1.equals (entity2)' ist sauberer als 'entity1.getId(). Equals (entity2.getId()) && entity1.getClass(). Equals (entity2.getClass()) 'erwähnt fehlende Null-Überprüfungen sogar nicht . Auch 'entity1.equals (entity2)' ist sauberer als 'Entities.equal (entity1, entity2)' oder 'Entities.equalIdsAndTypes (entity1, entity2)' (z. B. Objekte in eine Hash-Tabelle einfügen). –

+0

Entitäten müssen IDs haben, aber nicht unbedingt Datenbank generiert. Wenn Sie beginnen, diese ID zu ignorieren und die Entitäten Feld für Feld zu vergleichen, werden Sie den Punkt der Verwendung von Entitäten und Wertobjekten übersehen. –

Verwandte Themen