KonzeptKapitel I · Domäne · Baustein 4 von 7

Entities & Value Objects

Entities werden über ihre Identität und ihren Lebenszyklus unterschieden. Value Objects werden vollständig durch ihre fachlichen Werte beschrieben.

  1. EntityGleiche Kennung bedeutet dasselbe Objekt.
  2. Value ObjectGleiche Werte bedeuten gleich.
  3. Vergleich überEntity über Kennung, Wert über alle Werte.

Einordnung

Warum das wichtig ist

Wer Identität und Wert verwechselt, erhält falsches Gleichheitsverhalten: Bestellungen werden nach Feldern verglichen, Beträge wie Einzelobjekte verfolgt. Dazu zählt Primitive Obsession: Ein Betrag als nackte Zahl kennt keine Währung, und Geld gehört nie in eine Gleitkommazahl. Die Konsistenzgrenze mehrerer Objekte behandelt der Baustein Aggregate.

Dieser Baustein erklärt Identität und Wertgleichheit. Für die gemeinsame Konsistenzgrenze mehrerer Objekte siehe Aggregate.

Auf einen Blick · Identität gegen Werte

Eine Entity bleibt über ihre Kennung dieselbe, ein Value Object ist durch seine Werte bestimmt.
Shop-Beispiel · Gleichheitstest

Ist das dasselbe?

Die Bestellung B-1042 bleibt trotz Statusänderung dieselbe Bestellung. Zwei Geldbeträge von 49,90 EUR sind fachlich gleich, sobald Betrag und Währung übereinstimmen.

So liest du das Bild

  1. Entity Bestellung B-1042 vorher und nachher: Kennung gleich, Status anders, trotzdem dieselbe.
  2. Value Object Geldbetrag 49,90 EUR: Betrag und Währung hervorgehoben, beide Seiten gleich.
  3. Vergleich über Die hervorgehobenen Felder zeigen je Paar, worüber verglichen wird.

Bestellung

  • nummerB-1042 (Vergleichsfeld)
  • statusangelegt
  • positionen2 Tassen

Bestellung

  • nummerB-1042 (Vergleichsfeld)
  • statusbestätigt
  • positionen2 Tassen

dieselbe BestellungVergleich über Kennung. Die Kennung ist gleich. Der Status darf sich im Lebenszyklus ändern, die Bestellung bleibt dieselbe.

Wähle ein Paar; hervorgehoben sind die Felder, über die verglichen wird.

Entity und Value Object im Vergleich

Entity und Value Object im Vergleich
MerkmalEntityValue Object
Shop-BeispielBestellung B-1042Geldbetrag 49,90 EUR
Gleichheitgleiche Bestellkennunggleicher Betrag und gleiche Währung
ÄnderungStatus ändert sich über Lebenszyklusneuer Wert ersetzt alten Wert
Bedeutungdieselbe Bestellung verfolgenfachlichen Wert ausdrücken
Die Tabelle fasst zusammen, was die Paare oben im Einzelnen zeigen.

Nutzen & Grenzen

Hilft, wenn

  • Primitive Felder erlauben ungültige oder widersprüchliche Kombinationen.
  • Mehrere Werte werden gemeinsam validiert, verglichen oder berechnet.

Grenzen

  • Nicht jede Zahl braucht ein Value Object. Zu viele Kleinstwerte blähen den Code auf. Es lohnt sich dort, wo Regeln, Validierung oder Rechnen am Wert hängen, etwa bei Geldbetrag mit Währung.
  • Speichern kostet: Werte brauchen eine Abbildung, etwa eingebettete Spalten, und viele ORMs erwarten für Objekte eine Kennung. Plane diese Abbildung in der Persistenz von Anfang an mit ein.

In der Praxis

  1. Fachliche Bedeutung und Bestandteile bestimmen. Gruppiere Werte, die zusammen eine Regel oder Einheit bilden. Das Ergebnis ersetzt unklare primitive Felder durch ein benanntes Konzept.
  2. Validierung und Gleichheit definieren. Lege fest, welche Kombinationen zulässig und wann zwei Werte fachlich gleich sind. Nutze die DDD-Modellierung, um diese Bedeutung mit Fachexperten abzustimmen.
  3. Operationen am Wert absichern. Biete nur Rechen- oder Vergleichsoperationen an, die für gültige Werte Sinn ergeben. Prüfe, wie das Value Object in einem Aggregat zu dessen Invarianten beiträgt.
  4. Primitive Obsession ablösen. Ersetze betrag: number durch Geldbetrag(4990 Cent, EUR) und prüfe die Zulässigkeit beim Erzeugen. Halte Geld in der kleinsten Einheit statt als Gleitkommazahl, damit Rundungsfehler gar nicht erst entstehen.
Ausführliche Erklärung lesen

Ein Value Object fasst Eigenschaften zusammen, die gemeinsam eine fachliche Bedeutung bilden. Gleichheit ergibt sich aus diesen Bestandteilen; Änderungen werden häufig durch einen neuen Wert dargestellt. Validierung bei der Erzeugung verhindert unzulässige Zustände. Entities unterscheiden sich durch stabile Identität; Aggregates nutzen Werte, um Invarianten innerhalb einer Grenze auszudrücken. Das übergeordnete Domain-Driven Design ordnet beide Konzepte in ein fachliches Modell ein.

Value Objects eignen sich für unveränderliche Konzepte mit wohldefinierten Operationen. Ihre Gleichheitsregeln müssen fachlich klar sein; technische Referenzgleichheit reicht nicht. Werte sollten keine veränderlichen inneren Zustände teilen, damit Gleichheit und Validierung über ihre Lebensdauer gültig bleiben.

Eine unveränderliche Oberfläche genügt nicht, wenn innere Referenzen veränderlich bleiben. Werte teilen daher keinen veränderlichen Zustand, sonst ändert sich ein Wert, ohne dass jemand ihn ersetzt hat.

Selbst prüfen

Teste dich in drei Stufen

  1. AblesenIm Bild nachsehen

    Warum gelten 49,90 EUR und 49,90 USD als verschiedene Werte, obwohl der Betrag gleich ist?

    Lösung mit Begründung ansehen

    Verglichen werden Betrag und Währung gemeinsam. Weicht eines der beiden Felder ab, ist es ein anderer Wert.

  2. AnwendenAuf eine neue Lage übertragen

    Eine Position über 49,90 EUR wird auf 44,90 EUR rabattiert. Was geschieht mit dem Wert?

    Lösung mit Begründung ansehen

    Der alte Wert wird nicht verändert, sondern durch einen neuen Geldbetrag von 44,90 EUR ersetzt.

  3. BewertenEine Alternative abwägen

    Ist eine Adresse ein Value Object oder eine Entity?

    Lösung mit Begründung ansehen

    Das hängt vom Kontext ab. In der Bestellung zählen nur die Angaben, also ein Wert. Eine Kundenverwaltung mit Adressbuch kann sie als Entity führen. Welcher Kontext gilt, klärt der Bounded Context.

Weiter im Lernpfad

Als Nächstes in Domänenmodellierung: Aggregate.