Ich erstelle eine Klasse, die Zeichenfolgen validiert. Es gibt viele Gründe, warum die Zeichenfolge möglicherweise nicht bestanden wird.
Würde es mehr Sinn machen, eine Ausnahme zu werfen oder false/Fehlercode zurückzugeben? Vor- und Nachteile?
Ich erstelle eine Klasse, die Zeichenfolgen validiert. Es gibt viele Gründe, warum die Zeichenfolge möglicherweise nicht bestanden wird.
Würde es mehr Sinn machen, eine Ausnahme zu werfen oder false/Fehlercode zurückzugeben? Vor- und Nachteile?
Validatoren sollten keine Ausnahmen auslösen, da das Scheitern eines Validierers kein "außergewöhnliches" Ereignis ist.
Der restliche Teil Ihres Codes sollte Ausnahmen auslösen, wenn er ungültige Daten erhält.
Wenn Sie eine Validierungsfunktion ausführen, sind Sie offensichtlich vorbereitet, um mit eventuell auftretenden Problemen durch einen einfachen Test umzugehen. Alles in einen try/catch-Block zu packen und alle Ausführung zu stoppen, um dann wiederherzustellen, ist übertrieben. Verwenden Sie einfach eine if-Anweisung und seien Sie bereit, dem Benutzer einige Fehlermeldungen anzuzeigen.
Das Werfen einer Ausnahme scheint ein bisschen extrem zu sein, da eine nicht gültige Zeichenfolge nicht wirklich ein außergewöhnliches Ereignis ist, was eine Zeichenfolgenvalidierungssuite betrifft.
Daher hätte ich gedacht, dass das Zurückgeben von false die logischste Lösung wäre. Darüber hinaus könnten Sie auch einen aussagekräftigen Textfehler über eine Referenzvariable zurückgeben, wenn dies im Rahmen Ihrer Implementierung sinnvoll ist.
Zum Beispiel:
// In der Klassendefinition...
public function validateString($zuValidierendeZeichenfolge, &$fehlerZeichenfolge=null) {
// Wenn ein Fehler auftritt...
if($fehlerZeichenfolge) {
$fehlerZeichenfolge = 'Etwas ist auf dem Weg schiefgelaufen.';
return false;
}
}
// Beim Aufruf...
$fehlerZeichenfolge = '';
$validierungssuite->validateString($zuValidierendeZeichenfolge, $fehlerZeichenfolge);
Es wird argumentiert, dass die Validator-Klasse einen bool zurückgeben sollte. isValid(string $someData): bool
und es ist keine Ausnahme, wenn der Validator feststellt, dass "false" die Antwort für "isValid" ist. Dies ist ein solider Ansatz, aber Sie verlieren die Information darüber, was im Aufrufer des Validators schief gelaufen ist.
Die Möglichkeiten sind:
Das Problem bei "1" mit der Protokollierung des Validators ist, dass der Validator den Kontext des Problems nicht kennt. In der Regel werden viele Dinge einen Validator aufrufen, da sie wiederverwendbar sind. Der Validator weiß also nicht, wer ihn aufgerufen hat, um z.B. "Factory XYZ konnte das Objekt nicht erstellen, weil die E-Mail-Adresse ungültig ist" zu protokollieren.
Wenn der Validator jedoch eine Ausnahme mit den Fehlerinformationen wirft, kann der Aufrufer diese Fehler mit dem Kontext dessen, was schief gelaufen ist und wo im Protokoll, protokollieren. Sicher, Sie können Fehler sowohl im Validator als auch im Aufrufer mit mehr Kontext protokollieren, aber dann haben Sie mehrere Protokolle, die nicht natürlich zusammenhängen. Ist das alles es wert, nur damit der Validator bool zurückgibt?
Ein weiteres Problem bei "1", einfach bool zurückzugeben, besteht darin, dass Sie im Validator protokollieren, und ich würde lieber etwas strengere "muss bool zurückgeben" aufgeben und den Validator einfach halten und kein Protokollieren mit schwachen Informationen durchführen.
Obwohl das Zurückgeben von "false" aus einer Validator-Klasse argumentierbarerweise keine Ausnahme ist, ist es eine Ausnahme, dass der Aufrufer die Aufgabe aufgrund eines Validierungsfehlers nicht ausführen kann, daher wirft der Validator eine Ausnahme, weil "wir eine Ausnahme haben, weil etwas ungültig ist".
Ich denke, es ist wirklich nützlich für den Validator, eine Ausnahme mit den Fehlerinformationen als neues Array zu werfen (ähnlich wie zusätzliche Daten in einer spezifischen Exception-Klasse, die Exception usw. erweitert). Anstatt die Validator-Methode isValid()
aufzurufen, die irgendwie eine bool-Antwort erfordert, rufen Sie validate()
auf und umschließen den Aufruf in ein try/catch
.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.