क्या लोग ऑब्जेक्टिव C में प्रोग्रामिंग करते समय कास्ट का बहुत अधिक उपयोग करते हैं?


13

संबंधित: "NSString * 'प्रकार के पैरामीटर के लिए" const NSString *' भेजना 'क्वालीफायर को छोड़ देता है "चेतावनी

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

हालांकि, अधिकांश उद्देश्य-सी कार्यक्रम के नमूनों में, मैं कभी नहीं देखता हूं const। मेरा सवाल यह है कि क्यों?

जवाबों:


21

जिस तरह से ऑब्जेक्टिव-सी ऑब्जेक्ट्स काम करते हैं, उसके constकारण एक प्रवर्तन होता है और प्रोग्रामर के लिए एक संकेतन होने लगता है। इस कार्यक्रम पर विचार करें:

int f(const int x) {
    return ++x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        int x = 3;
        NSLog(@"%d", f(x));
    }
    return 0;
}

यह वास्तव में यहाँ संकलन नहीं होगा (मैं क्लैंग का उपयोग कर रहा हूँ): कंपाइलर आदिम सी प्रकार को संशोधित करने के प्रयास का पता लगा सकता है और एक त्रुटि का उत्सर्जन करता है। लेकिन अब इस कार्यक्रम से इसकी तुलना करें:

NSMutableString *f2(const NSMutableString * const x) {
    [x appendString: @" world!"];
    return x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSMutableString *x = [@"Hello" mutableCopy];
        NSLog(@"%@", f2(x));
    }
    return 0;
}

भले ही फ़ंक्शन किसी स्थिर ऑब्जेक्ट के लिए एक निरंतर पॉइंटर पारित किया गया हो, फिर भी ऑब्जेक्ट को म्यूट करना संभव है।

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, किसी वस्तु की निरंतर प्रकृति को लागू करने का सबसे अच्छा तरीका उस वस्तु को अपरिवर्तनीय बनाना है - अर्थात ऐसी कोई भी विधि प्रदान न करें जो उसके राज्य को बदल सके। कल्पना कीजिए कि ऊपर के फ़ंक्शन ने NSStringइसके बजाय एक तर्क लिया NSMutableString, और यह कि मैं @"Hello"एक म्यूट कॉपी के बजाय शाब्दिक रूप से पास हो गया । अब, यथोचित रूप से बोल रहा है, पास किए गए ऑब्जेक्ट को बदलने का कोई मौका नहीं है [*]। ऑब्जेक्टिव-सी का अन्य ओओ भाषाओं में संदर्भ constया finalऑब्जेक्ट के विपरीत, हालांकि, इसे लागू करने का कोई तरीका नहीं है ।

तुलना के लिए, constC ++ में पूरी तरह से अलग तरह से काम करता है। यदि मुझे constC ++ ऑब्जेक्ट का संदर्भ मिलता है , तो मुझे केवल constउस ऑब्जेक्ट पर सदस्य फ़ंक्शन को कॉल करने की अनुमति है । ये फ़ंक्शन constऑब्जेक्ट की -नेस को संरक्षित करते हैं , या तो कोई परिवर्तन नहीं करते हैं या केवल सदस्य चर को संशोधित करके जो स्पष्ट रूप mutableसे क्लास डिजाइनर द्वारा चिह्नित किए गए हैं। तो कल्पना कीजिए कि मेरे पास MutableStringC ++ में कुछ प्रकार है जो कि NSMutableStringObjective-C के बराबर है। ऊपर मेरे उदाहरण के बराबर कुछ इस तरह दिखेगा:

MutableString& f3(const MutableString& x) {
  x.appendString(" world!");
  return x;
}

यह निश्चित रूप से संकलित नहीं करेगा: appendString()एक constऑपरेशन नहीं होने के अलावा , फ़ंक्शन constक्वालिफायर को उस प्रकार के संदर्भ से हटा देता है जिसके लिए ए की आवश्यकता होती है const_cast

[*] मुझे उम्मीद है कि इसे करने का कुछ विपरीत तरीका है, लेकिन अब हम एक प्रोग्रामर के दायरे में हैं, जो "चतुर" चीजों को करने के लिए दूसरे को तोड़फोड़ करने की कोशिश कर रहे हैं।


धन्यवाद। इसलिए कॉन्स्ट संशोधक के माध्यम से संशोधन को रोकने का कोई तरीका नहीं है।
user4951

सही। कंपाइलर अभी भी constसजावट को सार्थक मानता है, इसलिए आपको चेतावनियों को दबाने के लिए उपनाम या कास्ट जैसे कॉन्ट्रोवर्सी मिलती हैं, लेकिन इन कॉन्ट्रोवर्सी के परिणामस्वरूप प्रोग्राम के व्यवहार में कोई बदलाव नहीं होता है।

5
मेरा मानना ​​है कि constअभी भी उद्देश्य सी में उपयोगी हो सकता है यह बताने के लिए कि किसी ऑब्जेक्ट को पॉइंटर को एक अलग ऑब्जेक्ट को इंगित करने के लिए कभी नहीं सौंपा गया है । NSString * const xआपके साथ आइए जानते हैं कि xहमेशा एक ही स्ट्रिंग होगी न कि एक अलग स्ट्रिंग।
tboyce12

3

जहाँ तक ऑब्जेक्टिव C जाता है - मैं इसमें प्रोग्राम नहीं करता, इसलिए इस सवाल का जवाब नहीं दे सकता। हालांकि मैं इस सवाल का जवाब दे सकता हूं कि "क्या लोगों constको ऑब्जेक्टिव सी में प्रोग्रामिंग करते समय बहुत अधिक उपयोग करना चाहिए ?" - कि एक निश्चित "हाँ" है।

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

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


0

मैंने बहुत लंबे समय तक ऑब्जेक्टिव-सी का उपयोग नहीं किया है।

हालांकि, मुझे आश्चर्य है कि किसी भी निकाय ने इस पहलू का उल्लेख क्यों नहीं किया।

ऑब्जेक्टिव-सी में पहले से ही स्थिरांक से संबंधित कुछ और है। अस्थिरता

उदाहरण के लिए, Nstring * एक निरंतर स्ट्रिंग को इंगित करेगा। यदि आप एक स्ट्रिंग चाहते हैं जिसे आप संशोधित कर सकते हैं, तो आप NMutableString या ऐसा कुछ उपयोग करते हैं। वह NMutableString अतिरिक्त तरीके प्रदान करेगा जो लोगों को स्ट्रिंग को संशोधित करने की अनुमति देता है।

अब, क्या होगा अगर आप चाहते हैं कि सूचक खुद एक स्थिर हो। मुझे कभी इस बारे में चिंता करने की ज़रूरत नहीं है कि एक बहुत बड़ी परियोजना की कोडिंग करें।

इसलिए मुझे लगता है कि ऐसा क्यों है।

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