Nehmen wir ein weiteres Beispiel, das weniger mit Vorstellungen und Erwartungen behaftet ist. Ich habe hier eine Aufzählung, und das sind die Prioritäten für einen Fehler.
Welchen Wert speichern Sie in der Datenbank?
Also, ich könnte zu speichern 'C'
, 'H'
, 'M'
, und 'L'
in der Datenbank. Oder 'HIGH'
so weiter. Dies hat das Problem der Eingabe von Zeichenfolgen . Es gibt einen bekannten Satz von gültigen Werten, und wenn Sie nicht diesen Satz in der Datenbank zu speichern, kann es schwierig sein , mit zu arbeiten.
Warum speichern Sie die Daten im Code?
Sie haben List<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
oder etwas in diesem Sinne im Code. Dies bedeutet, dass Sie verschiedene Zuordnungen dieser Daten zum richtigen Format haben (Sie fügen alle Großbuchstaben in die Datenbank ein, aber Sie zeigen sie als an Critical
). Ihr Code ist jetzt auch schwer zu lokalisieren. Sie haben die Datenbankdarstellung der Idee an eine im Code gespeicherte Zeichenfolge gebunden.
Überall dort, wo Sie auf diese Liste zugreifen müssen, müssen Sie entweder über Codeduplizierung oder eine Klasse mit einer Reihe von Konstanten verfügen. Beides sind keine guten Optionen. Man sollte auch nicht vergessen, dass es andere Anwendungen gibt, die diese Daten verwenden (die möglicherweise in anderen Sprachen geschrieben sind - die Java-Webanwendung verwendet ein Crystal Reports- Berichtssystem und einen Perl- Batch-Job, der Daten einspeist). Das Berichtsmodul muss die gültige Liste der Daten kennen (was passiert, wenn 'LOW'
keine Priorität markiert ist und Sie wissen müssen, dass dies eine gültige Priorität für den Bericht ist?), Und der Batch-Job muss die Informationen darüber enthalten, welche Daten gültig sind Werte sind.
Hypothetisch könnte man sagen "Wir sind ein einsprachiger Shop - alles ist in Java geschrieben" und haben eine einzige .jar-Datei, die diese Informationen enthält - aber jetzt bedeutet dies, dass Ihre Anwendungen eng miteinander verbunden sind und diese .jar-Datei enthält die Daten. Sie müssen den Berichterstellungsteil und den Stapelaktualisierungsteil zusammen mit der Webanwendung bei jeder Änderung freigeben - und hoffen , dass diese Freigabe für alle Teile reibungslos verläuft.
Was passiert, wenn Ihr Chef eine andere Priorität haben möchte?
Ihr Chef ist heute vorbei gekommen. Es gibt eine neue Priorität - CEO
. Jetzt müssen Sie den gesamten Code ändern , eine Neukompilierung durchführen und erneut implementieren.
Mit der Methode "Aufzählung in der Tabelle" aktualisieren Sie die Aufzählungsliste, um eine neue Priorität zu erhalten. Der gesamte Code, der die Liste abruft, ruft sie aus der Datenbank ab.
Daten stehen selten allein
Bei Prioritäten werden die Daten in andere Tabellen übernommen, die möglicherweise Informationen zu Workflows enthalten, oder wer kann diese Priorität festlegen oder so weiter.
Kehren Sie kurz zum Geschlecht zurück, wie in der Frage erwähnt: Geschlecht hat einen Link zu den verwendeten Pronomen: he/his/him
und she/hers/her
... und Sie möchten vermeiden, dass dies hart in den Code selbst codiert wird. Und dann kommt dein Chef vorbei und du musst hinzufügen, dass du das 'OTHER'
Geschlecht hast (um es einfach zu halten) und dass du dieses Geschlecht in Beziehung setzen musst zu they/their/them
... und dein Chef sieht, was Facebook hat und ... na ja.
Indem Sie sich statt auf eine Aufzählungstabelle auf ein Zeichenfolgenbit beschränken, müssen Sie diese Zeichenfolge jetzt in einer Reihe anderer Tabellen replizieren, um diese Beziehung zwischen den Daten und ihren anderen Bits aufrechtzuerhalten.
Was ist mit anderen Datenspeichern?
Egal, wo Sie dies speichern, das gleiche Prinzip besteht.
- Sie könnten eine Datei haben
priorities.prop
, die die Prioritätenliste enthält. Sie lesen diese Liste aus einer Eigenschaftendatei ein.
Sie könnten eine Dokumentenspeicher-Datenbank (wie CouchDB ) haben, die einen Eintrag für hat enums
(und dann eine Validierungsfunktion in JavaScript schreiben ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
Sie könnten eine XML-Datei mit einem gewissen Schema haben:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
Die Kernidee ist die gleiche. Im Datenspeicher selbst muss die Liste der gültigen Werte gespeichert und erzwungen werden. Indem Sie es hier platzieren, ist es einfacher, über den Code und die Daten nachzudenken. Sie müssen nicht jedes Mal defensiv überprüfen, was Sie haben (Groß- oder Kleinschreibung? Warum gibt es einen chritical
Typ in dieser Spalte? Usw.), weil Sie wissen, was Sie vom Datenspeicher zurückerhalten Genau das, was der Datenspeicher von Ihnen erwartet - und Sie können den Datenspeicher nach einer Liste gültiger Werte abfragen.
Das wegnehmen
Der Satz gültiger Werte ist Daten , kein Code. Sie tun müssen , streben DRY Code - aber die Frage der Vervielfältigung ist , dass Sie die duplizieren Daten in dem Code, anstatt seinen Platz als Daten zu respektieren und sie in einer Datenbank zu speichern.
Es erleichtert mehrere Anwendungen gegen den Datenspeicher zu schreiben und vermeidet Instanzen mit dem Sie alles benötigen bereitstellen , die eng an die Daten gekoppelt ist , sich - weil Sie nicht haben , um Ihren Code zu den Daten gekoppelt.
Dies erleichtert das Testen von Anwendungen, da Sie nicht die gesamte Anwendung erneut testen müssen, wenn die CEO
Priorität hinzugefügt wird - da Sie keinen Code haben, der sich um den tatsächlichen Wert der Priorität kümmert.
Durch die Möglichkeit, unabhängig voneinander über den Code und die Daten nachzudenken, ist es einfacher, Fehler bei der Wartung zu finden und zu beheben.