Sama sekali tidak ada alasan untuk kembali true
sukses jika Anda tidak kembali false
pada kegagalan. Seperti apa seharusnya kode klien?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
Dalam hal ini, penelepon membutuhkan blok coba-tangkap, tetapi kemudian ia dapat menulis:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
Jadi nilai true
kembali sama sekali tidak relevan untuk penelepon. Jadi simpan saja metodenya void
.
Secara umum, ada tiga cara untuk merancang mode failre.
- Kembalikan benar / salah
- Gunakan
void
, lempar (dicentang) pengecualian
- mengembalikan objek hasil antara .
Kembali true
/false
Ini digunakan di beberapa API yang lebih tua, kebanyakan c-style. Kerugiannya adalah obviuos, Anda tidak tahu apa yang salah. PHP cukup sering melakukan ini, mengarah ke kode seperti ini:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
Dalam konteks multi-utas, ini bahkan lebih buruk.
Melempar (dicentang) pengecualian
Ini cara yang bagus untuk melakukannya. Di beberapa titik, Anda dapat mengharapkan kegagalan. Java melakukan ini dengan soket. Asumsi dasarnya adalah bahwa panggilan harus berhasil, tetapi semua orang tahu bahwa operasi tertentu mungkin gagal. Koneksi soket ada di antara mereka. Jadi penelepon terpaksa menangani kegagalan. itu desain yang bagus, karena memastikan penelepon benar-benar menangani kegagalan, dan memberi penelepon cara yang elegan untuk menangani kegagalan.
Kembalikan objek hasil
Ini adalah cara lain yang bagus untuk menangani ini. Ini sering digunakan untuk parsing atau hanya hal-hal yang perlu divalidasi.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Bagus, logika bersih untuk penelepon juga.
Ada sedikit perdebatan kapan harus menggunakan kasus kedua, dan kapan harus menggunakan yang ketiga. Beberapa orang percaya bahwa pengecualian harus luar biasa dan bahwa Anda tidak boleh merancang dengan kemungkinan pengecualian dalam pikiran, dan akan selalu menggunakan opsi ketiga. Tidak masalah. Tetapi kami telah memeriksa pengecualian di Jawa, jadi saya tidak melihat alasan untuk tidak menggunakannya. Saya menggunakan ekspektasi yang dicentang ketika asumsi dasarnya adalah bahwa panggilan harus berhasil (seperti menggunakan soket), tetapi kegagalan mungkin terjadi, dan saya menggunakan opsi ketiga ketika sangat tidak jelas apakah panggilan tersebut akan berhasil (seperti memvalidasi data). Tetapi ada pendapat berbeda tentang ini.
Dalam kasus Anda, saya akan menggunakan void
+ Exception
. Anda mengharapkan unggahan file berhasil, dan ketika tidak, itu luar biasa. Tetapi penelepon dipaksa untuk menangani mode kegagalan itu, dan Anda dapat mengembalikan Pengecualian yang dengan benar menjelaskan kesalahan apa yang terjadi.