2009-08-21 7 views
8

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

मुझे लगता है कि मैं सामान लिखने के लिए की तरह हैं:

- (void)dealloc { 
    [self->someVar release]; 
    [self->anotherVar release]; 
    [super dealloc]; 
} 

या

- (void)setVar:(Foo *)newVar { 
    [self->var autorelease]; 
    self->var = [newVar retain]; 
} 

कई बार की एक पूरी बहुत कुछ नहीं कर रहे हैं जब हम कभी भी एक का उपयोग किए बिना हमारे उदाहरण चर का उपयोग करना चाहिए encapsulation के लिए accessor, लेकिन कभी-कभी हमें dealloc, या कस्टम गेटर्स और सेटर्स में की जरूरत है।

क्या मैं ऐसा करने के लिए एक बुरे व्यक्ति/प्रोग्रामर हूं? क्या इस तरह कोड लिखने के लिए कुछ वाकई अच्छा कारण है? क्योंकि यह इस तरह से करने के लिए वास्तव में अच्छा लगता है।

उत्तर

7

चक सही है कि तकनीकी कारण है कि आपको इसे इस तरह से लिखना नहीं चाहिए, जब तक कि आप स्थानीय चर के साथ ivars को छाया नहीं दे रहे हैं, जो आम तौर पर एक बुरा विचार है। हालांकि, यह तर्कसंगत है कि self-> छोड़कर स्टाइलिस्टिक क्लीनर है, और यह निश्चित रूप से कम वर्बोज़ कोड में परिणाम देता है। व्यक्तिगत रूप से मुझे self-> विचलित होने के लिए मिलेगा (विशेष रूप से यदि कोड अच्छी तरह डिज़ाइन किया गया है और चर का नाम अच्छी तरह से नामित है) लेकिन यदि यह आपके लिए चीजों को और अधिक समझ में आता है, तो हर तरह से इसे करें। बस जागरूक रहें कि यदि आप अन्य कोड-सी प्रोग्रामर को अपना कोड दिखाते हैं, तो उनके पास एक विवादित राय होने की संभावना है, इसलिए एक सोच त्वचा होना अच्छा है। इसके अलावा, अधिकांश प्रोग्रामर पाते हैं कि समय और अनुभव के साथ कोड "अच्छा महसूस" करने के बारे में उनकी धारणा है, और वे राय अक्सर उम्र के साथ मिलती है। :-)

+2

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

+0

लॉल। "त्वचा सोचो"। क्या वह त्वचा है जो पतली और मोटी तरह की है? – Rob

7

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

+0

त्वरित उत्तर के लिए बहुत बहुत धन्यवाद! –

4

संक्षिप्त उत्तर: नहीं, आप इसके कारण खराब प्रोग्रामर नहीं हैं :) इस तरह कोड लिखने के लिए कोई अच्छा कारण भी नहीं है; अधिकांश प्रोग्रामर बस आलसी हैं या कभी भी अपने पूरे जीवन में एक थकाऊ विधि नहीं लिखी है।

लंबा उत्तर: तकनीकी रूप से जब आप "self->" के बिना एक चर का उपयोग करते हैं, तो संकलक स्थानीय क्षेत्र में उस नाम के चर के लिए पहले होगा और यदि यह कोई नहीं मिल पाता है, तो यह उस खोज को आवृत्ति चर के साथ दोहराएगा। अगर इसे वहां हिट मिलती है, तो यह वास्तव में कोड उत्पन्न करेगा जैसे कि "स्वयं -> ..." वहां लिखा गया था। यदि आवृत्ति चर के लिए कोई मिलान नहीं था, तो कंपाइलर वैश्विक दायरे, बीटीडब्ल्यू के भीतर प्रयास करेगा।

अधिकांश प्रोग्रामर केवल अपना कोड पढ़ते हैं और वे बहुत अच्छी तरह से जानते हैं कि एक उदाहरण चर क्या है और क्या नहीं। एक बार जब आपको कभी कोड के साथ काम करना पड़ा तो आपने स्वयं को नहीं लिखा है, जहां विधि 4 स्क्रीन पेज लंबी है (और मेरे पास एक बड़ी स्क्रीन है), जब आप प्रोग्रामर ने प्रत्येक चर पहुंच पर बिल्कुल स्पष्ट किया है तो आप वाकई आभारी हैं: क्या वह चर है विधि कॉल को खिलाया गया पैरामीटर, इस विधि का एक स्थानीय चर, ऑब्जेक्ट का एक आवृत्ति चर या संभवतः एक वैश्विक चर (केवल इस वर्ग के सभी उदाहरणों के लिए वैश्विक या संभवतः वैश्विक वैश्विक)। आप आभारी हैं, क्योंकि यदि समान नाम वाले चर के एक समूह हैं और कोई विशेष नामकरण या एक्सेस पैटर्न नहीं है, हालांकि सभी अलग-अलग प्रकार, आप बहुत जल्दी निरीक्षण खो देते हैं।और इस तथ्य पर भरोसा करते हुए कि एक्सकोड सिंटैक्स हाइलाइट्स को स्थानीय चर के मुकाबले अलग-अलग तरीकों से हाइलाइट करता है, क्योंकि बेवकूफ़ों को कोडक को कोड को संपादित करने के लिए मजबूर होना पड़ता है और यहां तक ​​कि यदि वह करता है, तो उसके पास एक रंग योजना हो सकती है जहां उदाहरण वैरिएबल स्थानीय रंग के समान रंग हैं।

स्वयं-> के माध्यम से आवृत्ति चर का उपयोग करना पूरी तरह से ठीक है, लेकिन शायद एक उपसर्ग/प्रत्यय का उपयोग करने पर भी विचार करें, जो यह भी स्पष्ट करेगा कि वे आवृत्ति चर हैं और विधि पैरामीटर या स्थानीय चर के साथ संघर्ष नामकरण से बचें।

1

उद्देश्य सी स्वचालित रूप से i-var नाम में अंडरस्कोर जोड़ता है, इसलिए जब आप "_someVar" देखते हैं तो यह वर्ग स्कोप का निहित है। अंडरस्कोर स्वयं को जोड़ने के बिना अपने दायरे को स्पष्ट करने के लिए एक दृश्य मार्कर का पर्याप्त है।

+0

मैं आपसे सहमत हूं कि यदि आप 'dealloc' में जारी किए गए '_omeVar' को देखते हैं या कस्टम सेटर में सेट करते हैं, तो आप उचित रूप से आश्वस्त हो सकते हैं कि यह एक ivar है। लेकिन अगर मैंने उन संदर्भों में 'कुछ वार' देखा, तो शायद मुझे लगता है कि यह एक ivar था, केवल एक जिसे मैन्युअल रूप से परिभाषित किया गया था या मैन्युअल रूप से संश्लेषित किया गया था ('@ संश्लेषण' के साथ)। निचली पंक्ति, यह कहना एक मजबूत है कि एक अग्रणी '_' का अर्थ है कि यह" अंधा "है। अंडरस्कोर न तो आवश्यक है और न ही पर्याप्त स्थिति है। लेकिन आप सही हैं कि सर्वोत्तम अभ्यास गुणों का उपयोग करना है, इवर्स को आपके लिए संश्लेषित किया जाना चाहिए, और उनके पास अग्रणी अंडरस्कोर होगा। – Rob

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