マジックナンバーが原因でコードが悪いだけでなく、エラー、警告、セッションを作成する権限、または3つを組み合わせた許可を意味する内部に隠れて、戻りコードのいくつかの意味が合体しているため、意思決定のための悪い入力。
私は次のリファクタリングをお勧めします:可能な結果を含む列挙型を返します(他の回答で提案されているように)が、拒否であるか、権利放棄であるかを示す属性を列挙型に追加します(これは最後に渡します)またはOK(パス)の場合:
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());
}
}
}
各LoginResultの重大度を示すTest.javaの出力:
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
列挙値とその重大度の両方に基づいて、セッションの作成を続行するかどうかを決定できます。
編集:
@ T.Sarのコメントへの応答として、重大度の可能な値を(OK、WARNINGおよびERROR)ではなくPASS、WAIVERおよびDENIALに変更しました。そうすれば、DENIAL(以前はERROR)自体がエラーではなく、必ずしも例外のスローに変換されるべきではないことは明らかです。呼び出し元はオブジェクトを調べ、例外をスローするかどうかを決定しますが、DENIALはを呼び出した結果の有効な結果ステータスですprocessLogin(...)
。
- 合格:セッションがまだない場合は、セッションを作成してください。
- 権利放棄:今回は先に進みますが、次回ユーザーは合格することができない場合があります
- 拒否:申し訳ありませんが、ユーザーはパスできず、セッションを作成しません