C ++ में गैर-वैकल्पिक पॉइंटर्स बनाम नॉन-कॉस्ट रेफरेंस


12

में अन्य सी ++ विशेषताएं, संदर्भ तर्क की गूगल सी ++ स्टाइल गाइड , मैंने पढ़ा है कि गैर स्थिरांक संदर्भ नहीं किया जाना चाहिए।

संदर्भ द्वारा पारित सभी मापदंडों को कॉस्ट लेबल किया जाना चाहिए।

यह स्पष्ट है कि फ़ंक्शन कॉल को देखने के लिए जो संदर्भों का उपयोग करते हैं, तर्क के रूप में सी प्रोग्रामर के लिए बिल्कुल भ्रमित है, लेकिन सी और सी ++ अब अलग-अलग भाषाएं हैं। यदि एक आउटपुट पैरामीटर की आवश्यकता होती है , तो आवश्यक आउटपुट पैरामीटर के लिए एक पॉइंटर का उपयोग करके, पूरे फ़ंक्शन बॉडी को छोड़ दिया जा सकता है, जो फ़ंक्शन के कार्यान्वयन को और अधिक जटिल बनाता है (औपचारिक रूप से एक फ़ंक्शन के साइक्लोमैटिक जटिलता और गहराई को बढ़ाता है )।

मैं सी ++ कोड को यथासंभव समझना / बनाए रखना आसान बनाना चाहता हूं, इसलिए मैं आमतौर पर कोडिंग स्टाइल गाइड को पढ़ने के लिए इच्छुक हूं। लेकिन एक टीम में सर्वश्रेष्ठ प्रथाओं को अपनाने के लिए, मुझे लगता है कि शैली गाइड तत्वों के पीछे तर्क को समझना एक महत्वपूर्ण कारक है।

क्या गैर-कास्ट संदर्भ वास्तव में खराब हैं? क्या उन्हें केवल Google विशिष्ट बनाना प्रतिबंधित है या यह आमतौर पर स्वीकृत नियम है? संकेत के रूप में आउटपुट मापदंडों को लागू करने के लिए अतिरिक्त प्रयास का क्या औचित्य है?


2
"इसके लिए एक पॉइंटर का उपयोग करने से पूरे फ़ंक्शन बॉडी को छोड़ दिया जाता है" एर, क्या?
शाफ़्ट फ्रीक

@ratchetfreak मैंने इसे स्पष्ट करने की कोशिश की। मैं मानता हूं कि इस तरह के कार्य कुछ डिज़ाइन दोष दिखा सकते हैं। एक पॉइंटर हमेशा औपचारिक रूप से वैकल्पिक होता है, इसलिए इसे डीरफेर करने से पहले इसे जांचना होगा।
वुल्फ

4
Google का C ++ स्टाइल गाइड बहुत पीछे है। मेरे व्यक्तिपरक राय में, इसे जला दिया जाना चाहिए।
सियुआन रेन

इस विशेष आइटम के लिए, मुझे लगता है कि तर्क यह है कि जब एक तर्क दिया जा सकता है कि प्रोग्रामर को मजबूर करने के लिए मजबूर किया जा सकता है कि तर्कों को स्पष्ट रूप से दिखाया जा सके।
सियुआन रेन

4
Google शैली गाइड को Google विरासत परियोजनाओं में सजातीय कोड का समर्थन करने के लिए लिखा गया था। यदि आप लीगेसी प्रोजेक्ट्स पर काम नहीं कर रहे हैं (जो शुरुआत से ही इस स्टाइल गाइड के साथ लिखे गए थे), तो आपको शायद इसका इस्तेमाल नहीं करना चाहिए (यह बहुत सारे नियमों को निर्दिष्ट करता है जो नए कोड के लिए अच्छे नहीं हैं (c ++ 11, c ++ 14) , सी ++ 17))।
utnapistim

जवाबों:


18

Google की शैली मार्गदर्शिका के पीछे तर्क यह है कि किसी फ़ंक्शन की कॉल साइट से यह स्पष्ट करना है कि क्या पैरामीटर इनपुट पैरामीटर है या आउटपुट पैरामीटर है। ( आगे की चर्चा के लिए यहां देखें ।) अन्य भाषाएं डिजाइन द्वारा स्पष्ट किए गए मापदंडों को बनाती हैं; उदाहरण के लिए, C # में एक outकीवर्ड होता है जिसे कॉल साइट पर उपयोग किया जाना चाहिए । चूंकि C ++ इसे स्पष्ट नहीं करता है, इसलिए Google ने const Ref का उपयोग करना चुना। बनाम स्पष्ट करने के लिए सूचक।

क्या यह केवल Google नियम है? नहीं, लेकिन मुझे संदेह है कि यह बहुत व्यापक है। मुझे नहीं लगता कि मैंने इसे Google की शैली मार्गदर्शिका और ऐसे समूहों के बाहर देखा है जो Google शैली मार्गदर्शिका के कुछ हिस्सों का स्पष्ट रूप से पालन करते हैं। (उदाहरण के लिए, मुझे यह विचार पसंद आया जब मैंने पहली बार Google शैली गाइड को वर्षों पहले पढ़ा था और इसे अपने स्वयं के कोड के लिए उपयोग किया था।)

