घोषित संपत्तियों के लिए डॉट नोटेशन बनाम संदेश नोटेशन


81

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

प्रॉपर्टी एक्सेस करने के लिए डॉट नोटेशन बनाम मैसेज नोटेशन के बारे में आपका क्या विचार है?

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

मान्य टिप्पणी तकनीकी मुद्दों (ऑपरेशन ऑर्डरिंग, कास्ट प्रीसेडेंस, प्रदर्शन, आदि), स्पष्टता (संरचना बनाम वस्तु प्रकृति, दोनों समर्थक और कांग्रेस!), सक्सेसनेस, आदि के साथ करना है।

ध्यान दें, मैं बड़ी परियोजनाओं पर काम करने वाले कोड में कठोर गुणवत्ता और पठनीयता का स्कूल हूं, जहां कोड कन्वेंशन और गुणवत्ता सर्वोपरि है (एक बार एक हजार बार प्रतिमान पढ़ें)।


14
+1 यह एक बेहतरीन सवाल है, और आपको बहुत सारे परस्पर विरोधी जवाब मिलने वाले हैं। =)
डेव डोंगलांग

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

जवाबों:


64

व्यवहार के लिए डॉट का उपयोग न करें। सामान की तरह विशेषता तक पहुंचने या सेट करने के लिए डॉट का उपयोग करें, आमतौर पर गुणों के रूप में घोषित विशेषताओं।

x = foo.name; // good
foo.age = 42; // good

y = x.retain; // bad

k.release; // compiler should warn, but some don't. Oops.

v.lockFocusIfCanDraw; /// ooh... no. bad bad bad

उद्देश्य-सी के लिए नए लोगों के लिए, मैं किसी भी चीज़ के लिए डॉट का उपयोग नहीं करने की सलाह दूंगा, लेकिन सामान @property के रूप में। एक बार जब आप भाषा के लिए महसूस करते हैं, तो वही करें जो सही लगता है।

उदाहरण के लिए, मुझे निम्नलिखित पूरी तरह से स्वाभाविक लगता है:

k = anArray.count;
for (NSView *v in myView.subviews) { ... };

आप यह उम्मीद कर सकते हैं कि क्लैंग स्टैटिक एनालाइज़र आपको यह जाँचने की अनुमति देने की क्षमता बढ़ाएगा कि बिंदी का उपयोग केवल कुछ पैटर्न के लिए किया जा रहा है या कुछ अन्य पैटर्न के लिए नहीं।


18
वाह, मुझे यह भी नहीं पता था कि आप गुणों के अलावा किसी अन्य चीज़ के लिए डॉट सिंटैक्स का उपयोग कर सकते हैं। रंग मुझे हैरान! (लेकिन मैं मानता हूं, डॉट को केवल संपत्तियों के लिए उपयोग किया जाना चाहिए)
18-21 पर jbrennan

13
यह गलत है। एक समान विधि कॉल के लिए डॉट नोटेशन एक सीधे आगे का पर्याय है; न कुछ ज्यादा, न कुछ कम।
बीबीएम

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

4
यह @propertyकेवल तक ही सीमित हो सकता है, लेकिन दोनों को एपीआई के उपभोक्ता को जानकारी की एक और बूलियन आयाम सीखने की आवश्यकता होगी और एपीआई के डिजाइनरों को इस बात पर तर्क में डूबने की संभावना है कि क्या होना चाहिए और क्या नहीं होना चाहिए @property। ध्यान दें कि Xcode पसंद करता है - @propertyकोड पूरा करते समय अधिक भारी - निहित तरीकों का वजन .... इसे प्रोत्साहित किया जाता है, लेकिन लागू नहीं किया जाता है।
bbum

1
@rodamn यह जवाब देता है कि; यह @propertyभाषा के लिए नया होने पर ही घोषित एक्सेसर्स के साथ डॉट का उपयोग करने की सिफारिश करता है। ऑब्जेक्टिव-सी में कोडिंग से आत्मविश्वास बढ़ता है, जो सही लगता है वही करें। दिलचस्प; हम में से कई डॉट के बहुत सीमित उपयोग के लिए वापस आ गए हैं।
बीबीम

22

