2012-04-17 22 views
11

निम्नलिखित वर्ग पर विचार करें:सी ++ सदस्य चर

class A 
{ 
    A(); 
    int number; 
    void setNumber(int number); 
}; 

आप 3 तरीकों से 'setNumber' को लागू कर सकते हैं:

विधि 1: 'इस' सूचक का प्रयोग करें।

void A::setNumber(int number) 
{ 
    this->number = number; 
} 

विधि 2: गुंजाइश संकल्प ऑपरेटर का प्रयोग करें।

void A::setNumber(int number) 
{ 
    A::number = number; 
} 

विधि 3: इसके बजाय, 'पु' या '_' के साथ सभी सदस्य चर (यह मेरा पसंदीदा तरीका है) को दर्शाते हैं।

void A::setNumber(int number) 
{ 
    mNumber = number; 
} 

क्या यह सिर्फ व्यक्तिगत प्राथमिकता है, या कोई विशेष विधि चुनने का कोई लाभ है?

+0

सबकुछ निजी क्यों है? –

+1

@ आर। मार्टिनिन्हो फर्नांडीस: सादगी के लिए यह एक उदाहरण है। –

+2

तीसरा एक। सी ++ में कभी भी 'this->' का उपयोग करने की आवश्यकता नहीं है, सिवाय इसके कि आप एक टेम्पलेटेड बेस क्लास से निपट रहे हैं। जावा और PHP पर वर्बोज़ शोर छोड़ दें। –

उत्तर

12

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

यह लिंक कई अच्छे, संबंधित, जवाब है: Why use prefixes on member variables in C++ classes

आपका विकल्प 1:

void A::setNumber(int number) 
{ 
    this->number = number; 
} 

सबसे पहले, कई प्रोग्रामर इस बोझिल लगता है, लगातार 'यह पता टाइप करने के लिए करते हैं -> '। दूसरा, और सबसे महत्वपूर्ण बात यह है कि यदि आपके किसी भी चर के पैरामीटर या स्थानीय चर के साथ एक नाम साझा किया गया है, तो कहने के लिए डिज़ाइन किया गया एक खोज-प्रतिस्थापन, 'संख्या' का नाम बदलें, खोज-प्रतिस्थापन क्षेत्र में स्थित सदस्य चर को प्रभावित कर सकता है कुंआ।

आपका विकल्प 2:

void A::setNumber(int number) 
{ 
    A::number = number; 
} 
समस्या मैं इस के साथ आई है

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

आपका विकल्प 3:

void A::setNumber(int number) 
{ 
    mNumber = number; 
} 

यह उन तीन प्रस्तुत विकल्पों में से सबसे अच्छा है। एक वाक्यविन्यास (और होल्डिंग!) बनाकर जिसमें एक स्पष्ट और सार्थक उपसर्ग शामिल है, आप न केवल एक अद्वितीय नाम बनाते हैं जो एक स्थानीय (या वैश्विक) चर साझा नहीं करेगा, लेकिन आप इसे तुरंत स्पष्ट करते हैं कि वह चर घोषित किया गया है, इस संदर्भ के बावजूद कि आप इसे पाते हैं। मैंने इसे 'mavariable' और इस 'm_variable' की तरह दोनों किया है और यह अधिकतर इस बात पर निर्भर करता है कि क्या आप अपरकेस को अपरकेस को पसंद करते हैं। इसके अलावा, यदि आपकी शैली पॉइंटर्स के लिए 'पी' जैसी चीज़ों को जोड़ती है, या ग्लोबल्स के लिए 'जी' चालू होती है, तो यह शैली अच्छी तरह से जाली होगी और पाठकों द्वारा उम्मीद की जाएगी।

5

विकल्प 4:

void A::setNumber(int n) 
{ 
    number = n; 
} 

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

+2

यह मूल रूप से विधि 3. –

+1

लिखा गया है, यह कोई जवाब नहीं है। – Sampson

+0

@ जोनाथन सैम्पसन मैं कह रहा हूं कि उसे न तो पसंद करना चाहिए। –

7

यह शैली का विषय है, इस प्रकार व्यक्तिगत प्राथमिकता, या जिस टीम के साथ आप काम कर रहे हैं उसकी टीम की प्राथमिकता या जिस टीम के साथ आप काम कर रहे हैं उसका मालिक है।

+3

Vlad सही है। बस यह सुनिश्चित करें कि आप किस शैली का उपयोग कर रहे हैं इससे कोई फर्क नहीं पड़ता, आप इसके बारे में धार्मिक नहीं हैं। यह सिर्फ शैली है, और कुछ नहीं। कुंजी यह है कि आपको समझने की जरूरत है कि कोड किस प्रकार लिखे गए शैली के बावजूद कर रहा है, इसलिए इसे ओवरथिंक न करें :) बस आस-पास के कोड का पालन करें जब तक कि आपके पास कोई अच्छा तकनीकी कारण न हो। – Carl

2

मैं विधि 1 और विधि 3 के बीच विकल्प कहेंगे पर उस पर एक अच्छी चर्चा है की बात है व्यक्तिगत या संगठनात्मक शैली।

विधि 2 एक निम्न है क्योंकि कक्षा :: सदस्य आम तौर पर स्थिर सदस्य चर को दर्शाता है, और इस प्रकार एक पैरामीटर और सदस्य चर के बीच असंबद्ध होने पर भ्रम पैदा करेगा।

0

मैं एक बेहतर संस्करण प्रदान करके लुचियन से सहमत होने जा रहा हूं। आपके द्वारा प्रदान किए जाने वाले अन्य उदाहरण बहुत बोझिल या भ्रमित हैं।

विकल्प 4:

void A::setNumber(int aNumber) 
{ 
    theNumber = aNumber; 
} 

यह कोडिंग मानक हम मेरे नियोक्ता पर उपयोग का हिस्सा है और यह बहुत स्पष्ट है कि तुम क्या वर्णन कर रहे हैं। यह हंगेरियन नोटेशन नहीं है।

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