이 코드는 마술 숫자 때문에뿐만 아니라 반환 코드에서 여러 가지 의미를 통합하여 그 의미 내부에 오류, 경고, 세션 생성 권한 또는 세 가지 조합을 숨겨서 의사 결정에 대한 잘못된 입력.
다음 리팩토링을 제안합니다. 가능한 결과가있는 열거 형을 반환하지만 (다른 답변에서 제안한 것처럼) 열거 형에 거부, 면제인지 여부를 나타내는 속성을 추가합니다 (이번에는 통과시켜 드리겠습니다). 괜찮다면 (통과) :
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());
}
}
}
각 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로 변경했습니다. 그렇게하면 거부 (이전의 ERROR) 자체가 오류가 아니며 반드시 예외를 던지는 것으로 해석 되어서는 안된다는 것이 분명합니다 . 호출자는 객체를 검사하고 예외를 던질 지 여부를 결정하지만 DENIAL은 호출 결과로 유효한 결과 상태 processLogin(...)
입니다.
- 통과 : 세션이 없으면 세션을 만듭니다.
- 웨이버 : 이번에는 계속 진행하지만 다음에 사용자는 통과 할 수 없습니다.
- 거부 : 죄송합니다. 사용자가 통과 할 수 없으며 세션을 만들지 마십시오.