Der Code ist nicht nur deshalb schlecht, weil die magischen Zahlen , sondern weil er mehrere Bedeutungen im Rückkehrcode zusammenführt und in seiner Bedeutung einen Fehler, eine Warnung, eine Erlaubnis zum Erstellen einer Sitzung oder eine Kombination der drei verbirgt, was ihn zu einer macht schlechte Eingabe für die Entscheidungsfindung.
Ich würde das folgende Refactoring vorschlagen: Rückgabe einer Aufzählung mit den möglichen Ergebnissen (wie in anderen Antworten vorgeschlagen), aber Hinzufügen eines Attributs zur Aufzählung, das angibt, ob es sich um eine Ablehnung, einen Verzicht (ich lasse Sie dies das letzte Mal bestehen lassen) oder wenn es OK ist (PASS):
public LoginResult processLogin(HttpServletRequest request, HttpServletResponse response,
int pwChangeDays, ServletContext ServContext) {
}
==> LoginResult.java <==
public enum LoginResult {
NOT_LOGGED_IN(Severity.DENIAL),
ALREADY_LOGGED_IN(Severity.PASS),
INACTIVE_USER(Severity.DENIAL),
VALID_USER(Severity.PASS),
NEEDS_PASSWORD_CHANGE(Severity.WAIVER),
INVALID_APP_USER(Severity.DENIAL),
INVALID_NETWORK_USER(Severity.DENIAL),
NON_APPROVED_ADDRESS(Severity.DENIAL),
ACCOUNT_LOCKED(Severity.DENIAL),
ACCOUNT_WILL_BE_LOCKED(Severity.WAIVER);
private Severity severity;
private LoginResult(Severity severity) {
this.severity = severity;
}
public Severity getSeverity() {
return this.severity;
}
}
==> Severity.java <==
public enum Severity {
PASS,
WAIVER,
DENIAL;
}
==> Test.java <==
public class Test {
public static void main(String[] args) {
for (LoginResult r: LoginResult.values()){
System.out.println(r + " " +r.getSeverity());
}
}
}
Ausgabe für Test.java mit dem Schweregrad für jedes LoginResult:
NOT_LOGGED_IN : DENIAL
ALREADY_LOGGED_IN : PASS
INACTIVE_USER : DENIAL
VALID_USER : PASS
NEEDS_PASSWORD_CHANGE : WAIVER
INVALID_APP_USER : DENIAL
INVALID_NETWORK_USER : DENIAL
NON_APPROVED_ADDRESS : DENIAL
ACCOUNT_LOCKED : DENIAL
ACCOUNT_WILL_BE_LOCKED : WAIVER
Anhand des Enum-Werts und seines Schweregrads können Sie entscheiden, ob die Erstellung der Sitzung fortgesetzt wird oder nicht.
BEARBEITEN:
Als Antwort auf den Kommentar von @ T.Sar habe ich die möglichen Werte des Schweregrads in PASS, WAIVER und DENIAL anstelle von (OK, WARNING und ERROR) geändert. Auf diese Weise ist klar, dass eine VERWEIGERUNG (früher FEHLER) an sich kein Fehler ist und nicht unbedingt eine Ausnahme auslösen muss . Der Aufrufer untersucht das Objekt und entscheidet, ob eine Ausnahme ausgelöst wird oder nicht. DENIAL ist jedoch ein gültiger Ergebnisstatus, der sich aus dem Aufruf ergibt processLogin(...)
.
- PASS: Erstellen Sie eine Sitzung, falls noch keine vorhanden ist
- Verzicht: Gehen Sie diesmal vor, aber beim nächsten Mal dürfen Benutzer möglicherweise nicht passieren
- VERWEIGERUNG: Entschuldigung, Benutzer kann nicht bestehen, keine Sitzung erstellen