Unique Value Object vs Entity

8

Beim Versuch, einige Entitäten in Wertobjekte umzuwandeln, stecke ich in einem Fall fest, in dem das, was als Wertobjekt erscheint, innerhalb eines Aggregats eindeutig sein muss.

Angenommen, wir haben eine Movie- Entität, die die Wurzel eines Aggregats bildet. Dieser Film Einheit ist mit einem gewissen Satz von verwandten AdvertisementEvent Objekte mit der Rolle der Anzeige einer Werbung zu bestimmten Zeitstempel.

Das AdvertisementEvent enthält einen Link zu einem Banner , das angezeigt werden muss, die Koordinaten und einige Effektfilter.

Da AdvertisementEvent nur eine Sammlung von Konfigurationsparametern ist, bin ich mir nicht sicher, ob ich mich um seine Identität kümmern und es wie ein Objekt mit großem Wert behandeln soll. Es ist mir jedoch wichtig, dass innerhalb eines Films zu einem bestimmten Zeitstempel nur ein Werbeereignis vorhanden sein muss , wahrscheinlich sogar um die Zeitstempel herum .

Es fällt mir schwer, meine Zweifel in mehrere unabhängige Fragen aufzuteilen.

  1. Klingt eine Sammlung von Konfigurationsparametern wie ein Wertobjekt?
  2. Mische ich das Konzept der Einzigartigkeit von AdvertisementEvent innerhalb der Film- und Transaktionsintegritätsregel?
  3. Bedeutet eine der Auswahlmöglichkeiten in Punkt (2), dass AdvertisementEvent Mitglied des von Movie erstellten Aggregats sein muss ?
  4. Ist mein AdvertisementEvent- Objekt eine Entität, ein Wertobjekt oder ein Ereignisobjekt? (Ich habe das Ereignissuffix im Namen verwendet, um meine Verwirrung hervorzuheben.)
  5. Sind solche großwertigen Objekte ein Designgeruch?

Ich denke, ich habe es nicht mit einem Ereignis im Sinne von DDD zu tun, weil es nicht einfach so passiert . Das eigentliche DDD-Ereignis sollte eher AdvertisementEventReached ähneln

SystematicFrank
quelle

Antworten:

9

Die Unterscheidung zwischen Entity- und Value-Objekt sollte sich auf die Frage stützen: Wenn ich zwei Objekte mit demselben Inhalt habe (zwei AdvertisementEvents , die mit denselben Parametern mit demselben Banner verknüpft sind ), sollte ich sie unterschiedlich behandeln oder kann eines durch das andere ersetzt werden ohne die Funktionsweise der Software zu beeinflussen?

In diesem Fall würde ich sagen, dass Sie ein AdvertisementEvent durch ein anderes mit denselben Werten ersetzen können, ohne den Betrieb der Software zu beeinträchtigen. Dies macht sie zu Wertobjekten (der enthaltene Wert ist das, was zählt, nicht die Identität des Objekts selbst).

Bezüglich der Größe eines Value-Objekts: Solange es einen zusammenhängenden Parametersatz für eine einzelne Verantwortung enthält, gibt es keine Begrenzung für die Größe eines Value-Objekts. Bei der Implementierung kann es sinnvoll sein, großen Wertobjekten besondere Aufmerksamkeit zu widmen, um sicherzustellen, dass sie nicht unnötig und übermäßig kopiert werden. Andernfalls ist dies kein Problem.

Was die Einschränkungen für die Anzahl der Werbeereignisse in einem Film betrifft , so ist dies eine Einschränkung für die Beziehung zwischen einem Film und seiner Sammlung von Werbeereignissen , nicht für eine dieser Klassen einzeln. Daher ist der logischste Ort zum Erzwingen der Einschränkung der Punkt, an dem die Sammlung in Movie verwaltet wird (also in der Methode, in der Sie versuchen, ein AdvertisementEvent hinzuzufügen ).

Bart van Ingen Schenau
quelle
Vielen Dank! Obwohl ich so oft gelesen habe, wie man diese Frage stellt, um Entitäten von Wertobjekten zu unterscheiden, hat sie diesmal endlich "geklickt". Ich glaube, ich brauchte ein Problem in meinem wirklichen Leben, um diese Lektion zu lernen. Ich liebe mein Problem, weil es ein Ereignisobjekt (das kein Domänenereignis ist) und eine scheinbare Einzigartigkeit (die eine Invariante ist) enthüllte. Ich denke, dass ich in meiner Frage "invariant" anstelle von "Transaktionsintegritätsregel" hätte sagen sollen.
SystematicFrank
Interessant ... als Nebeneffekt, um diesen Unterschied besser zu verstehen, kann ich jetzt klar erkennen, wie wichtig zustandslose / unveränderliche Wertobjekte sind, um die Stabilität meines Programms zu verbessern. Ich denke, ich habe zu viel über Details der GUI-Implementierung nachgedacht ... einfache Mutation ist in der Anwendungsschicht nett, aber in der Domänenschicht möchte ich, dass das AdvertisementEvent unveränderlich ist!
SystematicFrank