मुझे यह कहकर शुरू करने दें कि मैंने विज़ुअल / रियल बेसिक में प्रोग्रामिंग शुरू कर दी है, फिर जावा पर स्थानांतरित हो गया, इसलिए मैं काफी हद तक डॉट सिंटैक्स का उपयोग कर रहा हूं। हालाँकि, जब मैं अंत में ऑब्जेक्टिव-सी में चला गया और कोष्ठक के लिए अभ्यस्त हो गया, तब ऑब्जेक्टिव-सी 2.0 और इसके डॉट सिंटैक्स की शुरूआत देखी, तो मैंने महसूस किया कि मुझे वास्तव में यह पसंद नहीं है। (अन्य भाषाओं के लिए यह ठीक है, क्योंकि वे कैसे रोल करते हैं)।

मेरे पास ऑब्जेक्टिव-सी में डॉट सिंटैक्स के साथ तीन मुख्य बीफ हैं:

बीफ़ # 1: यह स्पष्ट नहीं करता है कि आपको त्रुटियां क्यों हो सकती हैं। उदाहरण के लिए, यदि मेरे पास लाइन है:

something.frame.origin.x = 42;

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

something.frame.origin.x = 42;

फिर यह सिर्फ ठीक संकलित करता है, क्योंकि somethingएक संरचना ही है जिसमें एक NSRect सदस्य है, और मैं इसे एक अंतराल के रूप में उपयोग कर सकता हूं ।

अगर मैं इस कोड को अपना रहा था, तो मुझे यह जानने की कोशिश करने में कुछ समय बिताना होगा कि क्या somethingहै। क्या यह एक संरचना है? यह एक वस्तु है? हालाँकि, जब हम ब्रैकेट सिंटैक्स का उपयोग करते हैं, तो यह अधिक स्पष्ट होता है:

[something setFrame:newFrame];

इस मामले में, अगर somethingकोई वस्तु है या नहीं तो बिल्कुल अस्पष्टता नहीं है। अस्पष्टता का परिचय मेरी गोमांस # 1 है।

बीफ़ # 2: C में, डॉट सिंटैक्स का उपयोग स्ट्रक्चर्स के सदस्यों तक पहुँचने के लिए किया जाता है, कॉल विधियों के लिए नहीं। प्रोग्रामर ऑब्जेक्ट्स के तरीकों setFoo:और fooतरीकों को ओवरराइड कर सकते हैं , फिर भी उनके माध्यम से एक्सेस कर सकते हैं something.foo। मेरे दिमाग में, जब मैं डॉट सिंटैक्स का उपयोग करते हुए भाव देखता हूं, तो मैं उनसे आइवर में एक साधारण असाइनमेंट होने की उम्मीद कर रहा हूं। ऐसी स्थिति हर बार नहीं होती है। एक नियंत्रक ऑब्जेक्ट पर विचार करें जो एक सरणी और एक टेबलव्यू की मध्यस्थता करता है। अगर मैं फोन करता हूं myController.contentArray = newArray;, तो मैं यह उम्मीद करूंगा कि यह नए एरे के साथ पुराने एरे की जगह लेगा। हालाँकि, मूल प्रोग्रामर setContentArray:ने सरणी को न केवल सेट करने के लिए ओवरराइड किया होगा, बल्कि टेबलव्यू को पुनः लोड भी किया होगा। रेखा से, उस व्यवहार का कोई संकेत नहीं है। अगर मुझे देखना होता[myController setContentArray:newArray];, तो मुझे लगता है कि "अहा, एक विधि। मुझे यह सुनिश्चित करने के लिए इस विधि की परिभाषा देखने की जरूरत है कि मुझे पता है कि मैं क्या कर रहा हूं।"

इसलिए मुझे लगता है कि बीफ # 2 का मेरा सारांश यह है कि आप कस्टम कोड के साथ डॉट सिंटैक्स के अर्थ को ओवरराइड कर सकते हैं।

बीफ़ # 3: मुझे लगता है कि यह बुरा लग रहा है। एक उद्देश्य-सी प्रोग्रामर के रूप में, मैं पूरी तरह से सिंटैक्स का उपयोग करता हूं, इसलिए साथ पढ़ने और सुंदर कोष्ठक की पंक्तियों और लाइनों को देखने और फिर अचानक से टूटने foo.name = newName; foo.size = newSize;आदि के लिए मुझे थोड़ा विचलित कर रहा है। मुझे पता है कि कुछ चीजों के लिए डॉट सिंटैक्स (सी स्ट्रक्चर्स) की आवश्यकता होती है, लेकिन यह एकमात्र समय है जब मैं उनका उपयोग करता हूं।

