2012-03-22 15 views
7

यहां एक प्रश्न है जो सी ++ वर्ग कार्यान्वयन में बार-बार आता है। मैं इस बारे में उत्सुक हूं कि लोगों के विचार यहां क्या हैं। आप कौन सा कोड पसंद करते हैं और क्यों?सी ++ निजी कार्य: चाहे फ़ंक्शन पैरामीटर द्वारा कक्षा सदस्य चर को पास करना है, या

class A 
{ 
public: 
    /* Constructors, Destructors, Public interface functions, etc. */ 
    void publicCall(void); 

private: 
    void f(void); 

    CMyClass m_Member1; 
}; 

void A::publicCall(void) 
{ 
    f(); 
} 

void A::f(void) 
{ 
    // do some stuff populating m_Member1 
} 

या विकल्प के साथ

:

class A 
{ 
public: 
    /* Constructors, Destructors, Public interface functions, etc. */ 
    void publicCall(void); 

private: 
    void f(CMyClass &x); 

    CMyClass m_Member1; 
}; 

साथ

void A::publicCall(void) 
{ 
    f(m_Member1); 
} 

void A::f(CMyClass &x) 
{ 
    // do some stuff to populate x, 
    // locally masking the fact that it's really m_Member1 
} 

मुझे लगता है कि मैं हमेशा एक दूसरे क्योंकि तब f तो किसी पर काम कर सकते हैं पसंद करते हैं 0 का उदाहरणलेकिन, उसने कहा, मेरे पास बहुत सारे कोड हैं जहां पहला f से पहले पूरी तरह वैध है, केवल m_Member1 पर काम करेगा और मैं इसे कोड को और अधिक पठनीय बनाने के लिए वास्तव में दो कार्यों में तोड़ रहा हूं।

हां, यह "उत्तर" प्रश्न से अधिक चर्चा प्रश्न है, लेकिन मुझे तर्क में अधिक दिलचस्पी है। मैं एक उत्तर के रूप में एक प्रतिक्रिया के रूप में चिह्नित करूंगा जो अच्छी तर्क या एक अच्छा मानदंड देता है।

इसके अलावा, ध्यान रखें कि यह सिर्फ एक खिलौना उदाहरण है। कक्षा वास्तविकता में इससे बड़ी होगी और इस प्रकार संगठन महत्वपूर्ण है।

+1

अपने दूसरे मामले में, आप 'f' स्थिर बना सकते हैं, और यह पहले मामले में लगभग समान कोड बनाएगा। –

+1

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

+0

सीएम क्लास के किसी भी उदाहरण पर पहला एफ क्यों संचालित नहीं हो सकता है? – aib

उत्तर

1

अपने आप से पूछें: क्या इसका कोई अर्थ नहीं है, या के अलावा किसी ऑब्जेक्ट के साथ f() पर कॉल करने के लिए इसका कोई अर्थ हो सकता है?

अगर जवाब:

  • नहीं। पैरामीटर रहित f()m_Member1A का एक आंतरिक हिस्सा है।
  • हाँf(CMyClass &) करें। भले ही आप केवल m_Member1 का उपयोग करें, यह आपके द्वारा प्रबंधित कक्षाओं की आंतरिक संपत्ति नहीं है।
  • शायद। खैर ... मैं कहूंगा पैरामीटर रहित f() के साथ जाओ। हमेशा आपके दिमाग को बदलने का विकल्प होता है (वास्तव में परिवर्तन काफी हद तक छोटा होता है)।

यह भी ध्यान रखें कि एक कार्य f() एक अन्य फ़ंक्शन g(CMyClass &) पर कॉल कर सकता है, लेकिन दूसरी तरफ नहीं। तो, f() पर निर्भर करता है, जो आपके विकल्पों को सीमित कर सकता है।

+0

+1 , लेकिन मैं स्वस्थ बहस की भावना में जो कुछ कहा था, उसके कुछ हिस्सों को चुनौती देने जा रहा हूं (अधिकतर क्योंकि मुझे कारण चाहिए): यदि आपके प्रश्न का उत्तर "नहीं" है तो आप 'f()' क्यों पसंद करेंगे? इसके अलावा, आप दूसरे पर पैरामीटर रहित 'f() 'क्यों पसंद करते हैं? मुझे लगता है कि आपके पिछले दो वाक्य यहां कुछ तर्क दे रहे हैं ... –

+0

