Код поганий не тільки тому, що магічні числа , а й тому, що він поєднує кілька значень у зворотному коді, ховаючи всередині свого значення помилку, попередження, дозвіл на створення сеансу або комбінацію трьох, що робить його поганий внесок для прийняття рішень.
Я б запропонував такий рефакторинг: повернення перерахунку з можливими результатами (як це пропонується в інших відповідях), але додавання до 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;
}
}
==> Серйозність.java <==
public enum Severity {
PASS,
WAIVER,
DENIAL;
}
==> Тест.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 and ERROR). Таким чином зрозуміло, що DENIAL (раніше ПОМИЛКА) сам по собі не є помилкою і не повинен обов'язково перетворюватись на метання винятку. Абонент вивчає об'єкт і вирішує, кидати виняток чи ні, але DENIAL - це дійсний результат результату, викликаний викликом processLogin(...)
.
- ПАСА: вперед, створіть сеанс, якщо такого ще не існує
- ВАЙВЕР: продовжуйте цього разу, але наступного разу користувач може вам не дозволити проходити
- ДЕНІАЛ: вибачте, користувач не може пройти, не створювати сеанс