Le code est mauvais non seulement parce que les nombres magiques , mais parce qu'il fusionne plusieurs significations dans le code de retour, cachant à l'intérieur de sa signification une erreur, un avertissement, une autorisation de créer une session ou une combinaison des trois, ce qui en fait un mauvaise entrée pour la prise de décision.
Je suggérerais la refactorisation suivante: renvoyer une énumération avec les résultats possibles (comme suggéré dans d'autres réponses), mais en ajoutant à l'énumération un attribut indiquant s'il s'agit d'un déni, d'une renonciation (je vous laisse passer cette dernière fois) ou si c'est 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());
}
}
}
Sortie pour Test.java montrant la gravité de chaque 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
En fonction de la valeur enum et de sa gravité, vous pouvez décider si la création de la session se poursuit ou non.
ÉDITER:
En réponse au commentaire de @ T.Sar, j'ai changé les valeurs possibles de la gravité en PASS, WAIVER et DENIAL au lieu de (OK, WARNING et ERROR). De cette façon, il est clair qu'un REFUS (auparavant ERREUR) n'est pas une erreur en soi et ne devrait pas nécessairement se traduire par le lancement d'une exception. L'appelant examine l'objet et décide de lever ou non une exception, mais DENIAL est un état de résultat valide résultant de l'appel processLogin(...)
.
- PASS: allez-y, créez une session si elle n'existe pas déjà
- RENONCIATION: allez-y cette fois, mais la prochaine fois, vous ne serez peut-être pas autorisé à passer
- DENIAL: désolé, l'utilisateur ne peut pas passer, ne créez pas de session