Masalah utama NULL adalah bahwa hal itu membuat sistem tidak dapat diandalkan. Pada tahun 1980 Tony Hoare dalam makalah yang didedikasikan untuk Penghargaan Turing-nya menulis:
Maka, saran terbaik saya kepada para pencetus dan perancang ADA telah diabaikan. .... Jangan biarkan bahasa ini dalam keadaan saat ini untuk digunakan dalam aplikasi di mana keandalan sangat penting, yaitu, pembangkit listrik tenaga nuklir, rudal jelajah, sistem peringatan dini, sistem pertahanan rudal antiballistik. Roket berikutnya yang tersesat akibat kesalahan bahasa pemrograman mungkin bukan roket ruang eksplorasi dalam perjalanan tidak berbahaya ke Venus: Mungkin hulu ledak nuklir yang meledak di salah satu kota kita sendiri. Bahasa pemrograman yang tidak dapat diandalkan menghasilkan program yang tidak dapat diandalkan merupakan risiko yang jauh lebih besar bagi lingkungan kita dan masyarakat kita daripada mobil yang tidak aman, pestisida beracun, atau kecelakaan di pembangkit listrik tenaga nuklir. Waspada untuk mengurangi risiko, bukan untuk meningkatkannya.
Bahasa ADA telah banyak berubah sejak itu, namun masalah seperti itu masih ada di Jawa, C # dan banyak bahasa populer lainnya.
Merupakan kewajiban pengembang untuk membuat kontrak antara klien dan pemasok. Misalnya, dalam C #, seperti di Jawa, Anda dapat menggunakan Generics
untuk meminimalkan dampak Null
referensi dengan membuat readonly NullableClass<T>
(dua Opsi):
class NullableClass<T>
{
public HasValue {get;}
public T Value {get;}
}
dan kemudian menggunakannya sebagai
NullableClass<Customer> customer = dbRepository.GetCustomer('Mr. Smith');
if(customer.HasValue){
// one logic with customer.Value
}else{
// another logic
}
atau gunakan dua opsi gaya dengan metode ekstensi C #:
customer.Do(
// code with normal behaviour
,
// what to do in case of null
)
Perbedaannya signifikan. Sebagai klien dari suatu metode, Anda tahu apa yang diharapkan. Sebuah tim dapat memiliki aturan:
Jika kelas bukan tipe NullableClass maka instance itu harus bukan nol .
Tim dapat memperkuat ide ini dengan menggunakan Desain dengan Kontrak dan pemeriksaan statis pada waktu kompilasi, misalnya dengan prasyarat:
function SaveCustomer([NotNullAttribute]Customer customer){
// there is no need to check whether customer is null
// it is a client problem, not this supplier
}
atau untuk string
function GetCustomer([NotNullAndNotEmptyAttribute]String customerName){
// there is no need to check whether customerName is null or empty
// it is a client problem, not this supplier
}
Pendekatan ini secara drastis dapat meningkatkan keandalan aplikasi dan kualitas perangkat lunak. Desain oleh Kontrak adalah kasus logika Hoare , yang dihuni oleh Bertrand Meyer dalam bukunya yang terkenal Object-Oriented Software Construction dan bahasa Eiffel pada tahun 1988, tetapi tidak digunakan secara tidak valid dalam pembuatan perangkat lunak modern.