सबसे पहले, क्योंकि 'm_Member1' को' ए 'का एक अनूठा हिस्सा माना जाता है (उदाहरण के लिए' हेड ''बॉडी' का हिस्सा है) तो' f() 'को 'ए' पर एक ऑपरेशन के रूप में व्याख्या किया जा सकता है, भले ही इसे 'm_Member1' वारायबल (' बॉडी :: pickYourNose() 'को स्पर्श करने की आवश्यकता हो, फिर भी आपके' हेड 'या आपकी' नाक 'के संदर्भ की आवश्यकता नहीं है)। दूसरा: क्योंकि यदि आप एक 'जी (सीएम क्लास एंड)' लिखते हैं जिसे 'f()' कॉल करने की आवश्यकता है, तो अब आप गलत होंगे! – rodrigo

+0

इसके अलावा, एक ही स्थान पर एक ही ऑब्जेक्ट ('सदस्य 1' और' m_Member1') के बिना दो संदर्भ होने के कारण संभवतः ऐसा कोई अच्छा विचार नहीं है। – rodrigo

3

चूंकि आप राय मांग रहे हैं, यदि एक स्टैंडअलोन f(CMyClass&) फ़ंक्शन समझ में आता है और लागू करने योग्य है, तो मैं उस विकल्प का भी पक्ष लेगा। f द्वारा किए गए ऑपरेशन को केवल प्रथम श्रेणी के संदर्भ में समझ में आता है, यदि CMyClass केवल ए के संदर्भ में समझ में आता है, या यदि यह A के अन्य विशेषताओं पर निर्भर करता है तो मैं पहले मामले का चयन करूंगा। मुझे लगता है कि किसी को समस्या के आधार पर फैसला करना होगा।

+0

"अगर मैं एफ द्वारा निष्पादित ऑपरेशन केवल कक्षा ए के संदर्भ में समझ में आता हूं तो मैं दूसरे मामले का चयन करूंगा।" क्या आपका मतलब "पहला मामला" था? –

+0

@ क्रिससा हां वास्तव में, मेरा पहला मामला था! मैं इसे ठीक कर दूंगा। – juanchopanza

1

f या वैश्विक फ़ंक्शन या शायद एक सदस्य फ़ंक्शन CMyClass के स्थिर फ़ंक्शन के रूप में बेहतर नहीं है?

बेशक, ऐसे मामले हैं जहां आप उस समारोह को कॉल करते समय तर्क भेजना बेहतर होते हैं, लेकिन जब आप पहले से ही किसी ऑब्जेक्ट में सीएम क्लास ऑब्जेक्ट पर होते हैं तो आप इसे फिर से क्यों भेजेंगे। यदि आपको बातचीत करने के लिए दोनों सीएम क्लास ऑब्जेक्ट्स की आवश्यकता है, तो A की बजाय, इसे CMyClass सदस्य फ़ंक्शन सूची में जोड़ने से बेहतर हो सकता है।

इसके अलावा, Clean Code राज्यों के रूप में, आप तर्क के साथ किसी भी तर्क के बिना कार्यों के साथ बेहतर हैं। जब कोई अन्य प्रोग्रामर फ़ंक्शन को पढ़ने की कोशिश करता है, तो उसे फ़ंक्शन नाम के अलावा दूसरे पैरामीटर पर ध्यान देना/ध्यान देना चाहिए।

+0

+1 अच्छा अंक। –

1

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

2

हमेशा की तरह, यह निर्भर करता है। प्रत्येक परिदृश्य अलग है।

आपके द्वारा दिए गए विशिष्ट उदाहरण में - पहले मैं आपके वैकल्पिक (void A::f(CMyClass &x)) को मुख्य रूप से अस्वीकार कर दूंगा क्योंकि मुख्य रूप से यह 'गंध' करता है (जैसा कि मार्टिन फाउलर इसे रखता है)। यह एक निजी कार्य है, और जब तक आपको अन्य उदाहरणों के लिए अब का उपयोग करने की आवश्यकता नहीं है, तो इसे सदस्य का उपयोग करें। यदि आवश्यकता उत्पन्न होती है तो आप हमेशा इसे पुन: सक्रिय कर सकते हैं।

कल्पना करें कि f में 2 पैरामीटर होने पर क्या होगा। 3 पैरामीटर 10. क्या हर बार उन्हें भेजने के लिए समझ में आता है? क्या इन पैरामीटर सदस्यों के पास बेहतर नहीं होगा?

और यदि f को A के अन्य तरीकों से इन तर्कों में से कुछ को भेजना पड़ा तो क्या होगा? क्या इसके लिए सदस्यों का उपयोग करना अधिक समझ में नहीं आता है?

यह सब मानते हैं कि f को अन्य जानकारी की आवश्यकता है जो A रखती है, अन्यथा मैं इसे CMyClass की विधि के रूप में ले जाऊंगा।

+0

+1, मुझे यहां तर्क पसंद है। 2,3,10, पैरामीटर चीज मेरी कक्षा के लिए विशेष रूप से प्रासंगिक है क्योंकि यह बड़ा हो जाता है। –

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