2010-11-09 12 views
8

उन पिछले हफ्तों में, मैंने खुद को const हर जगह उपयोग करके पाया। न केवल विधियों या तर्क घोषणाओं में, बल्कि अस्थायी चर के लिए भी।क्या मैं कॉन्स का दुरुपयोग कर रहा हूं?

मुझे एक साधारण कार्य के साथ चित्रित करने दें।

मैं लिखने के लिए प्रयोग किया है:

// A dummy function that sums some computation results 
unsigned int sum_results(const Operation& p1, const Operation& p2) 
{ 
    unsigned int result1 = p1.computeResult(); 
    unsigned int result2 = p2.computeResult(); 

    // Well this function could be in one single line but 
    // assume it does more complex operations 
    return result1 + result2; 
} 

लेकिन अब यह अधिक की तरह है:

// A dummy function that sums some computation results 
unsigned int sum_results(const Operation& p1, const Operation& p2) 
{ 
    const unsigned int result1 = p1.computeResult(); 
    const unsigned int result2 = p2.computeResult(); 

    // Well this function could be in one single line but 
    // assume it does more complex operations 
    return result1 + result2; 
} 

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

क्या कोई कारण है कि यह एक आम मामला नहीं है? क्या मैं const के उपयोग के साथ दुरुपयोग कर रहा हूं? या यह सिर्फ मुझे है कि गलत नमूने को देख रहा है?

उत्तर

21

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

डेवलपर्स आलसी हैं - वे अक्सर सोचते हैं कि यह एक बेकार शब्द है जो कुछ भी नहीं बदलता है। आईएमओ वे गलत हैं।

+3

+1। स्थानीय वेरिएबल्स पर कॉन्स्ट डालना जो बदलना नहीं है (या नहीं बदला जाना चाहिए) त्रुटियों को कैप्चर करने से पहले त्रुटियों को पकड़ता है (स्पष्ट समय पर) और स्पष्ट रूप से अगले प्रोग्रामर को अपना इरादा दिखाता है जिसे आपके कोड को देखना है। –

+1

लेकिन यह बेहतर perfomance या संकलक द्वारा बेहतर अनुकूलन के लिए नेतृत्व करेंगे। – DumbCoder

+2

@ डंबकोडर: शायद, लेकिन अत्यधिक संभावना नहीं है। आधुनिक कंपिलर कोड को अनुकूलित करने में बहुत अच्छे हैं। अगर कोई वास्तव में परवाह करता है, तो उन्हें उत्सर्जित मशीन कोड दोनों का प्रयास करना चाहिए। – sharptooth

5

यह प्रभावी रूप से वही कारण है जिसका दावा शायद ही कभी किया जाता है। इंटरफेस पर const अनिवार्य है, कार्यान्वयन में const स्वैच्छिक है। प्रोग्रामर आलसी हैं।

संपादित करें: अगर यह स्पष्ट नहीं है, तो आपका दृष्टिकोण बेहतर है।

1

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

+0

भले ही यह डमी उदाहरण, न ही 'परिणाम 1' या' परिणाम 2 'संशोधित किया जाना है। वे एक मूल्य धारण करते हैं जो नहीं बदला जाना चाहिए। जब भी मैं अपना कोड कम त्रुटि-प्रवण कर सकता हूं, तो मुझे और कीस्ट्रोक होने पर कोई फर्क नहीं पड़ता। – ereOn

+0

"न ही परिणाम 1 या परिणाम 2 संशोधित करने के लिए हैं। वे एक मान धारण करते हैं जो नहीं बदला जाना चाहिए" तो वे स्थिर होना चाहिए। मेरा मुद्दा केवल यही है कि आप इसे किसी कारण से करते हैं, और यदि आप उस कारण से अवगत हैं तो आपको ऐसा लगेगा कि आप कुछ भी दुरुपयोग कर रहे हैं। – Mud

1

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

इसलिए, ऊपर के प्रकाश में, फ़ंक्शन के लिए स्थानीय चर के लिए, उन्हें बनाना एक प्रकार का ओवरकिल है। हालांकि, ऐसा करने से कुछ भी नुकसान नहीं पहुंचाता है।

1

मेरी विनम्र राय में आपको हर अवसर पर दृढ़ता से टाइप की गई भाषा के कंपाइलर का लाभ उठाना चाहिए। मैं अस्थायी, स्थानीय चर, अपरिवर्तनीय संदर्भ इत्यादि के लिए const का उपयोग करता हूं

Const Correctness C++ FAQ में अधिक उपयोगी जानकारी हो सकती है।

2

मुझे नहीं लगता कि यह पूरी तरह से प्रोग्रामर आलसी होने का मामला है - संक्षिप्तता भी एक विचार है।कुछ लोगों को int x; "कॉन्स इंट एक्स" से कम मानसिक भार मिल सकता है; फ़ंक्शंस की समीक्षा करते समय: थोड़ा अतिरिक्त स्थान उन्हें एक टिप्पणी के साथ फिट करने में मदद कर सकता है। मैं उल्लेख करता हूं कि एक सिफारिश के रूप में नहीं, लेकिन क्योंकि मुझे लगता है कि सभी "लागत" को समझना महत्वपूर्ण है जो लोगों के दृष्टिकोण में कारक है, क्योंकि यह वास्तव में भ्रमित है कि लोग लगातार यहां कांस्ट का उपयोग नहीं करते हैं।

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

फिर भी, मैं आपको सक्रिय रूप से कॉन्स्ट का उपयोग जारी रखने के लिए प्रोत्साहित करता हूं: मैं आमतौर पर ऐसा करता हूं और इसे सर्वोत्तम अभ्यास मानता हूं। इसके कारण आपके द्वारा स्पष्ट रूप से समझा जाता है, और अन्य उत्तरों में उल्लिखित किया गया है।

3

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

शून्य foo (स्थिरांक पूर्णांक);

यहां, मुझे विश्वास है (लेकिन यह वास्तव में व्यक्तिगत स्वाद का मामला है) कि यह बेकार रूप से इंटरफ़ेस को अव्यवस्थित करता है।

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