एक नई नौकरी में, मुझे इस तरह कोड के लिए कोड समीक्षाओं में झंडी मिल रही है:
PowerManager::PowerManager(IMsgSender* msgSender)
: msgSender_(msgSender) { }
void PowerManager::SignalShutdown()
{
msgSender_->sendMsg("shutdown()");
}
मुझे बताया गया है कि अंतिम विधि को पढ़ना चाहिए:
void PowerManager::SignalShutdown()
{
if (msgSender_) {
msgSender_->sendMsg("shutdown()");
}
}
यानी, मुझे चर के आसपास एक गार्ड रखना चाहिए , भले ही यह एक निजी डेटा सदस्य हो। मेरे लिए 'ज्ञान' के इस टुकड़े के बारे में कैसा महसूस होता है, इसका वर्णन करने के लिए अपने आप को विपत्तियों का उपयोग करने से रोकना मुश्किल है। जब मैं स्पष्टीकरण मांगता हूं, तो मुझे डरावनी कहानियों के बारे में पता चलता है कि कैसे कुछ जूनियर प्रोग्रामर, कुछ-वर्ष, इस बारे में भ्रमित हो गए कि एक वर्ग को कैसे काम करना चाहिए था और गलती से एक सदस्य को हटा दिया जाना चाहिए (और बाद में इसे सेट नहीं करना चाहिए) , जाहिरा तौर पर), और चीजों को क्षेत्र में सही एक उत्पाद रिलीज होने के बाद विस्फोट से उड़ा दिया, और हम "मुश्किल तरीके से सीखा है, हम पर विश्वास" है कि यह बेहतर है बस के लिए जाँच सब कुछ ।NULLmsgSender_NULLNULL
मेरे लिए, यह कार्गो पंथ प्रोग्रामिंग , सादा और सरल जैसा लगता है। कुछ अच्छी तरह से अर्थ सहकर्मी ईमानदारी से मुझे 'इसे पाने' में मदद करने की कोशिश कर रहे हैं और देखें कि यह कैसे मुझे अधिक मजबूत कोड लिखने में मदद करेगा, लेकिन ... मैं यह महसूस करने में मदद नहीं कर सकता कि वे लोग हैं जो इसे प्राप्त नहीं करते हैं। ।
क्या यह आवश्यक है कि कोडिंग मानक के लिए यह आवश्यक हो कि किसी फ़ंक्शन में प्रत्येक एकल पॉइंटर को NULLपहले भी निजी डेटा सदस्यों के लिए चेक किया जाए ? (नोट: कुछ संदर्भ देने के लिए, हम एक उपभोक्ता इलेक्ट्रॉनिक्स डिवाइस बनाते हैं, न कि एक एयर ट्रैफिक कंट्रोल सिस्टम या कुछ अन्य 'विफलता-समान-लोग-डाई' उत्पाद।)
संपादित करें : उपरोक्त उदाहरण में, msgSender_सहयोगी वैकल्पिक नहीं है। यदि यह कभी है NULL, तो यह बग को इंगित करता है। निर्माणकर्ता में इसे पारित करने का एकमात्र कारण PowerManagerमॉक IMsgSenderसबक्लास के साथ परीक्षण किया जा सकता है ।
सारांश : इस सवाल के कुछ शानदार जवाब थे, सभी का धन्यवाद। मैंने मुख्य रूप से इसकी संक्षिप्तता के कारण @aronps से स्वीकार किया। ऐसा प्रतीत होता है कि काफी व्यापक सामान्य समझौता है:
- हर एक dereferenced पॉइंटर के
NULLलिए अनिवार्य गार्ड ओवरकिल है, लेकिन - आप (यदि संभव हो तो) या
constपॉइंटर के बजाय एक संदर्भ का उपयोग करके पूरी बहस को साइड-स्टेप कर सकते हैं assertबयानों कोNULLसत्यापित करने के लिए गार्ड के लिए एक अधिक प्रबुद्ध विकल्प है कि एक फ़ंक्शन के पूर्व शर्त मिलते हैं।
nullनिष्पादन के लिए बग को स्थानांतरित करने के लिए कुछ भी जांचना और कुछ भी नहीं करना, स्रोत पर वापस ट्रैक करना अधिक कठिन बना देता है।