Saya memiliki fungsi pengecekan nilai, mirip dengan fungsi pengecekan nomor kartu kredit, yang diteruskan dalam sebuah string, dan perlu memeriksa bahwa nilainya dalam format yang tepat.
Jika itu format yang benar, ia perlu mengembalikan true.
Jika itu bukan format yang benar, ia perlu mengembalikan false, dan juga memberi tahu kami apa yang salah dengan nilainya.
Pertanyaannya adalah, apa cara terbaik untuk mencapai ini?
Inilah beberapa solusi:
1. Gunakan kode integer / enum return untuk menandakan makna:
String[] returnCodeLookup =
[
"Value contains wrong number of characters, should contain 10 characters",
"Value should end with 1",
"Value should be a multiple of 3"
]
private int valueChecker(String value)
{
/*check value*/
return returnCode;
}
rc = checkValue(valueToBeChecked);
if rc == 0
{
/*continue as normal*/
}
else
{
print("Invalid value format: ") + returnCodeLookup[rc];
}
Saya tidak suka solusi ini karena membutuhkan implementasi di sisi penelepon.
2. Buat kelas returnCode
Class ReturnCode()
{
private boolean success;
private String message;
public boolean getSuccess()
{
return this.success;
}
public String getMessage()
{
return this.message;
}
}
private ReturnCode valueChecker(String value)
{
/*check value*/
return returnCode;
}
rc = checkValue(valueToBeChecked);
if rc.getSuccess()
{
/*continue as normal*/
}
else
{
print("Invalid value format: ") + rc.getMessage();
}
Solusi ini rapi, tetapi sepertinya membutuhkan banyak tenaga / menciptakan kembali roda.
3. Gunakan pengecualian.
private boolean valueChecker(String value)
{
if int(value)%3 != 0 throw InvalidFormatException("Value should be a multiple of 3";
/*etc*/
return True;
}
try {
rc = checkValue(valueToBeChecked);
}
catch (InvalidFormatException e)
{
print e.toString();
}
Saya tergoda untuk menggunakan solusi ini, tetapi saya diberitahu bahwa Anda tidak boleh menggunakan pengecualian untuk logika bisnis.
sumber
Jawaban:
Gunakan objek pengembalian yang lebih kompleks yang merangkum kedua masalah. Contoh:
Ini memiliki beberapa keunggulan:
Saya sebenarnya telah menggunakan desain khusus ini sebelumnya, dalam aplikasi di mana validasi mungkin lebih dari sekadar benar atau salah. Mungkin diperlukan pesan terperinci, atau hanya sebagian dari input tidak valid (mis. Formulir dengan sepuluh elemen mungkin hanya memiliki satu atau dua bidang yang tidak valid). Dengan menggunakan desain ini, Anda dapat dengan mudah mengakomodasi persyaratan tersebut.
sumber
IValidationResult.SUCCESS
yang mengembalikan pesan kesalahan kosong. Maka logika Anda terlihat sepertiif (result != SUCCESS) { doStuff(result.getMessage()); }
Tidak ada yang di atas, gunakan kelas ValueChecker
Pertama sebuah antarmuka untuk memberi Anda fleksibilitas:
Kemudian laksanakan sebanyak mungkin penilai yang Anda butuhkan:
Contoh kode klien:
Ini memiliki keuntungan bahwa Anda dapat memiliki banyak checker nilai yang berbeda.
sumber
Jawaban saya memperluas pendekatan Snowman. Pada dasarnya, setiap validasi, setiap aturan bisnis, dan setiap logika bisnis harus dapat menghasilkan beberapa respons - setidaknya, dalam aplikasi web. Respons ini, pada gilirannya, ditampilkan kepada penelepon. Ini membawa saya ke antarmuka berikut (ini adalah php, tetapi pertanyaannya pada dasarnya adalah bahasa-agnostik):
Membuat switch operator yang bertindak seperti ekspresi, bukan seperti pernyataan, mengarah ke layanan aplikasi yang terlihat seperti itu:
sumber