आप एक कांस्ट शुद्धता कैसे बन गए? [बन्द है]


25

C ++ के 15 साल बाद, मैंने अभी भी कॉन्स्ट का इस्तेमाल करना नहीं सीखा है। मैं समझता हूं कि यह उपयोग है, लेकिन मैं वास्तव में ऐसी स्थिति में कभी नहीं रहा हूं जहां कॉन्स्ट सही होने से मैं उस समस्या से बचता था जो मैं सामना कर रहा था।

तो आपको कॉन्स्ट्स के लाभ कैसे आए?


3
मुझे लगता है कि कॉन्स्ट्रेक्ट एक इफ़ेक्ट जैसे किसी प्रॉब्लम को हल करने से ज्यादा सही होता है, जैसे कि अगर एक कॉन्सट्रैक या एक साइज़ोफ़ ऑपरेटर।
लीजेंड्स 2k

9
"सी + + में काम करने का कारण यह है कि आप इसे दूर कर सकते हैं। यदि आप इसे दूर नहीं कर सकते हैं, तो आपकी दुनिया बेकार जाएगी।" - एंडर्स हेजेल्सबर्ग
मेसन व्हीलर

1
const एक C प्रकार का संशोधक भी है और पहले ANSI C मानक के बाद से है।
Huperniketes

जावा / सी # द्वारा खराब किए जाने के कारण, मैं एक पागल किस्म का व्यक्ति हूं जो मुझे मिलने वाले किसी भी अवसर को छोड़ने के लिए प्यार करता है। जो गलत हो सकता है वह गलत होगा। यदि कोई संकलन-समय या रन-टाइम सहायता है, तो मुझे गिनें! जैसे ही मैंने इसके बारे में 3-4 बार सुना, मैं एक रूपांतरित हो गया, और इस लिंक के एक हिस्से का अनुसरण किया (सिंटैक्स को देखने के लिए पर्याप्त, मुझे इस बारे में पढ़ने की आवश्यकता क्यों नहीं थी): संभावना.com / Cpp / const.html सिर्फ इसलिए कि मेरे चेहरे पर अभी तक कुछ नहीं उतरा है ... यह सही होने के लिए बहुत कम प्रयास करता है, और यह चोट नहीं करता है। जोएल के विचारों की जाँच करें: joelonsoftware.com/articles/Wrong.html
नौकरी

जवाबों:


28

जब तक मैं दर्शन को अपनाने की कोशिश नहीं करता, तब तक मैं आश्वस्त नहीं था।

मैंने पहली बार constअपने सबसे बुनियादी वर्ग के सदस्यों और सदस्य कार्यों के तर्क को वास्तव में पढ़ने के लिए डालकर शुरू किया ।

वहाँ से, मैं अब और संकलन नहीं कर सका। फिर मैं उन मूल वर्गों का उपयोग करते हुए कोड में जाने के लिए दृढ़ रहा, यह देखें कि constक्या मैं पहले किए गए उपयोग की तुलना में वास्तव में वैध था या नहीं। इसने मुझे रास्ते में कुछ कीड़े को ठीक करने में मदद की क्योंकि मैंने कोड के अन्य भागों में निरंतरता जोड़ दी।

यह संक्रामक है। अधिकांश कोड को और भी अधिक कसाव मिला और मुझे इसे डीबग करना आसान लगा क्योंकि इससे आपको विश्वास हो जाता है कि कंपाइलर आपको रोक देगा अगर आप कुछ ऐसा करना शुरू कर दें जो आपको नहीं करना चाहिए।

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

मैं आश्वस्त था।

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


8
संक्रामक के लिए +1 जिसका अनिवार्य रूप से मतलब है कि आपको या तो एक कांस्ट कन्वर्ट होना चाहिए या पूरी तरह से पूरी तरह से बचना चाहिए।
मार्टिन विकमैन

