सही ढंग से अशक्त का उपयोग करना
उपयोग करने के विभिन्न तरीके हैं null
। सबसे आम और शब्दार्थ रूप से सही तरीका यह है कि आप इसका उपयोग तब करें जब आपके पास एक भी मान हो या न हो । इस मामले में एक मान या तो बराबर होता है null
या डेटाबेस या किसी चीज के रिकॉर्ड की तरह कुछ सार्थक होता है।
इन स्थितियों में आप तब इसे इस तरह से उपयोग करते हैं (छद्म कोड में):
if (value is null) {
doSomethingAboutIt();
return;
}
doSomethingUseful(value);
संकट
और इसकी एक बहुत बड़ी समस्या है। समस्या यह है कि जब तक आप doSomethingUseful
मूल्य का आह्वान करते हैं, तब तक की जाँच नहीं की जा सकती है null
! यदि ऐसा नहीं होता तो कार्यक्रम दुर्घटनाग्रस्त हो जाता। और उपयोगकर्ता कोई भी अच्छा त्रुटि संदेश भी नहीं देख सकता है, "भयानक त्रुटि: वांछित मूल्य लेकिन शून्य मिला!" (अपडेट के बाद: हालांकि कम सूचनात्मक त्रुटि भी हो सकती है Segmentation fault. Core dumped.
, जैसे या इससे भी बदतर, कोई त्रुटि नहीं है और कुछ मामलों में अशक्त पर गलत हेरफेर)
स्थितियों को जांचना null
और संभालना लिखना null
एक बहुत ही सामान्य बग है । यही कारण है कि आविष्कार करने वाले टोनी होरे null
ने 2009 में QCon लंदन नामक एक सॉफ्टवेयर सम्मेलन में कहा था कि उन्होंने 1965 में अरबों डॉलर की गलती की:
https://www.infoq.com/pretations/Null-References-The-Billion-Dollar- गलती टोनी-होरे
समस्या से बचना
कुछ प्रौद्योगिकियां और भाषाएं null
अलग-अलग तरीकों से भूलना असंभव की जाँच कर रही हैं, जिससे कीड़े की मात्रा कम हो जाती है।
उदाहरण के लिए हास्केल के पास Maybe
नल की बजाय मोनाड है। मान लीजिए कि DatabaseRecord
एक उपयोगकर्ता-परिभाषित प्रकार है। हास्केल में प्रकार का मान Maybe DatabaseRecord
बराबर Just <somevalue>
हो सकता है या इसके बराबर हो सकता है Nothing
। फिर आप इसे विभिन्न तरीकों से उपयोग कर सकते हैं, लेकिन कोई फर्क नहीं पड़ता कि आप इसे कैसे उपयोग करते हैं, आप Nothing
इसे जानने के बिना कुछ ऑपरेशन को लागू नहीं कर सकते ।
मिसाल के तौर पर इस समारोह कहा जाता zeroAsDefault
रिटर्न x
के लिए Just x
और 0
के लिए Nothing
:
zeroAsDefault :: Maybe Int -> Int
zeroAsDefault mx = case mx of
Nothing -> 0
Just x -> x
क्रिश्चियन हैकल का कहना है कि C ++ 17 और स्काला के अपने तरीके हैं। इसलिए आप यह जानने की कोशिश कर सकते हैं कि आपकी भाषा में ऐसा कुछ है या नहीं और इसका उपयोग करें।
नल अभी भी व्यापक उपयोग में हैं
यदि आपके पास कुछ बेहतर नहीं है तो उपयोग null
करना ठीक है। बस इसके लिए बाहर देखते रहो। फ़ंक्शंस में टाइप डिक्लेरेशन आपको कुछ भी मदद करेगा।
इसके अलावा, यह बहुत प्रगतिशील नहीं लग सकता है, लेकिन आपको यह देखना चाहिए कि क्या आपके सहकर्मी उपयोग करना चाहते हैं null
या कुछ और। वे रूढ़िवादी हो सकते हैं और कुछ कारणों से नए डेटा संरचनाओं का उपयोग नहीं करना चाह सकते हैं। उदाहरण के लिए किसी भाषा के पुराने संस्करणों का समर्थन करना। ऐसी चीजों को परियोजना के कोडिंग मानकों में घोषित किया जाना चाहिए और टीम के साथ ठीक से चर्चा की जानी चाहिए।
आपके प्रस्ताव पर
आप एक अलग बूलियन फ़ील्ड का उपयोग करने का सुझाव देते हैं। लेकिन आपको इसे वैसे भी जांचना होगा और फिर भी इसे जांचना भूल सकते हैं। इसलिए यहां कुछ भी नहीं जीता है। यदि आप कुछ और भी भूल सकते हैं, जैसे कि हर बार दोनों मानों को अपडेट करना, तो यह और भी बुरा है। अगर जांच करने के लिए भूलने की समस्या null
हल नहीं होती है, तो कोई मतलब नहीं है। बचना null
मुश्किल है और आपको इसे इस तरह से नहीं करना चाहिए जिससे यह खराब हो।
नल का उपयोग कैसे न करें
अंत में null
गलत तरीके से उपयोग करने के सामान्य तरीके हैं । ऐसा ही एक तरीका खाली डेटा संरचनाओं जैसे सरणियों और तारों के स्थान पर इसका उपयोग करना है। एक खाली सरणी किसी भी अन्य की तरह एक उचित सरणी है! यह डेटा संरचनाओं के लिए लगभग हमेशा महत्वपूर्ण और उपयोगी है, जो कि कई मानों को फिट कर सकता है, खाली होने में सक्षम होने के लिए, अर्थात 0 लंबाई है।
बीजगणित के दृष्टिकोण से स्ट्रिंग के लिए एक खाली स्ट्रिंग संख्याओं के लिए 0 के समान है, अर्थात पहचान:
a+0=a
concat(str, '')=str
खाली स्ट्रिंग सामान्य रूप से स्ट्रिंग्स को एक मोनोड बनने में सक्षम बनाती है:
https://en.wikipedia.org/wiki/Monoid
यदि आपको यह नहीं मिलता है तो यह आपके लिए उतना महत्वपूर्ण नहीं है।
अब देखते हैं कि इस उदाहरण के साथ प्रोग्रामिंग करना क्यों महत्वपूर्ण है:
for (element in array) {
doSomething(element);
}
यदि हम यहां खाली सरणी पास करते हैं तो कोड ठीक काम करेगा। यह सिर्फ कुछ नहीं करेगा। हालाँकि अगर हम null
यहाँ से गुजरते हैं तो हमें "Null, माफ़ नहीं कर सकता" जैसी त्रुटि के साथ एक दुर्घटना होने की संभावना है। हम इसे लपेट सकते हैं, if
लेकिन यह कम साफ है और फिर से, आप इसे जांचना भूल सकते हैं
अशक्त को कैसे संभालें
क्या doSomethingAboutIt()
करना चाहिए और विशेष रूप से क्या यह एक अपवाद फेंकना चाहिए एक और जटिल मुद्दा है। संक्षेप में यह इस बात पर निर्भर करता है कि null
किसी दिए गए कार्य के लिए स्वीकार्य इनपुट मूल्य था या प्रतिक्रिया में क्या अपेक्षित है। अपवाद उन घटनाओं के लिए हैं जो अपेक्षित नहीं थे। मैं उस विषय में आगे नहीं जाऊंगा। यह उत्तर बहुत लंबा है।
std::optional
याOption
। अन्य भाषाओं में, आपको स्वयं एक उपयुक्त तंत्र का निर्माण करना पड़ सकता है, या आप वास्तव मेंnull
या कुछ इसी तरह का सहारा ले सकते हैं क्योंकि यह अधिक मुहावरेदार है।