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