Menurut pendapat saya ada perbedaan antara mengembalikan NULL, mengembalikan beberapa hasil kosong (mis. String kosong atau daftar kosong), dan melempar pengecualian.
Saya biasanya mengambil pendekatan berikut. Saya menganggap panggilan fungsi atau metode f (v1, ..., vn) sebagai aplikasi fungsi
f : S x T1 x ... x Tn -> T
di mana S itu "keadaan dunia" T1, ..., Tn adalah jenis parameter input, dan T adalah tipe pengembalian.
Saya pertama kali mencoba mendefinisikan fungsi ini. Jika fungsi ini parsial (yaitu ada beberapa nilai input yang tidak didefinisikan) saya mengembalikan NULL untuk memberi sinyal ini. Ini karena saya ingin penghentian normal dan memberi tahu saya bahwa fungsi yang saya minta tidak didefinisikan pada input yang diberikan. Menggunakan, misalnya, string kosong sebagai nilai kembali bersifat mendua karena bisa jadi fungsi tersebut didefinisikan pada input dan string kosong adalah hasil yang benar.
Saya pikir pemeriksaan tambahan untuk pointer NULL dalam kode panggilan diperlukan karena Anda menerapkan fungsi parsial dan itu adalah tugas dari metode yang dipanggil untuk memberi tahu Anda jika fungsi jika tidak didefinisikan untuk input yang diberikan.
Saya lebih suka menggunakan pengecualian untuk kesalahan yang tidak memungkinkan untuk melakukan perhitungan (yaitu tidak mungkin menemukan jawaban apa pun).
Sebagai contoh, misalkan saya memiliki Pelanggan kelas dan saya ingin menerapkan metode
Customer findCustomer(String customerCode)
untuk mencari pelanggan dalam database aplikasi dengan kodenya. Dalam metode ini, saya akan melakukannya
- Kembalikan objek Pelanggan kelas jika kueri berhasil,
- Kembalikan nol jika kueri tidak menemukan pelanggan.
- Lempar pengecualian jika tidak mungkin terhubung ke database.
Pemeriksaan tambahan untuk null, misalnya
Customer customer = findCustomer("...");
if (customer != null && customer.getOrders() > 0)
{
...
}
adalah bagian dari semantik dari apa yang saya lakukan dan saya tidak akan hanya "melewatkannya" untuk membuat kode lebih baik dibaca. Saya tidak berpikir itu adalah praktik yang baik untuk menyederhanakan semantik masalah yang ada hanya untuk menyederhanakan kode.
Tentu saja, karena pemeriksaan untuk null sangat sering terjadi, ada baiknya jika bahasa tersebut mendukung beberapa sintaks khusus untuk itu.
Saya juga akan mempertimbangkan untuk menggunakan pola Objek Null (seperti yang disarankan oleh Laf) selama saya dapat membedakan objek nol kelas dari semua objek lainnya.