आपको उन लिबास पर भी भरोसा नहीं करने की जरूरत है जो सही नहीं करते हैं। आपका दृष्टिकोण तब काम नहीं करता है जब इसका मतलब है कि आप किसी भी प्रकार्य कार्य को नहीं कह सकते क्योंकि वे कांस्टेबल नहीं हैं - या आपको इसे हर गुरू कॉल में डालना होगा।
मार्टिन बेकेट

4
+1 के लिए "डिबग करना आसान पाया गया", मैं constस्थानीय चर के लिए भी उपयोग करता हूं जो मुझे पता है कि मुझे बदलने की आवश्यकता नहीं होगी, इस तरह से कोड पढ़ते समय मैं एक ifया एक से अधिक स्किम कर सकता forहूं: मेरा चर एक स्थिर है, मैं पता इसे बदल नहीं होगा! मैं अनुकूलन के बारे में कम परवाह नहीं कर सकता था, लेकिन मेरे पास एक सीमित मस्तिष्क है, और कुछ स्तर के इंडेंटस + कांस्ट-करेक्शन बहुत मदद करते हैं!
मैथ्यू एम।

@ मैथ्यूएमएम .: कभी हास्केल में जाना माना जाता है? ;-)
जियोर्जियो

@ जियोर्जियो: मैंने इसकी खोज की है, यहां तक ​​कि "रियल वर्ल्ड हास्केल" खरीदने के लिए भी गया है। सच कहूं तो मैं डिफ़ॉल्ट रूप से आलस्य और कई गूढ़ संचालकों से रोमांचित नहीं हूं जो उछला है।
मैथ्यू एम।

15

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

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

(संयोग से, मैंने C ++ की एक बोली के लिए GCC का एक कांटा बनाने के विचार के साथ खिलवाड़ किया है जिसमें सभी प्रकार के constस्पष्ट रूप से योग्य नहीं हैं mutable। यदि ऐसी किसी चीज़ के लिए समर्थन है, तो मैं इसे बनाए रखने और उपयोग करने के लिए पूरी तरह से प्रतिबद्ध हूं।)


एक OO दृष्टिकोण से, अप्रतिबंधित अप्रतिबंधित लेखन पहुँच को रोककर encapsulation को लागू करता है। यह कक्षाओं के बीच युग्मन को कम करता है क्योंकि अपरिवर्तनीय वस्तुओं को पूरी तरह से अपने राज्य का प्रबंधन करना चाहिए और इस तरह सामान्य मूल्यों की तरह व्यवहार करना चाहिए। कांस्ट की शुद्धता कार्यक्रम की शुद्धता को साबित करने की प्रक्रिया को काफी आसान बनाती है, विशेष रूप से समवर्ती प्रोग्रामिंग के संदर्भ में। C ++ संदर्भ और C ++ 0x rvalue संदर्भ शब्दार्थ के साथ, आप सभी जगह नकल करने के ओवरहेड के बारे में चिंता किए बिना अपरिवर्तनीय वस्तुओं का उपयोग कर सकते हैं। इसके अलावा, यदि आप ज्यादातर अपरिवर्तनीय वस्तुओं के साथ काम कर रहे हैं तो कंपाइलर कुछ अद्भुत अद्भुत अनुकूलन जादू काम कर सकते हैं।

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


2
आपने मूल रूप से सिर्फ इतना कहा था कि कांस्टेबलनेस एक अच्छी बात है। आपने कहा कि यह "सुरक्षित, बेहतर कोड" की ओर जाता है। क्या आप कह सकते हैं क्यों?
डेविड रीस

मैं पूरी तरह से अपरिवर्तनीयता शिविर में हूं, मेरी पसंदीदा भाषा एरलंग है। लेकिन मैं तर्क दूंगा कि C ++ में कास्ट के माध्यम से अपरिवर्तनीयता वास्तव में स्वतंत्र नहीं है। कम पठनीय कोड, एक ही विधि के कास्ट और नॉन कॉस्ट संस्करण जैसे डाउनसाइड हैं, या कॉस्ट कॉन्स्ट दूर का कारण है "बस कोई अन्य विकल्प नहीं था"।
grok

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