बेशक, यदि आप अपने लिए कोड लिख रहे हैं, तो जो भी आपके लिए आरामदायक हो, उसका उपयोग करें। लेकिन अगर आप ऐसा कोड लिख रहे हैं, जिसकी आप ओपन सोर्सिंग पर योजना बना रहे हैं, या आप कुछ ऐसा लिख ​​रहे हैं, जिसकी आपको उम्मीद नहीं है, तो मैं ब्रैकेट सिंटैक्स का उपयोग करके मजबूत होगा। यह, ज़ाहिर है, सिर्फ मेरी राय है।

डॉट सिंटैक्स के खिलाफ हालिया ब्लॉग पोस्ट: http://weblog.bignerdranch.com/?p=83

रिबूटल से ऊपर की पोस्ट: http://eschatologist.net/blog/?p=226 (मूल वाक्य के साथ डॉट सिंटैक्स के पक्ष में: http://eschatologist.net/blog/?p=160 )


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

2
@ यह कुछ हद तक एक किनारे का मामला है, लेकिन मैं काफी अनुबंध विकास का काम करता हूं, जिसमें विरासत में मिली परियोजनाओं और उनके साथ काम करना शामिल है। आमतौर something पर एक वस्तु है, लेकिन मैं एक दो स्थानों पर आया हूं जहां मूल लेखकों ने संरचना (गति, कम स्मृति उपयोग, आदि) के लिए बनाई है, और मुझे यह जानने की कोशिश करते हुए एक अच्छा युगल मिनट बिताना होगा कि कोड क्यों नहीं है ' टी संकलन।
डेव डोंगलांग

14

मैं एक नया कोको / उद्देश्य-सी डेवलपर हूं, और इस पर मेरा काम है:

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

हालाँकि, मैं इसे एक शैलीगत पसंद मानता हूं, और मुझे नहीं लगता कि कोई सही या गलत तरीका है, जब तक यह सुसंगत और पठनीय है , ठीक वैसे ही जैसे किसी भी अन्य शैलीगत विकल्प के साथ (जैसे कि आपके शुरुआती घुंघराले ब्रेस को उसी लाइन पर रखना विधि शीर्ष लेख या अगली पंक्ति)।


