Il codice non è male solo perché i numeri magici , ma perché fonde diversi significati nel codice di ritorno, nascondendo all'interno del suo significato un errore, un avviso, un'autorizzazione a creare una sessione o una combinazione dei tre, che lo rende un input negativo per il processo decisionale.
Suggerirei il seguente refactoring: restituire un enum con i possibili risultati (come suggerito in altre risposte), ma aggiungendo all'enum un attributo che indica se si tratta di un rifiuto, una rinuncia (ti lascerò passare quest'ultima volta) o se è 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());
}
}
}
Output per Test.java che mostra la gravità per ogni 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
In base sia al valore enum che alla sua gravità, puoi decidere se la creazione della sessione procede o meno.
MODIFICARE:
In risposta al commento di @ T.Sar, ho modificato i possibili valori della gravità su PASS, WAIVER e DENIAL anziché su (OK, WARNING ed ERROR). In questo modo è chiaro che un DENIAL (precedentemente ERRORE) non è un errore di per sé e non deve necessariamente tradursi in un'eccezione. Il chiamante esamina l'oggetto e decide se generare o meno un'eccezione, ma DENIAL è uno stato risultato valido derivante dalla chiamata processLogin(...)
.
- PASS: vai avanti, crea una sessione se non ne esiste già una
- RINUNCIA: vai avanti questa volta, ma alla prossima volta potresti non essere autorizzato a passare
- DENIAL: scusa, l'utente non può passare, non creare una sessione