2
@ डेविड थॉर्नले: संगति के लिए, mutableतार्किक विकल्प है। void alter(mutable Point&)समझ में आता है, जैसा कि mutable int fooएक स्थानीय चर के लिए है, और न ही मौजूदा भाषा या मौजूदा उपयोग के साथ इन संघर्षों का mutable। इसके अलावा, Object mutable* mutableयह डरावना है कि यह आवश्यक है या सही है, इस बारे में चेतावनी दी जा सकती है।
जॉन प्यूडी

यदि आप कभी कांटा करते हैं, तो इसके बजाय क्लैंग के साथ जाने पर विचार करें - कम दर्दनाक होना चाहिए।
gf

6

कांस्टेबल शुद्धता का लाभ यह है कि यह कार्यक्रम पर एक अनुशासन लागू करता है, और कार्यक्रम के कुछ हिस्सों के बारे में तर्क करना आसान बनाता है।

अनुशासन यह है कि आपको यह जानने की जरूरत है कि कहां कुछ बदल सकता है। तत्संबंधी लाभ यह है कि यह देखना आसान है कि कोड का एक टुकड़ा क्या होता है जब आप बता सकते हैं कि राज्य क्या बदल सकता है।


1
"प्रोग्राम लोगों को पढ़ने के लिए लिखा जाना चाहिए, और केवल मशीनों को निष्पादित करने के लिए संयोग से।" - एबेल्सन और सुस्मैन, SICP
ब्रैंडन ड्यूरेट

4

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

पुनश्च: मैं पूरी तरह से आश्वस्त हो गया constएक बार जब मैं इसे इस्तेमाल करने में शुद्धता को समझ गया ;)



2

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


2

जैसे ही मुझे पता था कि यह संभव है मैं एक रूपांतरित था। इसने मुझे 'अच्छी प्रोग्रामिंग शैली' के दृष्टिकोण से समझा। कब्ज सही होने के लिए अच्छा अभ्यास क्यों है, इसके कई कारण हैं:

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

2

दो बिंदुओं को संक्षेप में प्रस्तुत करने के लिए जिन्हें अन्य उत्तरों में शामिल किया गया है, और एक नया जोड़ें:

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

  • constसंकलक के लिए आपके इरादे का दस्तावेज। संकलन के उस टुकड़े के चलने के इंतजार में संकलन-समय पर गलतियाँ करना हमेशा बेहतर होता है।

  • constप्रकार सुरक्षित बहुरूपता के लिए आवश्यक है। पॉइंटर्स (अपने सभी रूपों में, केवल कच्चे पॉइंटर्स नहीं) केवल सहसंयोजक हैं यदि वे हैं const(नोट: "पॉइंटर टू कॉन्स्ट" के समान नहीं)। कोवरियन के लिए केवल-पढ़ने के लिए इंटरफ़ेस की आवश्यकता होती है, और कंट्रोवर्सी के लिए केवल-लेखन इंटरफ़ेस की आवश्यकता होती है।

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

तब मुझे पता चला कि अधिकांश #defineएस को वैश्विक स्थिरांक द्वारा (सी ++ में) टाइप-सेफ्टी के अतिरिक्त लाभों के साथ बदला जा सकता है। इसलिए मैंने वहां भी इसका इस्तेमाल किया।

अंत में मैंने टाइप सिस्टम और लैम्ब्डा कैलकुलस पर एक क्लास ली, और सीखा कि constऔर गैर- constप्रकार मौलिक रूप से अलग हैं (क्योंकि वे अलग-अलग ऑपरेशन का समर्थन करते हैं), और तब से मैंने कभी भी भारी उपयोग के बिना C ++ कोड लिखने पर विचार नहीं किया है const


1

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

इसका एक ही सिद्धांत है, लेकिन मैं सिर्फ कास्ट का उपयोग करने का एक व्यावहारिक कारण जोड़ना चाहता था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.