Kode buruk bukan hanya karena angka ajaib , tetapi karena menyatukan beberapa makna dalam kode kembali, menyembunyikan di dalamnya artinya kesalahan, peringatan, izin untuk membuat sesi atau kombinasi dari ketiganya, yang membuatnya menjadi input buruk untuk pengambilan keputusan.
Saya akan menyarankan refactoring berikut: mengembalikan enum dengan hasil yang mungkin (seperti yang disarankan dalam jawaban lain), tetapi menambahkan ke enum atribut yang menunjukkan apakah itu penolakan, pengabaian (saya akan membiarkan Anda melewati ini terakhir kali) atau jika tidak masalah (LULUS):
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());
}
}
}
Output untuk Test.java menunjukkan tingkat keparahan untuk setiap 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
Berdasarkan nilai enum dan tingkat keparahannya, Anda dapat memutuskan apakah pembuatan sesi dilanjutkan atau tidak.
EDIT:
Sebagai tanggapan terhadap komentar @ T.Sar, saya mengubah nilai yang mungkin dari keparahan ke PASS, WAIVER dan DENIAL alih-alih (OK, PERINGATAN dan KESALAHAN). Dengan cara itu jelas bahwa DENIAL (sebelumnya ERROR) bukan merupakan kesalahan per se dan tidak seharusnya diterjemahkan ke dalam melempar pengecualian. Penelepon memeriksa objek dan memutuskan apakah akan melempar pengecualian, tetapi DENIAL adalah status hasil yang valid yang dihasilkan dari panggilan processLogin(...)
.
- LULUS: silakan, buat sesi jika belum ada
- WAIVER: lanjutkan kali ini, tetapi kali berikutnya pengguna Anda mungkin tidak diizinkan untuk lulus
- DENIAL: maaf, pengguna tidak dapat lulus, jangan membuat sesi