Ich habe eine Wertüberprüfungsfunktion, ähnlich einer Funktion zur Überprüfung von Kreditkartennummern, die in einer Zeichenfolge übergeben wird und prüfen muss, ob der Wert das richtige Format hat.
Wenn es das richtige Format ist, muss es true zurückgeben.
Wenn es nicht das richtige Format ist, muss es false zurückgeben und uns mitteilen, was mit dem Wert nicht stimmt.
Die Frage ist, was ist der schönste Weg, dies zu erreichen?
Hier sind einige Lösungen:
1. Verwenden Sie Integer / Enum-Rückkehrcodes, um Bedeutungen zu kennzeichnen:
String[] returnCodeLookup =
[
"Value contains wrong number of characters, should contain 10 characters",
"Value should end with 1",
"Value should be a multiple of 3"
]
private int valueChecker(String value)
{
/*check value*/
return returnCode;
}
rc = checkValue(valueToBeChecked);
if rc == 0
{
/*continue as normal*/
}
else
{
print("Invalid value format: ") + returnCodeLookup[rc];
}
Diese Lösung gefällt mir nicht, da sie auf der Anruferseite implementiert werden muss.
2. Erstellen Sie eine returnCode-Klasse
Class ReturnCode()
{
private boolean success;
private String message;
public boolean getSuccess()
{
return this.success;
}
public String getMessage()
{
return this.message;
}
}
private ReturnCode valueChecker(String value)
{
/*check value*/
return returnCode;
}
rc = checkValue(valueToBeChecked);
if rc.getSuccess()
{
/*continue as normal*/
}
else
{
print("Invalid value format: ") + rc.getMessage();
}
Diese Lösung ist aufgeräumt, aber es scheint, als würde man das Rad übertreiben / neu erfinden.
3. Verwenden Sie Ausnahmen.
private boolean valueChecker(String value)
{
if int(value)%3 != 0 throw InvalidFormatException("Value should be a multiple of 3";
/*etc*/
return True;
}
try {
rc = checkValue(valueToBeChecked);
}
catch (InvalidFormatException e)
{
print e.toString();
}
Ich bin versucht, diese Lösung zu verwenden, aber mir wurde gesagt, dass Sie keine Ausnahmen für die Geschäftslogik verwenden sollten.
quelle
Antworten:
Verwenden Sie ein komplexeres Rückgabeobjekt, in dem beide Aspekte zusammengefasst sind. Beispiel:
Dies hat mehrere Vorteile:
Ich habe dieses spezielle Design bereits in Anwendungen verwendet, in denen eine Validierung mehr als nur wahr oder falsch sein kann. Möglicherweise ist eine detaillierte Meldung erforderlich oder nur ein Teil der Eingabe ist ungültig (z. B. kann ein Formular mit zehn Elementen nur ein oder zwei ungültige Felder enthalten). Mit diesem Design können Sie diese Anforderungen problemlos erfüllen.
quelle
IValidationResult.SUCCESS
, die eine leere Fehlermeldung zurückgibt. Dann sieht deine Logik so ausif (result != SUCCESS) { doStuff(result.getMessage()); }
Verwenden Sie in keinem der oben genannten Fälle eine ValueChecker-Klasse
Zuerst eine Schnittstelle, um Ihnen Flexibilität zu geben:
Implementieren Sie dann so viele Valuechecker, wie Sie benötigen:
Beispiel-Clientcode:
Dies hat den Vorteil, dass Sie viele verschiedene Wertprüfer haben können.
quelle
Meine Antwort erweitert den Ansatz von @ Snowman. Grundsätzlich sollte jede Validierung, jede Geschäftsregel und jede Geschäftslogik zu einer gewissen Reaktion führen können - zumindest in Webanwendungen. Diese Antwort wird wiederum einem Anrufer angezeigt. Dies brachte mich zu der folgenden Oberfläche (es ist PHP, aber die Frage ist sprachunabhängig):
Das Erstellen eines Switch-Operators, der wie ein Ausdruck und nicht wie eine Anweisung wirkt, führt dazu, dass der Anwendungsservice folgendermaßen aussieht:
quelle