NULL'ın temel sorunu, sistemi güvenilmez hale getirmesidir. 1980'de Turing Ödülüne adanmış gazetede Tony Hoare şunları yazdı:
Ve böylece, ADA'nın yaratıcıları ve tasarımcılarına tavsiyem en iyisi görmezden gelindi. .... Bu dilin bugünkü haliyle güvenilirliğin kritik olduğu uygulamalarda kullanılmasına izin vermeyin, örneğin nükleer santraller, seyir füzeleri, erken uyarı sistemleri, antibalistik füze savunma sistemleri. Bir programlama dili hatası nedeniyle yoldan çıkacak bir sonraki roket, Venüs'e zararsız bir yolculukta keşfedilen bir uzay roketi olmayabilir: Kendi şehirlerimizden birinin üzerinde patlayan nükleer bir savaş başlığı olabilir. Güvenilmez programlar üreten bir güvenilmez programlama dili, çevremiz ve toplumumuz için güvensiz otomobillerden, zehirli böcek ilacı veya nükleer santrallerdeki kazalardan çok daha büyük bir risk oluşturmaktadır. Riski azaltmak için değil, riski azaltmak için dikkatli olun.
ADA dili bundan beri çok değişti, ancak bu tür sorunlar Java, C # ve diğer birçok popüler dilde hala mevcut.
Bir müşteri ile tedarikçi arasında sözleşmeler yapmak geliştiricinin görevidir. Örneğin, C # 'da, Java'da olduğu gibi, salt okunur (iki Seçenek) oluşturarak referansın Generics
etkisini en aza indirmek için kullanabilirsiniz :Null
NullableClass<T>
class NullableClass<T>
{
public HasValue {get;}
public T Value {get;}
}
ve sonra kullanın
NullableClass<Customer> customer = dbRepository.GetCustomer('Mr. Smith');
if(customer.HasValue){
// one logic with customer.Value
}else{
// another logic
}
veya C # extension yöntemleriyle iki seçenek stili kullanın:
customer.Do(
// code with normal behaviour
,
// what to do in case of null
)
Fark önemli. Bir yöntemin müşterisi olarak ne bekleyeceğinizi biliyorsunuz. Bir takım kurala sahip olabilir:
Bir sınıf NullableClass türünde değilse, örneği boş olmamalıdır .
Ekip, bu fikri Sözleşme ile Tasarım ve derleme zamanında statik kontrol kullanarak , örneğin ön koşulla:
function SaveCustomer([NotNullAttribute]Customer customer){
// there is no need to check whether customer is null
// it is a client problem, not this supplier
}
veya bir dize için
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
}
Bu yaklaşım, uygulama güvenilirliğini ve yazılım kalitesini büyük ölçüde artırabilir . Sözleşme ile Tasarım bir durumdur Hoare mantığı 1988 yılında ünlü Nesne Tabanlı Yazılım İnşaat kitap ve Eyfel dilinde Bertrand Meyer tarafından doldurulan, ama modern bir yazılım işçiliği Geçersiz Şekilde kullanımda değil.