2010-01-29 21 views
5

क्या यह कोड संदिग्ध है या यह पूरी तरह से ठीक है (मानकों द्वारा अनुमोदित/अस्तित्व में किसी भी कंपाइलर के लिए लगातार व्यवहार है)?क्या यह संदिग्ध है या यह बिल्कुल ठीक है?

struct SCustomData { 
    int nCode; 
    int nSum; 
    int nIndex; 
    SCustomData(int nCode, int nSum, int nIndex) 
     : nCode(nCode) 
     , nSum(nSum) 
     , nIndex(nIndex) 
    {} 
}; 

संपादित करें:
हाँ, मैं तथ्य यह है कि सदस्य चर निर्माता की औपचारिक मानकों के साथ एक ही नाम है की चर्चा करते हुए कर रहा हूँ।

+3

मैं ईमानदार रहूंगा, मुझे इसे दो बार पढ़ना पड़ा था ... अगर मुझे दो बार एक ही कोड पढ़ना पड़े तो मैं शायद दुखी डेवलपर बनूंगा। –

+3

क्षमा करें, लेकिन इसके बारे में क्या संदिग्ध होना चाहिए? मेरे लिए सीधा दिखता है। –

+0

संदिग्ध (मानव के लिए) एक विशेषता और पैरामीटर दोनों के लिए समान पहचानकर्ता है ... –

उत्तर

6

नहीं, इस मामले में कोई अस्पष्टता नहीं है, लेकिन निम्नलिखित पर विचार:

struct SCustomData { 
//... 
    void SetCode(int nCode) 
    { 
      //OOPS!!! Here we do nothing! 
      //nCode = nCode; 

      //This works but still error prone 
      this->nCode = nCode; 
    } 
}; 

आप मौजूदा कोडिंग शैलियों में से एक की ओर ध्यान आकर्षित करना चाहिए। उदाहरण के लिए General Naming Rule in Google C++ Coding Styles या हर्ब सटर और आंद्रेई अलेक्जेंड्रेसकू द्वारा उत्कृष्ट पुस्तक "C++ Coding Standards: 101 Rules, Guidelines, and Best Practices" पढ़ें।

+0

सरल नियम मैं हर समय उपयोग करता हूं: पैरामीटर के लिए पहला अक्षर अपरकेस, निजी क्षेत्रों के लिए लोअरकेस। –

+0

मैं सटर की शैली पसंद करता हूं: ऊंट केस - पैरामीटर के लिए (कोड - इस उदाहरण में), ऊंट केस और अंडरस्कोर (_) - निजी क्षेत्रों के लिए (code_ - इस उदाहरण में)। –

4

आपका उदाहरण अस्पष्ट (मेरे लिए) है, लेकिन यह अच्छा अभ्यास नहीं है, क्योंकि यह जल्दी से नरक के रूप में संदिग्ध हो सकता है।

यह बहुत लंबा है क्योंकि मैंने क्रोध में कोई सी ++ लिखा है, इसलिए मैं अनुमान लगा रहा हूं कि निम्नलिखित क्या करेंगे।
क्या आप जानते हैं यह क्या करेगा? क्या आपको यकीन है?

class Noddy 
{ 
    int* i; 
    Noddy(int *i) 
    : i(i) 
    { 
     if(i == NULL) 
      i = new int; 
    } 
}; 
+1

हाँ, मुझे पता है कि यह क्या करेगा, लेकिन मैं अपने सहयोगियों को पैसे नहीं सकाऊंगा :) –

+0

मुझे बताओ मुझे बताओ मुझे बताओ! क्या आंतरिक 'मैं' निकटतम घोषित 'का जिक्र कर रहा हूं: तर्क? (प्रारंभकर्ता सूची स्पष्ट रूप से केवल सदस्य को संदर्भित कर सकती है) – xtofl

+2

@xtofl: सही, ऐसा करने के लिए इसे "दिखने" जैसा करना चाहिए, इसे घुंघराले ब्रेसिज़ के अंदर "यह-> i" होना आवश्यक है {} –

1

यदि आप सदस्यों और कन्स्ट्रक्टर तर्कों के लिए समान नाम का उपयोग करने का जिक्र कर रहे हैं, तो यह बिल्कुल ठीक है। हालांकि, आपको कुछ लोग मिल सकते हैं जो जोर देते हैं कि किसी कारण से यह खराब अभ्यास है।

यदि आपको कन्स्ट्रक्टर बॉडी में सदस्यों तक पहुंचने की आवश्यकता है, तो आपको सावधान रहना होगा - या तो तर्क अलग-अलग नाम दें, या सदस्यों तक पहुंचने के लिए this-> का उपयोग करें।

यदि आप छद्म हंगेरियाई मौसा का उपयोग करने के लिए लोगों को याद दिलाने के लिए जिक्र कर रहे हैं कि पूर्णांक पूर्णांक हैं, तो तकनीकी रूप से अनुमति है, लेकिन इसका कोई लाभ नहीं है और कोड को पढ़ने के लिए बहुत कठिन बनाता है। कृपया यह मत करो।

+1

"उन लोगों में से एक" के रूप में, मेरे कारण हैं ए) ओपी को इसके बारे में पूछना था - तो शायद अन्य लोग ऐसे कोड पढ़ेंगे और बी) अपना दूसरा पैरा देखें। –

+1

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

1

सामान्य रूप से, मैंने बिना किसी उपसर्ग के कन्स्ट्रक्टर में अंडरस्कोर और नामित पैरामीटर के साथ आवृत्ति चर का चयन किया है। कम से कम, यह आपके पैरामीटर को आपके आवृत्ति चर से अलग कर देगा। यह कन्स्ट्रक्टर के शरीर के भीतर शुरू होने पर जीवन को कम व्यस्त बनाता है।

struct SCustomData { 
    int _nCode; 
    int _nSum; 
    int _nIndex; 
    SCustomData(int nCode, int nSum, int nIndex) 
     : _nCode(nCode), _nSum(nSum), _nIndex(nIndex) 
    {} 
}; 

// Alternatively 
struct SCustomData { 
    int _nCode; 
    SCustomData(int nCode) 
    { 
     this->_nCode = nCode; 
    } 
}; 

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

+4

दुर्भाग्यवश, अंडरस्कोर से शुरू होने वाले पहचानकर्ता नाम सी और सी ++ दोनों में आरक्षित हैं। – aib

0

यह पूरी तरह से मानक के अनुरूप है, लेकिन वहाँ compilers वहाँ बाहर है कि सदस्य चर निर्माता पैरामीटर के रूप में एक ही नाम होने स्वीकार नहीं करेगा कर रहे हैं । वास्तव में, मुझे उस कारण से अपनी ओपन सोर्स लाइब्रेरी बदलनी पड़ी। this patch

1

मैं कहूंगा कि यह बिल्कुल ठीक है।

यह उन रचनाकारों के लिए मेरी पसंदीदा शैली है जो प्रारंभिक सूची का उपयोग करते हैं और उनके पास कोई कोड नहीं है। मुझे लगता है कि यह भ्रम को कम करता है क्योंकि यह स्पष्ट है कि कौन सा सदस्य कन्स्ट्रक्टर पैरामीटर जाता है।

संबंधित मुद्दे