2
+1 शानदार जवाब। मैं वास्तव में इसके पीछे "क्यों" जानना चाहूंगा। शायद bbum या mmalc को इसका उत्तर पता है ... (वे दोनों
डेव डोंगलांग

11

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

इसके बाद मेरे द्वारा देखे गए पेशेवरों और विपक्षों को इस प्रस्तावना की आवश्यकता थी:

डॉट नोटेशन पेशेवरों और विपक्ष

  • पेशेवरों

    • पठनीयता: नेस्टेड कोष्ठक मालिश की तुलना में डॉट नोटेशन को पढ़ना आसान है
    • यह गुण और गुणों के साथ बातचीत को सरल बनाता है : गुणों के लिए डॉट संकेतन का उपयोग करना और उन विधियों के लिए संदेश संकेतन का उपयोग करना जो आप सिंटेक्स स्तर पर राज्य और व्यवहार को अलग कर सकते हैं।
    • यौगिक असाइनमेंट ऑपरेटर (1) का उपयोग करना संभव है ।
    • @propertyकंपाइलर का उपयोग और डॉट नोटेशन आपके लिए बहुत काम करता है, यह संपत्ति प्राप्त करते समय और सेट करते समय अच्छे मेमोरी मैनेजमेंट के लिए कोड उत्पन्न कर सकता है; यही कारण है कि Apple के आधिकारिक गाइड द्वारा डॉट नोटेशन का सुझाव दिया गया है।
  • विपक्ष

    • डॉट संकेतन की अनुमति केवल एक घोषित तक पहुंच के लिए है @property
    • चूंकि ऑब्जेक्टिव-सी मानक सी (भाषा विस्तार) से ऊपर की परत है, इसलिए डॉट नोटेशन वास्तव में यह स्पष्ट नहीं करता है कि एक्सेस की गई वस्तु एक वस्तु या संरचना है या नहीं। अक्सर, ऐसा लगता है कि आप किसी संरचना के गुणों तक पहुँच रहे हैं।
    • डॉट नोटेशन के साथ एक विधि को कॉल करने पर आप नामांकित पैरामीटर पठनीयता लाभ खो देते हैं
    • जब मिश्रित संदेश संकेतन और डॉट संकेतन ऐसा लगता है कि आप दो अलग-अलग भाषाओं में कोडिंग कर रहे हैं

कोड उदाहरण:

(1) कंपाउंड ऑपरेटर उपयोग कोड उदाहरण:

//Use of compound operator on a property of an object
anObject.var += 1;
//This is not possible with standard message notation
[anObject setVar:[anObject var] + 1];

7

भाषा की शैली का उपयोग करना, भाषा के अनुरूप, यहाँ सबसे अच्छी सलाह है। हालाँकि, यह OO सिस्टम (या इसके विपरीत) में कार्यात्मक कोड लिखने का मामला नहीं है और डॉट नोटेशन ऑब्जेक्टिव-सी 2.0 में सिंटैक्स का हिस्सा है।

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

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

संपत्ति के उपयोग के दुष्प्रभाव हो सकते हैं। यह उस संपत्ति का अधिग्रहण करने के लिए उपयोग किए गए वाक्यविन्यास के लिए रूढ़िवादी है। कोरडाटा, प्रतिनिधिमंडल, गतिशील गुण (पहले + अंतिम = पूर्ण) सभी आवश्यक रूप से कवर के तहत कुछ काम करेंगे। लेकिन यह एक वस्तु के 'गुणों' के साथ 'उदाहरण चर' को भ्रमित करने वाला होगा। ऐसा कोई कारण नहीं है कि गुणों को आवश्यक रूप से संग्रहीत करने की आवश्यकता है, खासकर अगर उन्हें गणना की जा सकती है (उदाहरण के लिए एक स्ट्रिंग की लंबाई, उदाहरण के लिए)। तो चाहे आप foo.fullName का उपयोग करें या [foo fullName] का अभी भी गतिशील मूल्यांकन होने वाला है।

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

अंततः, यह 'एक संरचना जैसा दिखता है' सवाल पर उबलता है। यह शायद अब तक की बहसों में मुख्य अंतर है; यदि आपके पास एक संरचना है, तो यह एक वस्तु की तुलना में अलग तरह से काम करता है। लेकिन यह हमेशा सच रहा है; आप एक संदेश भेज नहीं सकते हैं, और आपको यह जानना होगा कि क्या यह स्टैक-आधारित या संदर्भ / मॉलॉक आधारित है। पहले से ही मानसिक मॉडल हैं जो उपयोग ([[CGRect आवंटित] init] या संरचनात्मक CGRect)) के संदर्भ में भिन्न हैं। वे व्यवहार के मामले में कभी एकीकृत नहीं हुए हैं; आपको यह जानना होगा कि आप प्रत्येक मामले में क्या कर रहे हैं। किसी भी प्रोग्रामर को भ्रमित करने के लिए ऑब्जेक्ट के लिए प्रॉपर्टी डिनोटेशन जोड़ना बहुत मुश्किल है जो जानता है कि उनके डेटा प्रकार क्या हैं; और यदि वे नहीं करते हैं, तो उन्हें बड़ी समस्याएं मिली हैं।

स्थिरता के लिए के रूप में; (उद्देश्य-) C स्वयं के भीतर असंगत है। = स्रोत कोड में शाब्दिक स्थिति के आधार पर असाइनमेंट और समानता दोनों के लिए उपयोग किया जाता है। * पॉइंटर्स और गुणा के लिए उपयोग किया जाता है। बीओएल चार्ट्स हैं, बाइट्स (या अन्य पूर्णांक मान) नहीं, क्रमशः हां और नं 1 और 0 होने के बावजूद। संगति या पवित्रता वह नहीं है जो भाषा के लिए डिज़ाइन की गई थी; यह चीजों को पूरा करने के बारे में था।

इसलिए यदि आप इसका उपयोग नहीं करना चाहते हैं, तो इसका उपयोग न करें। इसे अलग तरीके से करें। यदि आप इसका उपयोग करना चाहते हैं, और आप इसे समझते हैं, यदि आप इसका उपयोग करते हैं तो यह ठीक है। अन्य भाषाएं जेनेरिक डेटा संरचनाओं (नक्शे / संरचनाएं) और ऑब्जेक्ट प्रकार (गुणों के साथ) की अवधारणाओं से निपटती हैं, अक्सर इस तथ्य के बावजूद दोनों के लिए एक ही वाक्यविन्यास का उपयोग करते हुए कि एक केवल एक डेटा संरचना है और दूसरा एक समृद्ध वस्तु है। ऑब्जेक्टिव-सी में प्रोग्रामर के पास प्रोग्रामिंग की सभी शैलियों से निपटने में सक्षम होने के लिए एक समान क्षमता होनी चाहिए, भले ही वह आपका पसंदीदा न हो।


