该代码是不好的,不仅因为魔术数字,而且因为它在返回代码中合并了几种含义,将其含义隐藏在错误,警告,创建会话的权限或这三者的组合中,这使其成为一个错误。决策输入错误。
我建议进行以下重构:返回带有可能结果的枚举(如其他答案中所建议),但向枚举添加一个属性,该属性指示是否拒绝,弃权(我会让您最后一次通过)或如果可以(通过):
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;
}
}
==>严重性.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());
}
}
}
Test.java的输出,显示每个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
基于枚举值及其严重性,您可以决定是否继续创建会话。
编辑:
作为对@ T.Sar评论的回应,我将严重性的可能值更改为PASS,WAIVER和DENIAL,而不是(OK,WARNING和ERROR)。这样一来,很明显,DENIAL(以前为ERROR)本身并不是错误,并且不一定转化为引发异常。调用者检查对象并决定是否引发异常,但是DENIAL是调用产生的有效结果状态processLogin(...)
。
- 通过:继续,如果尚未建立一个会话
- 弃权者:这次继续,但是下一次用户您可能不允许通过
- 拒绝:对不起,用户无法通过,请勿创建会话