รหัสไม่ดีไม่เพียงเพราะตัวเลขเวทย์มนตร์เท่านั้น แต่เนื่องมาจากความรวมหลายความหมายในโค้ดส่งคืนการซ่อนอยู่ภายในความหมายของข้อผิดพลาดคำเตือนการอนุญาตให้สร้างเซสชันหรือการรวมกันของทั้งสามซึ่งทำให้ อินพุตที่ไม่ดีสำหรับการตัดสินใจ
ฉันอยากจะแนะนำ refactoring ต่อไปนี้: คืนค่า enum ด้วยผลลัพธ์ที่เป็นไปได้ (ตามที่แนะนำในคำตอบอื่น ๆ ) แต่เพิ่มคุณสมบัติ enum ที่ระบุว่าเป็นการปฏิเสธการสละสิทธิ์ (ฉันจะให้คุณผ่านครั้งสุดท้ายนี้) หรือ ถ้ามันตกลง (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());
}
}
}
เอาต์พุตสำหรับ 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
ขึ้นอยู่กับทั้งค่า enum และความรุนแรงคุณสามารถตัดสินใจได้ว่าการสร้างเซสชันจะดำเนินการหรือไม่
แก้ไข:
เพื่อเป็นการตอบสนองต่อความคิดเห็นของ @ T.Sar ฉันได้เปลี่ยนค่าที่เป็นไปได้ของความรุนแรงเป็น PASS, WAIVER และ DENIAL แทน (ตกลง, คำเตือนและข้อผิดพลาด) วิธีนี้เป็นที่ชัดเจนว่า DENIAL (ข้อผิดพลาดก่อนหน้านี้) ไม่ใช่ข้อผิดพลาดต่อ se และไม่จำเป็นต้องแปลเป็นการโยนข้อยกเว้น โทรตรวจสอบวัตถุและตัดสินใจหรือไม่ที่จะโยนยกเว้น processLogin(...)
แต่ปฏิเสธสถานะผลที่ถูกต้องที่เกิดจากการโทร
- ผ่าน:ไปข้างหน้าสร้างเซสชันหากยังไม่มี
- การสละสิทธิ์:ไปข้างหน้าในครั้งนี้ แต่ผู้ใช้ครั้งต่อไปคุณอาจไม่ได้รับอนุญาตให้ผ่าน
- ปฏิเสธ:ขออภัยผู้ใช้ไม่สามารถผ่านได้อย่าสร้างเซสชัน