Ein Teil meines Programms ruft Daten aus vielen Tabellen und Spalten in meiner Datenbank zur Verarbeitung ab. Einige der Spalten sind möglicherweise vorhanden null
, aber im aktuellen Verarbeitungskontext ist dies ein Fehler.
Dies sollte "theoretisch" nicht passieren. Wenn dies der Fall ist, deutet dies auf fehlerhafte Daten oder einen Fehler im Code hin. Die Fehler haben je nach Feld unterschiedliche Schweregrade null
. dh für einige Felder sollte die Verarbeitung gestoppt und jemand benachrichtigt werden, für andere sollte die Verarbeitung fortgesetzt werden dürfen und nur jemand benachrichtigt werden.
Gibt es gute Architektur- oder Designprinzipien, um mit den seltenen, aber möglichen null
Einträgen umzugehen?
Die Lösungen sollten mit Java implementiert werden können, aber ich habe das Tag nicht verwendet, da ich denke, dass das Problem etwas sprachunabhängig ist.
Einige Gedanken, die ich selbst hatte:
Verwenden von NOT NULL
Am einfachsten wäre es, eine NOT NULL-Einschränkung in der Datenbank zu verwenden.
Was aber, wenn das ursprüngliche Einfügen der Daten wichtiger ist als dieser spätere Verarbeitungsschritt? Für den Fall, dass die Einfügung ein null
in die Tabelle einfügt (entweder aufgrund von Fehlern oder vielleicht sogar aus einem gültigen Grund), möchte ich nicht, dass die Einfügung fehlschlägt. Nehmen wir an, dass viele weitere Teile des Programms von den eingefügten Daten abhängen, jedoch nicht von dieser bestimmten Spalte. Daher würde ich lieber den Fehler im aktuellen Verarbeitungsschritt als im Einfügeschritt riskieren. Deshalb möchte ich keine NOT NULL-Einschränkung verwenden.
Naiv abhängig von NullPointerException
Ich könnte die Daten einfach so verwenden, als ob ich erwarte, dass sie immer vorhanden sind (und das sollte wirklich der Fall sein), und die resultierenden NPEs auf einer angemessenen Ebene abfangen (z. B. damit die Verarbeitung des aktuellen Eintrags stoppt, aber nicht der gesamte Verarbeitungsfortschritt ). Dies ist das Prinzip "schnell scheitern" und ich bevorzuge es oft. Wenn es zumindest ein Fehler ist, bekomme ich eine protokollierte NPE.
Aber dann verliere ich die Fähigkeit, zwischen verschiedenen Arten fehlender Daten zu unterscheiden. Zum Beispiel könnte ich einige fehlende Daten weglassen, aber für andere sollte die Verarbeitung gestoppt und ein Administrator benachrichtigt werden.
Überprüfen auf null
vor jedem Zugriff und werfen benutzerdefinierte Ausnahmen
Mit benutzerdefinierten Ausnahmen kann ich anhand der Ausnahme die richtige Aktion festlegen. Dies scheint also der richtige Weg zu sein.
Aber was ist, wenn ich vergesse, es irgendwo zu überprüfen? Außerdem überfülle ich meinen Code dann mit Nullprüfungen, die nie oder selten erwartet werden (und daher definitiv nicht Teil des Geschäftslogikflusses sind).
Wenn ich mich für diesen Weg entscheide, welche Muster eignen sich am besten für den Ansatz?
Alle Gedanken und Kommentare zu meinen Ansätzen sind willkommen. Auch bessere Lösungen jeglicher Art (Muster, Prinzipien, bessere Architektur meines Codes oder meiner Modelle usw.).
Bearbeiten:
Es gibt eine weitere Einschränkung, da ich ein ORM verwende, um die Zuordnung von DB zu Persistenzobjekt durchzuführen, sodass Nullprüfungen auf dieser Ebene nicht funktionieren würden (da dieselben Objekte in Teilen verwendet werden, in denen die Null keinen Schaden anrichtet). . Ich habe dies hinzugefügt, weil in den bisher gegebenen Antworten beide diese Option erwähnt haben.