विशेष रूप से, नई घोषित सी ++ कोर दिशानिर्देश सभी (लगभग) के लिए आउटपुट मापदंडों के लिए रिटर्न मान पसंद करते हैं और बाकी के लिए गैर-कॉन्स्टेबल रिफ का उपयोग करते हैं। Google के पॉइंटर्स बनाम संदर्भों के उपयोग से आउटपुट पैरामीटर स्पष्ट हो सकते हैं, लेकिन रिटर्न मान अभी भी स्पष्ट हैं। अब जब C ++ 11 ने मानकीकृत चालें (प्रतिद्वंद्विता संदर्भ, &&कई प्रकार के रिटर्न को सस्ता बनाने के लिए) और ट्यूपल्स (कई मूल्यों को वापस करने का आसान तरीका) की अनुमति दी है, तो कई मापदंडों के उपयोग के मामले अब लागू नहीं होते हैं।

C ++ कोर दिशानिर्देशों में उनके पीछे कुछ बड़े नाम (Bjarne Stroustrup, Herb Sutter) हैं, जो Microsoft द्वारा समर्थित हैं, और नवीनतम C ++ सुविधाओं (Google की शैली मार्गदर्शिका के विपरीत) को गले लगाते हैं, इसलिए मुझे Google से इसकी अनुशंसाएँ बहुत लोकप्रिय होने की उम्मीद है।


आपके उत्तर के लिए धन्यवाद (C # के संक्षिप्त भ्रमण के लिए भी)। आसान समीक्षा निश्चित रूप से एक महत्वपूर्ण बिंदु है, विशेष रूप से ओपन सोर्स परियोजनाओं में। आधुनिक C ++ में सस्ते रिटर्न के साथ, ये विचार अपना महत्व खो देंगे। पुराने लिगेसी सॉफ्टवेयर के साथ और यह पुराने कंपाइलर है जो अभी भी मददगार हो सकते हैं।
वुल्फ

मैं इसके बारे में नहीं भूलता था, लेकिन सी ++ कोर दिशानिर्देशों को प्राप्त करने के लिए जल्दी नहीं है। यह दिलचस्प है कि यह दर्शनशास्त्र नियमों के पीछे तर्क को दर्शाता है और यह भी प्रोग्रामिंग पर एक आधुनिक दृष्टिकोण है ("कोड में सीधे विचार व्यक्त करें" एक छोटे से ज़ेन की तरह अजगर को पढ़ता है) संवाद करने का एक तरीका है।
वुल्फ

अनुपूरक: सी ++ कोड दिशानिर्देशों के दर्शन अनुभाग का सीधा लिंक ।
भेड़िया

1

अमान्य सूचक से निपटने के लिए 2 विकल्प हैं, पहला चेक और प्रारंभिक रिटर्न या इसे अपरिभाषित व्यवहार करने दें (यदि आप मजबूती से अधिक गति की परवाह करते हैं)।

जाँच करना उतना ही सरल है:

void foo(void* buffer){
    if(buffer == nullptr)
        return;

    //actually foo

    // note no increase in indentation required

}

इस प्रकार की जाँच आम तौर पर एक पैरामीटर जाँच के रूप में स्वीकार की जाती है। यदि आपको कोड दिखाई देता है, तो यह स्पष्ट है कि आप गैर-अशक्त पॉइंटर को पास होने की उम्मीद करते हैं और यदि नहीं तो जल्दी लौट आते हैं। यह आपको अमान्य पॉइंटर्स के बारे में इतना चिंतित नहीं होने देता है।


खैर, मैंने इस पैटर्न के बारे में सोचा और इसे बिल्कुल उचित पाया। अफसोस की बात यह है कि यह जानना उतना स्पष्ट नहीं है assert(buffer);कि केवल डीबग संस्करण के लिए ही सक्रिय है, मैं कभी-कभी rt_assert(buffer);एक अपवाद को फेंकना चाहता हूं । के खरोज returnएक छोटे से खतरनाक लग रहा है ... Btw: अपने कोड स्निपेट उत्पादन के लिए संकेत के बारे में मेरे सवाल का एक अच्छा उदाहरण है।
वुल्फ

1

यह आपके अवलोकन के लिए नीचे आता है If an output parameter is required

आउटपुट सिग्नेचर के लिए एक फ़ंक्शन सिग्नेचर की आवश्यकता वाली एकमात्र जगह बाहरी एपीआई द्वारा निर्दिष्ट की जाती है, और ऐसे में आप केवल बाहरी एपीआई को किसी ऐसी चीज में लपेटते हैं जो यह सुनिश्चित करता है कि हमेशा एक वैध पॉइट्टी हो।

आंतरिक रूप से आप "बाहरी" सभी के एक समग्र होने के लिए रिटर्न प्रकार का विस्तार करके आउटपुट मापदंडों से बचते हैं


आपका मतलब है, एकमात्र स्थान जहां मैं एक गैर-अनिवार्य सूचक प्रदान करने में सक्षम नहीं हूं? सच है, लेकिन मुझे यकीन नहीं है कि आपका नियम The only place where...सभी मामलों पर लागू होता है। आप जो सुझाव देते हैं वह जैसा दिखता है: अपने स्वयं के कार्यक्रमों के कार्यों में आउटपुट मापदंडों से बचें। नए कार्यक्रमों के लिए सही है।
वुल्फ

1
हां, आउटपुट पैरामीटर्स से बचें, उस
क्लीयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.