6

मैं इसका उपयोग गुणों के लिए करता हूं क्योंकि

for ( Person *person in group.people){ ... }

से पढ़ने के लिए थोड़ा आसान है

for ( Person *person in [group  people]){ ... }

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

उदाहरण के लिए, किसी संग्रह को संशोधित करते समय मैं इसका उपयोग करूंगा:

[group.people addObject:another_person];

से थोड़ा अधिक पठनीय है

[[group people] addObject:another_person];

इस मामले में जोर दो संदेशों का पीछा करने के बजाय एक ऑब्जेक्ट को सरणी में जोड़ने की कार्रवाई में होना चाहिए।


5

मुझे ज्यादातर ऑब्जेक्टिव-सी 2.0 उम्र में उठाया गया है, और मैं डॉट नोटेशन पसंद करता हूं। मेरे लिए, यह अतिरिक्त कोष्ठक के बजाय, कोड के सरलीकरण की अनुमति देता है, मैं बस एक डॉट का उपयोग कर सकता हूं।

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

इसके आस-पास की कुछ बहस "लेकिन हमारे पास पहले से ही डॉट-सिंटेक्स है, और यह structs" के लिए चिंतित है । और यह सच है। लेकिन (और फिर, यह सिर्फ मनोवैज्ञानिक है) यह मूल रूप से मुझे ऐसा ही लगता है। डॉट-सिंटैक्स का उपयोग करके किसी ऑब्जेक्ट की संपत्ति तक पहुंचना एक संरचना के सदस्य तक पहुंचने के समान लगता है, जो कि कम या ज्यादा इच्छित प्रभाव (मेरी राय में) है।

**** संपादित करें: जैसा कि बीबम ने बताया है, आप किसी भी विधि को किसी वस्तु पर कॉल करने के लिए डॉट-सिंटैक्स का उपयोग कर सकते हैं (मैं इससे अनजान था)। तो मैं कहूंगा कि डॉट-सिंटैक्स पर मेरी राय केवल एक वस्तु के गुणों से निपटने के लिए है, न कि हर रोज संदेश भेजने वाले **


3

मैं बहुत ज्यादा मैसेजिंग सिंटैक्स पसंद करता हूं ... लेकिन सिर्फ इसलिए कि मैंने जो सीखा है। मेरी बहुत सी कक्षाओं को ध्यान में रखते हुए और जो भी नहीं हैं वे ऑब्जेक्टिव-सी 1.0 स्टाइल में हैं, मैं उन्हें नहीं मिलाना चाहता। मेरे पास डॉट सिंटैक्स का उपयोग न करने के लिए "मैं क्या करने के लिए उपयोग किया जाता है" के अलावा कोई वास्तविक कारण नहीं है ... इसके लिए EXCEPT, यह मुझे निष्क्रिय कर देता है

[myInstance.methodThatReturnsAnObject sendAMessageToIt]

मुझे पता नहीं क्यों, लेकिन यह वास्तव में मुझे प्रभावित करता है, बिना किसी अच्छे कारण के। मैं बस यही सोच रहा हूं

[[myInstance methodThatReturnsAnObject] sendAMessageToIt]

अधिक पठनीय है। लेकिन प्रत्येक उसके अपने के लिए!


3
मैं समय-समय पर ऐसा करता हूं, लेकिन केवल अगर मैं एक संपत्ति तक पहुंच रहा हूं। उदाहरण के लिए: [self.title lowercaseString]या कुछ और। लेकिन मैं शैलीगत रूप से देख सकता हूं कि वाक्यविन्यास मिश्रण और मेल खाने के लिए क्यों परेशान है। इसका एकमात्र कारण यह है कि मैं सीधे रखता हूं कि एक संपत्ति क्या है और एक विधि क्या है जो एक वस्तु लौटाती है (मुझे पता है कि गुण वास्तव में बस हैं, लेकिन आप उम्मीद करते हैं कि मुझे क्या मतलब है)।
jbrennan

3

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


3

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक मुख्य लाभ यह है कि वस्तुओं की आंतरिक स्थिति तक कोई सीधी पहुंच नहीं है।

