2011-04-03 10 views
11

आप कौन सा पसंद करते हैं? (बेशक getSize किसी भी जटिल गिनती करना नहीं है, बस सदस्य मूल्य लौटने)बार-बार कॉलिंग - कोडिंग अभ्यास

void method1(Object & o) 
{ 
    int size = o.getSize(); 

    someAction(size); 
    someOtherAction(size); 
} 

या

void method2(Object & o) 
{ 
    someAction(o.getSize()); 
    someOtherAction(o.getSize()); 
} 

मैं जानता हूँ कि मैं माप सकते हैं जो एक तेजी से होता है, लेकिन मैं कुछ टिप्पणियाँ चाहते हैं ... नहीं बस समय से संबंधित निष्पादन ... उदाहरण के लिए। यदि आप method2 पसंद करते हैं, तो आप कितनी बार o.getSize का उपयोग करते हैं और आप किस तरीके से विधि 1 तरीके का उपयोग करते हैं? कोई भी सर्वोत्तम प्रथाओं? (फिर भी विभिन्न प्रकारों की कल्पना करें) टीवाई

+5

यदि मैं method1 का उपयोग करना चाहता था तो मैं यह इंगित करने के लिए एक कॉन्स int का उपयोग करता हूं कि मैं फ़ंक्शन के माध्यम से मान नहीं बदल रहा हूं। – Kleist

उत्तर

10

मैं विधि 1 के लिए नहीं जाऊंगा क्योंकि यह शायद मामूली रूप से तेज़ है, लेकिन अधिकतर क्योंकि इसका मतलब है कि मुझे इस बारे में चिंता करने की ज़रूरत नहीं है कि बुलाए गए तरीके के दुष्प्रभाव हैं या नहीं।

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

(और हाँ, अन्य उत्तर प्रति, size एक const int बनाने के लिए सुनिश्चित करें कि इसे संशोधित नहीं कर रहा है अगर यह संदर्भ द्वारा पारित कर दिया है हो सकता है कुछ और करने के लिए)।

0

परिणाम न होने पर किसी भी फ़ंक्शन को बार-बार कॉल करना कचरा है, इसलिए मैं हमेशा पहली विधि के साथ जाऊंगा।

1

मैं पहला दृष्टिकोण पसंद करूंगा। एक फ़ंक्शन को बार-बार कॉल करना मेरे लिए अच्छा प्रतीत नहीं होता है, खासकर अगर लौटा मूल्य हर बार समान होता है। पहला दृष्टिकोण बार-बार एक समारोह को कॉल करने के ऊपरी हिस्से से बचाता है।

1

जब मैं एक ऐसा फ़ंक्शन कॉल करता हूं जो कई बार लौटाता है (2-3 गुना से अधिक) मैं आमतौर पर लौटा मान स्थानीय चर में सहेजता हूं। ऐसा इसलिए है क्योंकि मैं स्मृति की बचत से प्रोग्राम की गति की सराहना करता हूं। यह नहीं कि स्मृति महत्वपूर्ण नहीं होगी। यह सिर्फ परिस्थितियों पर निर्भर करता है। फ़ंक्शन को कॉल करना जो निष्पादित करने में बहुत समय नहीं लेता है, समय लेने वाला नहीं है, लेकिन कई लूप वाले फ़ंक्शन को बड़ी संख्या में बुलाया जाता है, जिससे आपका प्रोग्राम लंबे इंतजार में भेजता है।

+0

यह विकसित करने की आदत है, अन्यथा आप कंप्यूटिंग समय के स्पष्ट अपशिष्ट को याद करेंगे, क्योंकि आप इसके बारे में कभी नहीं सोचते हैं। जैसेsqrt (myvar) को 3 बार कॉल करना, क्योंकि आपको अपने फॉर्मूला –

1

पहला व्यक्ति किसी फ़ंक्शन पर अनावश्यक कॉल को खत्म कर देगा, इसलिए मैं विधि 1() पसंद करता हूं क्योंकि कोड थोड़ा क्लीनर भी दिखता है।

हालांकि, आपको अवगत होना चाहिए कि संदर्भ के आधार पर, वे अलग-अलग परिणाम दे सकते हैं। मान लें, अगर कुछ एक्शन() में आकार बदलता है, और आप आकार चर में संग्रहीत मान का उपयोग करते हैं, तो आपको वांछित परिणाम नहीं मिल सकते हैं।

9

जब से तुम size नहीं करना चाहती बदलने के लिए जब आप someAction() या someOtherAction() फोन (के रूप में यह नहीं कर सकता है जब वह एक समारोह की वापसी मान है), पर विचार करें:

void method3(const Object& o) 
{ 
    const int size = o.getSize(); 

    someAction(size); 
    someOtherAction(size); 
} 

getSize() सरल किया जा सकता है, या यह एक महंगा गणना कर सकता है। इसके अलावा, o का आकार someAction() और someOtherAction() पर आपकी कॉल के बीच किसी अन्य थ्रेड द्वारा बदला जा सकता है।

+1

में 3 बार इसकी आवश्यकता है और जैसे ही समय जाता है, getSize() फ़ंक्शन अधिक जटिल हो सकता है। –

+1

या एक कॉन्स्ट संदर्भ यदि यह एक गैर पीओडी प्रकार है। –

+0

'ओ' एक 'कॉन्स' होना चाहिए, हां। 'आकार' एक 'const' होना चाहिए, भले ही यह गैर-पीओडी हो, क्योंकि हम नहीं चाहते हैं कि यह कॉल के बीच' कुछ क्रिया() 'और' कुछ अन्य क्रिया() 'में बदल जाए। – Johnsyweb

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