Kod jest zły nie tylko dlatego, że magiczne liczby , ale także dlatego, że łączy w sobie kilka znaczeń w kodzie zwrotnym, chowając się w jego znaczeniu, oznaczając błąd, ostrzeżenie, pozwolenie na utworzenie sesji lub kombinację trzech, co czyni go zły wkład w podejmowanie decyzji.
Sugerowałbym następującą refaktoryzację: zwracanie wyliczenia z możliwymi wynikami (jak zasugerowano w innych odpowiedziach), ale dodanie do wyliczenia atrybutu wskazującego, czy jest to odmowa, rezygnacja (pozwolę ci przejść ostatni raz) lub jeśli jest OK (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());
}
}
}
Dane wyjściowe dla Test.java przedstawiające istotność dla każdego wyniku logowania:
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
Na podstawie zarówno wartości wyliczeniowej, jak i jej ważności, możesz zdecydować, czy tworzenie sesji będzie kontynuowane, czy nie.
EDYTOWAĆ:
W odpowiedzi na komentarz @ T.Sar zmieniłem możliwe wartości istotności na PASS, WAIVER i DENIAL zamiast (OK, WARNING and ERROR). W ten sposób jasne jest, że DENIAL (wcześniej ERROR) nie jest błędem per se i nie musi koniecznie przekładać się na zgłoszenie wyjątku. Program wywołujący sprawdza obiekt i decyduje, czy zgłosić wyjątek, ale DENIAL jest prawidłowym statusem wyniku wynikającym z wywołania processLogin(...)
.
- PASS: śmiało, utwórz sesję, jeśli jeszcze nie istnieje
- WAIVER: śmiało tym razem, ale następnym razem użytkownik może nie zostać dopuszczony do przejścia
- DENIAL: przepraszam, użytkownik nie może przejść, nie twórz sesji