Il codice è negativo non solo perché i numeri magici , ma perché combinano diversi significati nel codice di ritorno, nascondendo all'interno del suo significato un errore, un avvertimento, un permesso per creare una sessione o una combinazione dei tre, il 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 questo ultimo ora) 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 al valore enumerato e alla sua gravità, puoi decidere se creare o meno i proventi della sessione.
Modifica
Come risposta al commento di @ T.Sar, ho modificato i possibili valori della severità su PASS, RIPOSIZIONE e DENIAL invece di (OK, AVVISO ed ERRORE). In questo modo è chiaro che un DENIAL (in precedenza ERRORE) non è un errore di per sé e non dovrebbe necessariamente tradurre in un'eccezione. Il chiamante esamina l'oggetto e decide se lanciare un'eccezione, ma DENIAL è uno stato di risultato valido risultante dal chiamare processLogin(...)
.
-
PASS: vai avanti, crea una sessione se non ne esiste già una
-
RINUNCIA: vai avanti questa volta, ma l'utente della prossima volta potrebbe non essere autorizzato a passare
-
DENIAL: mi dispiace, l'utente non può passare, non creare una sessione