Ich erstelle ein Programm, das Daten in eine Datenbank sendet, und bin auf ein Muster gestoßen, das mir sicher bekannt ist: Eine kurze Tabelle der wahrscheinlichsten (sehr wahrscheinlich) festen Werte, die als Aufzählung dienen. Nehmen wir also die folgende Tabelle an Status
:
Status ID Beschreibung -------------- 0 unverarbeitet 1 Ausstehend 2 verarbeitet 3 Fehler
In meinem Programm muss ich eine Status-ID für eine andere Tabelle ermitteln oder möglicherweise einen Datensatz mit einer neuen Status-ID aktualisieren.
Ich könnte die Status-IDs in einer Aufzählung fest codieren und hoffe, dass niemand jemals die Datenbank ändert. Oder ich könnte die Werte basierend auf der Beschreibung vorab abrufen (also diese stattdessen fest codieren ).
Was wäre der richtige Ansatz, um diese beiden, Aufzählung und Tabelle, synchron zu halten?
Antworten:
Ich würde die Aufzählung in Ihrem Programm hart codieren, da ich vermute, dass diese unterschiedlichen Status Ihre Programmlogik beeinflussen. Wenn Sie einen neuen Status haben, wie soll Ihr Programm auf diesen neuen Status reagieren?
Da die Datenbank Teil Ihrer Anwendung ist, halte ich es nicht für sinnvoll, eine zu beeinflussen, ohne andere zu konsultieren.
quelle
pending
sie bestimmt ist. NatürlichStatus
gibt Ihnen eine Tabelle referenzielle Integrität, aber das ist der Punkt, den ich ansprechen möchte.Status
Tabelle sollte während der Laufzeit der Anwendung nicht als dynamisch betrachtet werden, und daher denke ich nicht, dass Sie sie als solche lesen sollten.Normalerweise würde ich diese Daten in einen statischen Cache laden (normalerweise in eine HashMap oder ähnliches), wenn die Anwendung gestartet wird. Es muss nicht neu kompiliert werden, nur weil die Aufzählung auf irgendeine Weise geändert wurde.
quelle
Da dies Status sind, sollten sie in der Anwendung fest codiert sein, um sicherzustellen, dass keine DB-Änderung Ihr Programm beschädigt (zumindest nicht leicht). Dies ist wichtig, da jeder Status, der hinzugefügt werden muss, zuerst codiert und nicht einfach zur Datenbank hinzugefügt werden muss.
Sie sollten diese Statuswerte weiterhin mit ihren korrekten Beschreibungen in die Datenbank schreiben lassen, falls Sie beispielsweise einen Bericht abrufen müssen.
Normalerweise habe ich ein kleines Code-Snippet, das eine Verbindung zur Datenbank herstellt und überprüft, ob die in einer bestimmten Tabelle aufgeführten Status alle dieselben ID- / Namenswerte haben, die ich im Speicher fest codiert habe. Wenn sie nicht übereinstimmen, werde ich die Ausführung der Software abbrechen.
Abhängig von Ihren Anforderungen möchten Sie möglicherweise etwas andere Verhaltensweisen implementieren, aber insgesamt ist es eine gute Idee, diese Status trotzdem fest zu codieren.
quelle
Wir haben ähnliche Probleme in meinem Projekt (Legacy-Code, Hurra!). Das Hauptproblem ist, dass sich "die Aufzählungstabellen nie ändern", bis sie es tun und der Code kaputt geht. Ich habe zwei Strategien, um zu mildern, auf die ich langsam zugewandert bin.
Erstens und am besten ist es, wenn immer möglich, direkte Verweise auf diese Werte zu entfernen. Fragen Sie immer: "Warum muss ich den Aufzählungswert direkt verwenden?" In vielen Fällen ist dies ein Zeichen dafür, dass der Code zu viele fest codierte Annahmen enthält oder versucht, die Daten zu stark zu manipulieren. Überprüfen Sie, ob Sie keine besseren Beziehungen in der Datenbank oder keinen flexibleren Code herstellen können, um mit den Manipulationen umzugehen.
Wenn das nicht funktioniert, gehe ich zu Plan B: Codegenerierung. Da sich die Tabellen selten ändern und wir regelmäßig neue Builds veröffentlichen, kann ein Codegenerator die Aufzählungstabellen lesen und den Aufzählungscode schreiben. Diese dynamisch generierte Bibliothek wird dann im Projekt verwendet. Wenn sich die Datenbank ändert, wird der nächste Build nicht kompiliert. Dies ist viel besser, als mysteriöse Laufzeitfehler zu erhalten.
quelle