मेरी राय में, NULL को वापस करने, कुछ खाली परिणाम (जैसे कि खाली स्ट्रिंग या खाली सूची) लौटाने और एक अपवाद को फेंकने के बीच अंतर है।
मैं आम तौर पर निम्नलिखित दृष्टिकोण अपनाता हूं। मैं एक फ़ंक्शन या विधि f (v1, ..., vn) को एक फ़ंक्शन के अनुप्रयोग के रूप में मानता हूं
f : S x T1 x ... x Tn -> T
जहां यह एस "दुनिया का राज्य" T1, ..., Tn इनपुट पैरामीटर के प्रकार हैं, और T रिटर्न प्रकार है।
मैं पहले इस फ़ंक्शन को परिभाषित करने का प्रयास करता हूं। यदि फ़ंक्शन आंशिक है (यानी कुछ इनपुट मान हैं जिनके लिए इसे परिभाषित नहीं किया गया है) मैं इसे संकेत देने के लिए NULL वापस करता हूं। ऐसा इसलिए है क्योंकि मैं चाहता हूं कि गणना सामान्य रूप से समाप्त हो जाए और मुझे बताएं कि मेरे द्वारा अनुरोधित फ़ंक्शन को दिए गए इनपुट पर परिभाषित नहीं किया गया है। उपयोग करना, उदाहरण के लिए, वापसी मान के रूप में एक खाली स्ट्रिंग अस्पष्ट है क्योंकि यह हो सकता है कि फ़ंक्शन इनपुट पर परिभाषित किया गया है और खाली स्ट्रिंग सही परिणाम है।
मुझे लगता है कि कॉलिंग कोड में एक NULL पॉइंटर के लिए अतिरिक्त जांच आवश्यक है क्योंकि आप एक आंशिक फ़ंक्शन को लागू कर रहे हैं और यह कॉल करने का तरीका है कि आपको बताएं कि क्या फ़ंक्शन दिए गए इनपुट के लिए परिभाषित नहीं है।
मैं उन त्रुटियों के लिए अपवादों का उपयोग करना पसंद करता हूं जो गणना करने की अनुमति नहीं देते हैं (अर्थात किसी भी उत्तर को खोजना संभव नहीं था)।
उदाहरण के लिए, मान लें कि मेरे पास एक ग्राहक वर्ग है और मैं एक विधि लागू करना चाहता हूं
Customer findCustomer(String customerCode)
अपने कोड द्वारा एप्लिकेशन डेटाबेस में एक ग्राहक की खोज करना। इस विधि में, मैं करूँगा
- यदि कक्षा सफल है, तो कक्षा ग्राहक की एक वस्तु लौटाएं,
- यदि कोई ग्राहक नहीं मिलता है, तो अशक्त वापस लौटें।
- यदि डेटाबेस से कनेक्ट करना संभव नहीं है, तो एक अपवाद को फेंक दें।
अशक्त के लिए अतिरिक्त जांच, जैसे
Customer customer = findCustomer("...");
if (customer != null && customer.getOrders() > 0)
{
...
}
मैं जो कुछ कर रहा हूं उसके शब्दार्थ का एक हिस्सा हैं और मैं कोड को बेहतर तरीके से पढ़ने के लिए सिर्फ उन्हें "स्किप" नहीं करूंगा। मुझे नहीं लगता कि कोड को सरल बनाने के लिए हाथ में समस्या के शब्दार्थ को सरल बनाना एक अच्छा अभ्यास है।
बेशक, चूंकि नल के लिए चेक बहुत बार होता है, यह अच्छा है अगर भाषा इसके लिए कुछ विशेष वाक्यविन्यास का समर्थन करती है।
जब तक मैं अन्य सभी वस्तुओं से एक वर्ग की अशक्त वस्तु को अलग कर सकता हूं, तब तक मैं नल ऑब्जेक्ट पैटर्न (लाफ द्वारा सुझाए गए) का उपयोग करने पर भी विचार करूंगा।