डॉट सिंटैक्स मुझे ऐसा लगता है कि इसे देखने और महसूस करने का प्रयास किया जा रहा है क्योंकि राज्य सीधे पहुँचा जा रहा है। लेकिन सच में, यह व्यवहार के ऊपर सिर्फ सिंथेटिक चीनी है -foo और -setFoo:। स्वयं, मैं एक कुदाल को कुदाल कहना पसंद करता हूं। डॉट सिंटैक्स इस हद तक पठनीयता में मदद करता है कि कोड अधिक रसीला हो, लेकिन यह समझने में मदद नहीं करता है क्योंकि यह ध्यान रखने में विफल है कि आप वास्तव में कॉलिंग -foo और -setFoo: परेशानी का सामना कर सकते हैं।

सिंथेसाइज्ड एक्सेसर्स मुझे लगता है कि जिन वस्तुओं को सीधे राज्य में एक्सेस किया गया है, उन्हें लिखना आसान बनाने का प्रयास है। मेरा मानना ​​है कि यह बिल्कुल उसी तरह के कार्यक्रम डिजाइन को प्रोत्साहित करता है जिससे बचने के लिए ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग बनाई गई थी।

शेष राशि पर, मैं डॉट सिंटैक्स और गुण कभी नहीं पेश किया गया था। मैं लोगों को यह बताने में सक्षम हुआ करता था कि ओब्जेक्ट सी को स्मॉलटाक की तरह बनाने के लिए सी के लिए कुछ साफ एक्सटेंशन है, और मुझे नहीं लगता कि यह सच है।


2

मेरी राय में, डॉट सिंटैक्स ऑब्जेक्टिव-सी कम स्माल्टॉक-एस्क बनाता है। यह कोड को सरल बना सकता है, लेकिन अस्पष्टता जोड़ता है। यह एक है struct, unionया वस्तु?


2

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

इसलिए मेरा मानना ​​है कि "डॉट सिंटैक्स आपको सोच में डाल देता है कि आप वैरिएबल को एक्सेस कर रहे हैं इसलिए यह भ्रमित है" गलत है। डॉट या ब्रैकेट, आपको आंतरिक के बारे में धारणा नहीं बनानी चाहिए: यह एक संपत्ति है, एक आइवर नहीं है।


एक साइड नोट के रूप में, ऑब्जेक्टिव-सी ऑब्जेक्ट रेफरेंस सी स्ट्रक्चर्स वैरिएबल नहीं हैं, बल्कि 'पॉइंटर्स टू स्ट्रक्चर' की तरह हैं, इसलिए डॉट सिंटैक्स सीधे सदस्यों तक पहुंचने का कोई मतलब नहीं होगा; यह तीर ऑपरेटर है ->जो उस भूमिका को पूरा करता है (जब भी कहा जाता है कि आइवरी एक्सेस-प्रतिबंधित नहीं हैं, तो निश्चित रूप से)।
निकोलस मिआरी

1

मुझे लगता है कि मैं डॉट नोटेशन के बजाय मैसेजिंग पर स्विच कर सकता हूं क्योंकि मेरे सिर में ऑब्जेक्ट ।stanceVar सिर्फ उदाहरण के लिए है जो कि संबंधित है वस्तु , मेरे लिए यह एक तरह सभी पर गौर नहीं करता विधि कॉल है, जो यह है, इसलिए वहाँ जा रहा बातें हो सकता है अपने एक्सेसर में और आप का उपयोग करते हैं instanceVar या self.instanceVar ज्यादा अंतर से अधिक बस निहित बनाम स्पष्ट हो सकता था। बस मेरे 2 ¢


1

डॉट संकेतन संदेश को किसी संरचना के सदस्य तक पहुंच बनाने की कोशिश करता है, जो वे नहीं हैं। कुछ मामलों में ठीक काम हो सकता है। लेकिन जल्द ही कोई इस तरह की चीज लेकर आएगा:

NSView *myView = ...;
myView.frame.size.width = newWidth;

ठीक लग रहा है। लेकिन नहीं है। यह वैसा ही है

[myView frame].size.width = newWidth;

जो काम नहीं करता है। संकलक पहले को स्वीकार करता है, लेकिन सही ढंग से दूसरा नहीं। और यहां तक ​​कि अगर यह पहली बार एक त्रुटि या चेतावनी उत्सर्जित करता है, तो यह केवल भ्रमित है।


