2011-07-30 20 views
7
में उपयोग _ (अंडरस्कोर)

संभव डुप्लिकेट:
Prefixing property names with an underscore in Objective Cऑब्जेक्टिव-सी: नामकरण चर

ऑब्जेक्टिव-सी किताब मैं पढ़ रहा हूँ और कोड मैंने देखा में से कुछ में, कभी-कभी, लोग परिवर्तनीय नामों में अंडरस्कोर जोड़ते हैं।

जबकि मैं महसूस करते हैं कि यह एक स्थापित सम्मेलन की वजह से है, मुझे आश्चर्य है:

कोई महत्व है कि क्या रेखांकित पछाड़ या चर नाम पूरा करता है? उदाहरण के लिए _name, name and name_ उद्देश्य-सी प्रोग्रामर के रूप में, क्या कुछ भी है, अंडरस्कोर आपको संकेत देता है?

+0

यह प्रश्न मदद की जा सकती है: http://stackoverflow.com/q/5466496/840973 –

उत्तर

17

यह काफी हद तक व्यक्तिगत शैली और रक्षात्मक प्रोग्रामिंग के लिए नीचे है। लेकिन यहां मुख्य कारण है कि मैं व्यक्तिगत रूप से क्यों उपयोग करता हूं और लोगों ने उपसर्ग का उपयोग किया है।

यह आपके इरादे को स्पष्ट करने के साथ करना है कि आप सीधे ivar तक पहुंच रहे हैं या गेटर/सेटर का उपयोग कर रहे हैं या नहीं।

तो मेरे पास है:

@property (nonatomic, retain) NSArray *people; 

और:

@synthesize people = _people; 

यह संकलन और इस तरह गेटर/सेटर घोषणाओं का उत्पादन करेगा:

- (void)setPeople:(NSArray *)people; 
- (NSArray *)people; 

अब सीधे इवर तक पहुँचने के लिए मुझे उपयोग करने की आवश्यकता है:

_people 

गेटर/सेटर मैं डॉट नोटेशन या गेटर/सेटर की तरह उपयोग कर सकते हैं का उपयोग करें:

[self people]; 
// or 
self.people; // which compiles to [self people]; 

// and 
[self setPeople:newPeople]; 
// or 
self.people = newPeople; // which compiles to [self setPeople:newPeople]; 

अब मेरी कोड में अगर मैं गलती से बस टाइप करें:

people = newPeople; // will not compile 

ऐसा नहीं होगा संकलित करें क्योंकि मैं गेटर/सेटर का उपयोग नहीं कर रहा हूं और people नामक कोई इवर नहीं है, यह _people होना चाहिए।

1

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

मैं वास्तव में अपने उद्देश्य-सी कोड में अंडरस्कोर नहीं जोड़ता, लेकिन यह ज्यादातर स्वाद का मामला है और इसका मतलब नहीं है। बस सुनिश्चित करें कि आप मध्य या नामों के अंत में अंडरस्कोर नहीं जोड़ते हैं :)

+0

मुझे यकीन है कि ऐप्पल अपने मूल डेटा टेम्पलेट्स में अंडरस्कोर प्रत्यय का उपयोग करता था लेकिन ऐसा लगता है कि वे अब एक उपसर्ग में बदल गए हैं एक डबल अंडरस्कोर –

+0

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

+0

क्षमा करें मैं आपकी प्रतिक्रिया पर टिप्पणी नहीं कर रहा था, मैं बस यह इंगित कर रहा था कि मैंने इसे पहले देखा है, लेकिन ऐप्पल ने अपने नवीनतम टेम्पलेट्स में भी इसे छीन लिया है, जैसे आपने कहा कि जांच बहुत स्पष्ट नहीं है। –

1

अंडरस्कोर का मतलब निजी है, मैं कर्मियों को अपने स्वयं के इवर का उपयोग नहीं करता, क्योंकि आप हमेशा @private का उपयोग कर सकते हैं और आप ivar को जोड़ सकते हैं .m फ़ाइल अयस्क में इंटरफ़ेस एक्सटेंशन आपके कोड के @implementaion सेक्शन में भी है, यह हाल ही में गुणों के आगमन के साथ आम हो गया है ताकि आप इसे स्वयं को संरक्षित करने के लिए उपयोग कर सकें ताकि संकलक के बाद संपत्ति के बजाय गलती से कोड में ivar तक पहुंच सकें क्या आप त्रुटि के बारे में बता सकते हैं, सी प्रोग्रामिंग में मैं यह दिखाने के लिए अग्रणी के तहत अग्रणी का उपयोग करूँगा कि एक फ़ंक्शन स्वयं निहित नहीं है, इसे किसी अन्य फ़ंक्शन द्वारा उपयोग किया जाएगा और इसे ivar से C++ में भी उपयोग किया जाएगा क्योंकि C++ नहीं करता है एक सदस्य के कार्यों और ivars की तरह एक ही नाम है।

3

यदि आप ऐसे परिवर्तनीय नामों का उपयोग करते हैं, तो आप निश्चित रूप से किसी भी अंडरस्कोर के साथ शुरू होने वाले किसी भी पूंजी पत्र के बाद उपयोग नहीं करना चाहिए। किसी भी (§7.1.3) उपयोग के लिए सी मानक भंडार ऐसे सभी पहचानकर्ता:

सभी पहचानकर्ता कि एक अंडरस्कोर से शुरू और या तो एक अपरकेस अक्षर या किसी अन्य को रेखांकित हमेशा किसी भी उपयोग के लिए आरक्षित हैं।

यानी, सी भाषा (या दिए गए कंपाइलर) का भविष्य संशोधन किसी ऐसे पहचानकर्ता का उपयोग कीवर्ड या लाइब्रेरी फ़ंक्शन नाम के रूप में कर सकता है, जो आपके प्रोग्राम को तोड़ सकता है। इसके प्रकाश में, मैं बस अंडरस्कोर द्वारा उपसर्ग किए गए नामों का उपयोग नहीं करना पसंद करता हूं; आप अंडरस्कोर के बाद पूंजी अक्षरों का उपयोग न करने के बारे में जान सकते हैं, लेकिन यह नए लड़के को साथ आने और इसे करने से नहीं रोकता है।

इसके अतिरिक्त, सभी अंडरस्कोर से शुरू होने वाले पहचानकर्ता फ़ाइल दायरे में आरक्षित हैं; सावधान रहने के लिए एक और गोचा।

5

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

यदि आप अपने इवर और विधि नामों पर उपसर्ग का उपयोग करना चाहते हैं, तो का उपयोग करें, लेकिन एक भी अग्रणी अंडरस्कोर का उपयोग करें।

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