NULL की केंद्रीय समस्या यह है कि यह सिस्टम को अविश्वसनीय बनाता है। 1980 में टोनी होरे ने अपने ट्यूरिंग अवार्ड के लिए समर्पित पत्र में लिखा:
और इसलिए, एडीए के मूल और डिजाइनरों के लिए मेरी सलाह को नजरअंदाज कर दिया गया है। ...। इस भाषा को अपने वर्तमान स्थिति में उन अनुप्रयोगों में उपयोग करने की अनुमति न दें, जहां विश्वसनीयता महत्वपूर्ण है, अर्थात, परमाणु ऊर्जा स्टेशन, क्रूज मिसाइल, प्रारंभिक चेतावनी प्रणाली, एंटीबॉडी मिसाइल रक्षा प्रणाली। प्रोग्रामिंग भाषा की त्रुटि के परिणामस्वरूप रास्ता भटकने वाला अगला रॉकेट हो सकता है कि शुक्र की एक हानिरहित यात्रा पर एक खोजी अंतरिक्ष रॉकेट न हो: यह हमारे अपने शहरों में से एक पर एक परमाणु बम विस्फोट हो सकता है। एक अविश्वसनीय प्रोग्रामिंग भाषा, जो अविश्वसनीय कार्यक्रम उत्पन्न करती है, हमारे पर्यावरण और हमारे समाज के लिए असुरक्षित कारों, विषाक्त कीटनाशकों, या परमाणु ऊर्जा स्टेशनों पर दुर्घटनाओं की तुलना में कहीं अधिक जोखिम पैदा करती है। जोखिम को कम करने के लिए सतर्क रहें, इसे बढ़ाने के लिए नहीं।
उसके बाद से ADA भाषा बहुत बदल गई है, लेकिन ऐसी समस्याएं अभी भी जावा, C # और कई अन्य लोकप्रिय भाषाओं में मौजूद हैं।
ग्राहक और आपूर्तिकर्ता के बीच अनुबंध बनाना डेवलपर का कर्तव्य है। उदाहरण के लिए, C # में, जैसा कि जावा में है, आप आसानी Generics
से (दो विकल्प) Null
बनाकर संदर्भ के प्रभाव को कम करने के लिए उपयोग कर सकते हैं NullableClass<T>
:
class NullableClass<T>
{
public HasValue {get;}
public T Value {get;}
}
और फिर इसका उपयोग करें
NullableClass<Customer> customer = dbRepository.GetCustomer('Mr. Smith');
if(customer.HasValue){
// one logic with customer.Value
}else{
// another logic
}
या C # एक्सटेंशन विधियों के साथ दो विकल्प शैली का उपयोग करें:
customer.Do(
// code with normal behaviour
,
// what to do in case of null
)
अंतर महत्वपूर्ण है। एक विधि के एक ग्राहक के रूप में आप जानते हैं कि क्या उम्मीद है। एक टीम का नियम हो सकता है:
यदि एक वर्ग प्रकार NullableClass का नहीं है, तो यह उदाहरण अशक्त नहीं होना चाहिए ।
टीम अनुबंध द्वारा डिजाइन और संकलित समय पर स्थैतिक जाँच के द्वारा इस विचार को मजबूत कर सकती है , उदाहरण के लिए पूर्व शर्त के साथ:
function SaveCustomer([NotNullAttribute]Customer customer){
// there is no need to check whether customer is null
// it is a client problem, not this supplier
}
या एक स्ट्रिंग के लिए
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
}
ये दृष्टिकोण अनुप्रयोग विश्वसनीयता और सॉफ़्टवेयर गुणवत्ता में अत्यधिक वृद्धि कर सकता है। कॉन्ट्रैक्ट द्वारा डिज़ाइन , होरे तर्क का एक मामला है , जिसे बर्ट्रेंड मेयर ने 1988 में अपनी प्रसिद्ध ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर कंस्ट्रक्शन बुक और एफिल भाषा में पॉपुलेट किया था, लेकिन यह आधुनिक सॉफ़्टवेयर क्राफ्टिंग में अवैध रूप से उपयोग में नहीं है।