null उपयोग अनुप्रयोग / भाषा निर्भर है
अंततः nullएक वैध आवेदन मूल्य के रूप में उपयोग करने या न करने का विकल्प काफी हद तक आपके आवेदन और प्रोग्रामिंग भाषा / इंटरफ़ेस / किनारे से निर्धारित होता है।
मूलभूत स्तर पर, मैं विभिन्न प्रकारों का उपयोग करने की कोशिश करूँगा यदि मूल्यों के अलग-अलग वर्ग हैं। nullएक विकल्प हो सकता है यदि आपका इंटरफ़ेस इसे अनुमति देता है और आपके द्वारा प्रतिनिधित्व करने की कोशिश कर रही संपत्ति के केवल दो वर्ग हैं। यदि आपका इंटरफ़ेस या प्रारूप इसे अनुमति देता है, तो संपत्ति को स्वीकार करना एक विकल्प हो सकता है। एक नया कुल प्रकार (वर्ग, वस्तु, संदेश प्रकार) एक और विकल्प हो सकता है।
आपके स्ट्रिंग उदाहरण के लिए, यदि यह प्रोग्रामिंग भाषा में है, तो मैं अपने आप से कुछ सवाल पूछूंगा।
- क्या मैं भविष्य के प्रकारों को जोड़ने की योजना बना रहा हूं? यदि हां, तो
Optionआपके इंटरफेस डिजाइन के लिए एक बेहतर होगा।
- मुझे उपभोक्ताओं के कॉल को मान्य करने की आवश्यकता है? स्थिर? गतिशील रूप से? इससे पहले? बाद? बिलकुल? यदि आपकी प्रोग्रामिंग भाषा इसका समर्थन करती है, तो स्थिर टाइपिंग के लाभों का उपयोग करें क्योंकि यह आपके द्वारा सत्यापन के लिए बनाई गई कोड की मात्रा से बचता है।
Optionशायद इस मामले को सबसे अच्छा भरता है अगर आपका स्ट्रिंग गैर-अशक्त था। हालाँकि, आप शायद nullवैसे भी एक स्ट्रिंग मान के लिए उपयोगकर्ता इनपुट की जाँच करने जा रहे हैं , इसलिए मैं शायद पूछताछ की पहली पंक्ति में वापस आ जाऊँगा: मैं कितने प्रकार के मूल्यों का प्रतिनिधित्व करना चाहता / करती हूँ।
- क्या
nullमेरी प्रोग्रामिंग भाषा में प्रोग्रामर की त्रुटि का संकेत है? दुर्भाग्य से, nullअक्सर कुछ भाषाओं में अनइंस्टाल्यूटेड (या गैर-स्पष्ट रूप से प्रारंभिक) संकेत या संदर्भ के लिए डिफ़ॉल्ट मान होता है। क्या nullडिफ़ॉल्ट मान के रूप में एक मूल्य स्वीकार्य है? क्या यह डिफ़ॉल्ट मान के रूप में सुरक्षित है ? कभी-कभी nullडीललॉक्ड मूल्यों का संकेत होता है। क्या मुझे अपने इंटरफ़ेस के उपभोक्ताओं को इन संभावित मेमोरी मैनेजमेंट या उनके प्रोग्राम में इनिशियलाइज़ेशन समस्याओं के संकेत के साथ प्रदान करना चाहिए? ऐसी समस्याओं का सामना करने में ऐसी कॉल की विफलता मोड क्या है? क्या कॉलर उसी प्रक्रिया या थ्रेड के रूप में मेरा है ताकि ऐसी त्रुटियां मेरे आवेदन के लिए एक उच्च जोखिम हो?
इन सवालों के आपके जवाबों के आधार पर, आप शायद nullअपने इंटरफ़ेस के लिए सही हैं या नहीं , इस पर विचार कर पाएंगे ।
उदाहरण 1
- आपका एप्लिकेशन सुरक्षा महत्वपूर्ण है
- आप स्टार्टअप पर कुछ प्रकार के हीप आरंभीकरण का उपयोग कर रहे हैं और
nullएक स्ट्रिंग के लिए स्थान आवंटित करने में विफलता पर वापस पारित एक संभावित स्ट्रिंग मान है।
- ऐसी क्षमता है कि आपका स्ट्रिंग आपके इंटरफेस को हिट करता है
उत्तर: nullशायद उचित नहीं है
तर्क: nullइस मामले में वास्तव में दो अलग-अलग प्रकार के मूल्यों को इंगित करने के लिए उपयोग किया जाता है। पहला एक डिफ़ॉल्ट मान हो सकता है जिसे आपके इंटरफ़ेस का उपयोगकर्ता सेट करना चाहता है। दुर्भाग्य से, दूसरा मान यह दर्शाता है कि आपका सिस्टम ठीक से काम नहीं कर रहा है। ऐसे मामलों में, आप संभवतः जितना संभव हो उतना सुरक्षित रूप से विफल होना चाहते हैं (जो भी आपके सिस्टम के लिए इसका मतलब है)।
उदाहरण 2
- आप एक सी संरचना का उपयोग कर रहे हैं जिसमें एक
char *सदस्य है।
- आपका सिस्टम हीप आवंटन का उपयोग नहीं करता है और आप MISRA चेकिंग का उपयोग कर रहे हैं।
- आपका इंटरफ़ेस इस संरचना को एक पॉइंटर के रूप में स्वीकार करता है और यह सुनिश्चित करने के लिए जांचता है कि संरचना इंगित नहीं करती है
NULL
char *आपके API के लिए सदस्य के डिफ़ॉल्ट और सुरक्षित मान को एकल मान द्वारा इंगित किया जा सकता हैNULL
- अपने उपयोगकर्ता के आरंभिक प्रारंभ होने पर, आप उपयोगकर्ता को
char *सदस्य को प्रारंभिक रूप से स्पष्ट नहीं करने की संभावना प्रदान करना चाहेंगे ।
उत्तर: NULLउपयुक्त हो सकता है
Rationale: इस बात की थोड़ी सी संभावना है कि आपकी संरचना NULLचेक को पास कर दे, लेकिन यह अनैतिक है। हालाँकि, आपका API तब तक इसका हिसाब नहीं दे सकता, जब तक कि आपके पास संरचना के मूल्य के कुछ प्रकार के चेकसम और संरचना के पते की / या रेंज की जाँच न हो। MISRA-C लिंटर्स उनके API के उपयोगकर्ताओं को उनके आरंभ से पहले स्ट्रक्चर्स के उपयोग को चिह्नित करके मदद कर सकते हैं। हालाँकि, char *सदस्य के लिए, यदि सूचक एक आरंभिक संरचना को इंगित करने के लिए है, तो NULLकिसी संरचना आरम्भिक में अनिर्दिष्ट सदस्य का डिफ़ॉल्ट मान है। इसलिए, आपके अनुप्रयोग में संरचना सदस्य के NULLलिए एक सुरक्षित, डिफ़ॉल्ट मान के रूप में काम कर सकता है char *।
यदि यह एक धारावाहिक इंटरफ़ेस पर है, तो मैं खुद से निम्नलिखित प्रश्न पूछूंगा कि क्या किसी स्ट्रिंग पर नल का उपयोग करना है या नहीं।
- क्या
nullसंभावित ग्राहक पक्ष की त्रुटि का संकेत है? जावास्क्रिप्ट में JSON के लिए, यह संभवतः एक nullऐसा नहीं है जो जरूरी नहीं है कि आवंटन विफलता के संकेत के रूप में उपयोग किया जाए। जावास्क्रिप्ट में, इसका उपयोग स्पष्ट रूप से सेट किए जाने वाले संदर्भ से ऑब्जेक्ट अनुपस्थिति के स्पष्ट संकेत के रूप में किया जाता है। हालाँकि, गैर-जावास्क्रिप्ट पार्सर और धारावाहिक हैं, जो कि JSON का नक्शा बनाते हैंnull देशी nullप्रकार के । यदि यह मामला है, तो यह चर्चा करता है कि nullआपकी विशेष भाषा, पार्सर और धारावाहिक संयोजन के लिए देशी उपयोग ठीक है या नहीं ।
- क्या संपत्ति के मूल्य की स्पष्ट अनुपस्थिति एक एकल संपत्ति मूल्य से अधिक प्रभाव डालती है? कभी-कभी
nullवास्तव में यह संकेत मिलता है कि आपके पास एक नया संदेश प्रकार है। यह पूरी तरह से अलग संदेश प्रकार को निर्दिष्ट करने के लिए क्रमांकन प्रारूप के आपके उपभोक्ताओं के लिए क्लीनर हो सकता है। यह सुनिश्चित करता है कि उनके सत्यापन और अनुप्रयोग तर्क में आपके वेब इंटरफ़ेस द्वारा प्रदान किए गए संदेशों के दो भेदों के बीच साफ अलगाव हो सकता है।
सामान्य सलाह
nullएक किनारे या इंटरफ़ेस पर एक मूल्य नहीं हो सकता है जो इसका समर्थन नहीं करता है। यदि आप कुछ ऐसा उपयोग कर रहे हैं जो प्रकृति के गुणों (यानी JSON) के टाइपिंग पर बहुत ढीला है, तो उपभोक्ताओं के किनारे के सॉफ्टवेयर (जैसे JSON स्कीमा ) पर स्कीमा या सत्यापन के कुछ प्रकार को धकेलने का प्रयास करें । यदि यह एक प्रोग्रामिंग भाषा एपीआई है, तो उपयोगकर्ता इनपुट को वैधानिक रूप से सत्यापित करें यदि संभव हो तो (टाइपिंग के माध्यम से) या जितना जोर से रनटाइम में समझदार हो (उर्फ अभ्यास रक्षात्मक प्रोग्रामिंग उपभोक्ता सामना करने वाले इंटरफेस पर )। जैसा कि महत्वपूर्ण है, दस्तावेज़ को किनारे पर परिभाषित करें या इसमें कोई प्रश्न न हो:
- किसी दी गई संपत्ति का मूल्य किस प्रकार का है
- किसी संपत्ति के लिए मूल्य की कौन सी सीमाएँ मान्य हैं।
- कुल प्रकार को कैसे संरचित किया जाना चाहिए। एक समग्र प्रकार में क्या गुण होना चाहिए / मौजूद होना चाहिए?
- यदि यह किसी प्रकार का कंटेनर है, तो कंटेनर कितने आइटमों को रख सकता है या रखना चाहिए, और कंटेनर को किस प्रकार के मान हैं?
- क्या आदेश, यदि कोई हो, तो कंटेनर या समुच्चय प्रकार के गुण या उदाहरण लौटाए गए हैं?
- विशेष मूल्य निर्धारित करने के क्या दुष्प्रभाव हैं और उन मूल्यों को पढ़ने के क्या दुष्प्रभाव हैं?