1

मुझे आलसी कहो लेकिन अगर मुझे एक ही टाइप करना है '।' बनाम दो [] हर बार एक ही परिणाम प्राप्त करने के लिए मैं एक एकल पसंद करूंगा। मुझे वाचाल भाषाओं से नफरत है। लिस्प में () ने मुझे पागल कर दिया। सुरुचिपूर्ण भाषा जैसे कि गणित संक्षिप्त और प्रभावी है, अन्य सभी कम हो जाते हैं।


1
समस्या गणित है, हालांकि संक्षिप्त और प्रभावी है, एक नियमित भाषा नहीं है और इसलिए हम इसे पार्स और संकलित नहीं कर सकते हैं। ध्यान दें, उदाहरण के लिए, गणित के कार्यों में उन्हें कोष्ठक के साथ लिखना आम है, क्योंकि इसके बिना पालन करना अधिक कठिन होगा।
jbrennan

1

डॉट नोटेशन का उपयोग करें (जब भी आप कर सकते हैं)

उदाहरण के तरीकों में कुछ मूल्य लौटाते हैं

डॉट नोटेशन का उपयोग न करें

उदाहरण के तरीके शून्य पर लौटने, init तरीकों पर या कक्षा विधि पर।

और मेरा व्यक्तिगत पसंदीदा अपवाद

NSMutableArray * array = @[].mutableCopy;

0

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

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

मैं अभी भी विचार कर रहा हूं कि क्या मैं केवीसी आज्ञाकारी या घोषित संपत्ति के मूल्य को पुनः प्राप्त करते समय डॉट-नोटेशन का उपयोग करना चाहता हूं, क्योंकि यह माना जाता है कि यह थोड़ा अधिक कॉम्पैक्ट और पठनीय है और इसमें कोई छिपा शब्दार्थ नहीं है। अभी मैं स्थिरता के लिए संदेश-संकेतन के साथ चिपका हूँ।


1
अभी भी छिपी हुई बातें हो सकती हैं। एक गेट्टर सिर्फ एक इंस्टेंस चर वापस करने के अलावा अन्य काम कर सकता है। यहां तक ​​कि अगर यह एक घोषित संपत्ति है, तो गेट को संश्लेषित करने की आवश्यकता नहीं है या यह एक उपवर्ग में ओवरराइड किया जा सकता है।
स्वेन

-1

ठीक है, ऑब्जेक्टिव-सी में डॉट नोटेशन वास्तव में अजीब लगता है। लेकिन मैं अभी भी इसके बिना निम्नलिखित नहीं कर सकता:

int width = self.frame.size.width;

ठीक काम करता है, लेकिन:

int height = [[[self frame] size] height];

मुझे "एक पॉइंटर प्रकार में परिवर्तित नहीं कर सकता" देता है। मैं वास्तव में अपने कोड को संदेश संकेतन के अनुरूप देखना चाहूंगा, हालाँकि।


5
-फ्रेम एक NSRect लौटाता है, जो एक C संरचना है, एक Object-C ऑब्जेक्ट नहीं। इसलिए दूसरा उदाहरण संकलक त्रुटि का कारण बनता है। यह होना चाहिए: इंट हाइट = [सेल्फ फ्रेम] .साइज़.हाइट;

1
माना। लेकिन ब्रैकेट के बाद डॉट भयानक लग रहा है! मैं आमतौर पर एक स्थानीय चर में पहले आयत को संग्रहीत करता हूं।
निकोलस मियारी

-2

यह एक महान प्रश्न है और मुझे इसके कई अलग-अलग उत्तर मिलते हैं। हालाँकि बहुत से लोगों ने विषयों को छुआ है, लेकिन मैं इसका उत्तर एक अलग कोण से देने की कोशिश करूँगा (कुछ ने इसे संक्षेप में किया होगा):

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


क्या आप जानते हैं कि ObjectiveC में चयनकर्ता किसी भी स्थिति में मूल्यांकन, हल और रनटाइम के दौरान किए गए हैं? इसलिए डॉट-नोटेशन पुरानी ब्रैकेट शैली के लिए एक शुद्ध पर्याय है। जो भी हो तकनीकी मतभेद नहीं हैं। आपकी गति धारणाएं गलत हैं - इसे आज़माएं, इंस्ट्रूमेंट्स का उपयोग करें और स्वयं देखें।
तक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.