Mã này không chỉ xấu vì các số ma thuật , mà bởi vì nó kết hợp một số ý nghĩa trong mã trả về, ẩn bên trong ý nghĩa của nó là một lỗi, một cảnh báo, cho phép tạo một phiên hoặc kết hợp cả ba, làm cho nó trở thành một đầu vào xấu cho việc ra quyết định.
Tôi sẽ đề xuất cách tái cấu trúc sau: trả lại một enum với kết quả có thể (như được đề xuất trong các câu trả lời khác), nhưng thêm vào enum một thuộc tính cho biết đó có phải là từ chối, từ bỏ (tôi sẽ cho phép bạn vượt qua lần cuối này) hoặc nếu nó ổn (PASS):
public LoginResult processLogin(HttpServletRequest request, HttpServletResponse response,
int pwChangeDays, ServletContext ServContext) {
}
==> Đăng nhậpResult.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());
}
}
}
Đầu ra cho Test.java hiển thị mức độ nghiêm trọng cho mỗi 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
Dựa trên cả giá trị enum và mức độ nghiêm trọng của nó, bạn có thể quyết định việc tạo ra tiến trình phiên hay không.
BIÊN TẬP:
Để phản hồi bình luận của @ T.Sar, tôi đã thay đổi các giá trị có thể nghiêm trọng thành PASS, WAIVER và DENIAL thay vì (OK, CẢNH BÁO và LRI). Theo cách đó, rõ ràng là một DENIAL (trước đây là LRI) không phải là một lỗi và không nhất thiết phải chuyển thành một ngoại lệ. Người gọi kiểm tra đối tượng và quyết định có ném ngoại lệ hay không, nhưng DENIAL là trạng thái kết quả hợp lệ do gọi processLogin(...)
.
- PASS: hãy tiếp tục, tạo một phiên nếu không tồn tại
- WAIVER: đi trước thời gian này, nhưng người dùng lần sau bạn có thể không được phép vượt qua
- DENIAL: xin lỗi, người dùng không thể vượt qua, không tạo phiên