zuerst validieren oder versuchen zu fangen?

8

Nehmen wir an, ich habe eine Funktion, die so aussieht:

%Vor%

Bevor ich in die Datenbank speichere, muss ich verschiedene Validierungen durchführen. Was ich in meinem Hauptprogramm tun kann, ist folgendes:

%Vor%

Damit bin ich sicher, dass alle Daten alle Validierungen bestehen müssen, bevor sie in die Datenbank gespeichert werden. Dies bedeutet jedoch, dass die Funktion saveBooking() eng von den Validierungsmethoden abhängt. Jedes Mal, wenn ich saveBooking() aufrufen möchte, muss ich sicherstellen, dass ich die Validierungen nicht vergesse.

Alternativ dazu kann ich alle Validierungen in die Funktion selbst einfügen, so dass ich nur die Methode aufrufen muss und für alles gesorgt ist. Um jedoch alle Fehler unabhängig zu behandeln, muss ich die Funktion Exceptions auslösen und im Hauptprogramm fangen lassen. Es sollte ungefähr so ​​aussehen:

%Vor%

Dies bedeutet auch, dass ich mehrere Ausnahmen selbst erstellen muss. Das Gute ist, dass ich mir keine Sorgen machen muss, welche Validierungen ich vorlegen muss.

Damit bin ich mir nicht sicher, welches das beste Code-Design ist. Ich persönlich bevorzuge die erste Methode, die lesbarer ist, aber sie hängt zu sehr voneinander ab, und es wird immer schlimmer, wenn ich sie an vielen Orten verwenden muss. Bitte um Rat!

    
Davuth 02.08.2011, 03:40
quelle

5 Antworten

7

Definitiv die erste Option über die zweite. Ich halte das zweite für einen Missbrauch von Ausnahmen. Ausnahmen sind für außergewöhnliche Umstände vorgesehen, und die fehlgeschlagene Validierung ist nicht "außergewöhnlich".

  

Jedes Mal, wenn ich saveBooking() aufrufen möchte, muss ich sicherstellen, dass ich die Validierungen nicht vergesse.

Fügen Sie die Validierungslogik in eine separate Methode ein und lassen Sie saveBooking() die Validierungsmethode aufrufen, bevor sie etwas anderes tut.

%Vor%     
Matt Ball 02.08.2011, 03:46
quelle
2

Die Überprüfung sollte normalerweise innerhalb der Funktion selbst durchgeführt werden, so dass es nein Möglichkeit gibt, zu versuchen, die Daten zu speichern, ohne sie vorher zu validieren. Ohne diese Überprüfungen innerhalb der Funktion könnten Sie einen Client finden, der versucht, ohne Überprüfung zu speichern, und das ist selten eine gute Sache.

Aber Sie sind nicht darauf beschränkt, Ausnahmen zu verwenden. Sie können einfach einen Fehlercode zurückgeben, der vom Aufrufer überprüft werden soll. Während es mir normalerweise egal ist, ob Fehler durch Ausnahmen oder Rückgabecodes gemacht werden, gibt es einige, die dies als Missbrauch von Ausnahmen sehen.

Der Validierungscode wird wahrscheinlich immer noch als separate Funktion belassen, da Ihr eigener Code es möglicherweise aufrufen möchte, ohne das Speichern durchzuführen. Etwas wie (Pseudocode):

%Vor%

Sie werden wahrscheinlich immer noch Ausnahmen haben, die von Ihrem Aufruf von saveBookings abgefangen werden, nur um E / A-Fehler und ähnliches zu behandeln, aber es ist nicht absolut notwendig: Sie könnten diese Ausnahme innerhalb der funktionieren auch und übersetzen sie in einen Rückgabecode.

Ich neige dazu, eine Berichtsmethode von jeder Funktion zu mögen, so dass ich (zum Beispiel) nicht try/catch und Rückkehrcodes überprüfen muss.

    
paxdiablo 02.08.2011 03:52
quelle
1

Sie tun definitiv das Richtige, indem Sie alles vor dem Einfügen validieren. Sie sollten auch überprüfen, ob alles, was Sie einfügen, passt oder die Einschränkungen in Ihrer Datenbank erfüllt, um eine unerwartete SQLException zu vermeiden, die Sie nicht erwarten Gehe ganz nach oben.

Ich würde empfehlen, eine benutzerdefinierte Ausnahme mit einigen Attributen zu erstellen, um die Fehlerursache zu beschreiben. Auf diese Weise müssen Sie sich nur um das Abfangen einer Art von Ausnahme kümmern.

Zusätzlich würde ich die Validierung definitiv in die Methode einfügen, also wird sie immer aufgerufen.

    
Oscar Gomez 02.08.2011 03:48
quelle
0

Ein 3-stufiger Ansatz ist ziemlich üblich, in dem Sie die folgenden 3 Ebenen haben:

  • Client-Schnittstelle. Dies kann JavaScript-Validierung für eine Webanwendung oder eine einfache SWT-Validierung für GUI-Steuerelemente beinhalten.
  • Eine Geschäftsschicht. Diese Ebene kennt die Geschäftsregeln. An dieser Stelle möchten Sie normalerweise Ihre serverseitige Validierung vornehmen. Alles, was gespeichert, geändert oder geändert werden sollte, sollte über die Business-Schicht erfolgen (so haben Sie immer Ihre Validierung und Sie kümmern sich nicht um Ihren Datenspeicher).
  • Eine Datenschicht. Diese Schicht ist typischerweise "dumm". Einfach speichern, löschen, auswählen usw .; Was auch immer die Business-Schicht anfordert, diese Schicht tut es einfach.

Dies wurde sehr vereinfacht, aber es gibt Ihnen eine anständige Möglichkeit, verschiedene Arten von Logik für eine einfachere Wartung zu trennen.

    
Kris 02.08.2011 03:46
quelle
0

Es ist keine gute Idee, viel Code an einem Ort zu platzieren. Es ist auch keine gute Idee, überprüfte Ausnahmen zu werfen.

    
fastcodejava 02.08.2011 04:02
quelle

Tags und Links