Sollte die bekannte Geschäfts-ID eines Unternehmens in DDD / OOP mit einem dedizierten Typ dargestellt werden?

9

In der Praxis bedeutet dies, einen benutzerdefinierten (unveränderlichen) classüber einen stringoder einen anderen primitiven Typ zu verwenden.

Beispiele:

  1. Veröffentlichung: International Standard Book Number.
  2. Finanzen: Internationale Wertpapieridentifikationsnummer.

Vorteile:

  1. Kann das Format eines Bezeichners sicherstellen.
  2. Wird ein erstklassiges Mitglied des Modells.

Nachteile:

  1. Fügt Persistenzreibung hinzu (z. B. Entity Framework).
  2. Mehr Code.
Den
quelle
Sollten Sie eine benutzerdefinierte Klasse verwenden? Sicher. Sollten Sie sie als IDs verwenden? Absolut nicht :) Eine ID mit einer Geschäftsbedeutung würde unterwegs Probleme verursachen.
Songo
2
@Songo mir , dass ein Argument ist , dass die IDs sollten Wert Semantik , aber primitive Typen sind nicht die einzigen Typen mit Wertesemantik, so dass nicht notwendigerweise imo Klassen auszuschließen. Fühlen Sie sich frei, eine konkurrierende Antwort zu posten, da ich vergessen habe, diesen Punkt zu machen.
Ixrec
1
Eine alte Frage von mir berührte das Thema mit unterschiedlichen Meinungen: programmers.stackexchange.com/questions/281827/… Ich habe die Typen erstellt und mache dies auch weiterhin.
Ziv

Antworten:

6

Wenn Sie der Klasse genügend nützliche Funktionen geben können, um die zusätzliche Komplexität zu rechtfertigen, keine Zeichenfolge zu sein, tun Sie dies. Ich vermute, dass dies bei Kennungen wie ISBN und ISIN nicht der Fall ist.

Damit eine Bezeichnerklasse nützlich ist, würde ich erwarten, dass sie ungefähr so ​​aussieht:

class ISIN {
    fromCUSIP()
    fromRawISINString()
    toString(ISIN::FormatType)
    getExchange()
    getCountryCode()
    getLastFourDigits()
    getWhateverCode()
    ...
}

Wenn es stattdessen eher so aussieht:

class ISIN {
    getString()
    setString()
}

Dann würde ich die Klasse komplett fallen lassen, überall reguläre Zeichenfolgen verwenden und sicherstellen, dass ich in allen relevanten Variablennamen konsistent "isin" verwende.

Beachten Sie, dass das Hinzufügen eines neuen Typs in einigen Sprachen in typischen Programmen fast keine "zusätzliche Komplexität" aufweist. In diesem Fall sollten Sie den neuen Typ erstellen, auch wenn er überhaupt keine Funktionalität hat. Dies ist jedoch bei den meisten traditionellen OOP-Sprachen wie C ++ nicht der Fall.

Ixrec
quelle
6

Ich würde sagen, mach mit. Ich würde argumentieren, dass die Vorteile in diesem Fall die Nachteile überwiegen. Der zusätzliche Code ist wahrscheinlich ziemlich gering und das Persistenzproblem kann ziemlich einfach gelöst werden, indem eine Art Konverter zwischen Ihrer neuen Klasse und dem Typ bereitgestellt wird, den die Datenbank erwartet (ich habe Entity Framework noch nie verwendet, aber ich weiß, dass dies relativ schmerzlos ist Überwintern).

Einer der Vorteile, die Sie durch das Definieren Ihrer eigenen Klasse erhalten können, besteht darin, dass der Compiler sicherstellen kann, dass alle Methoden, die eine ISBN oder eine ISIN wünschen, zur Kompilierungszeit wissen , ob Sie versuchen, den falschen Wert zu übergeben. Es wird auch viel schwieriger sein, dieses Feld in Ihrer Entität versehentlich zu überschreiben. Wir können solche häufigen Fehler vollständig vermeiden:

book.setAuthor(otherBook.getAuthorName());
book.setIsbn(otherBook.getAuthorName());
book.setPrice(otherBook.getPrice())

Wenn ISBN eher eine Klasse als ein primitiver Typ ist, wird der obige Code nicht einmal kompiliert, was später viel Debugging-Zeit spart.

Matt Watson
quelle
1
Setter und Getter? Ist es 1992?
Miles Rout