2010-01-04 6 views
12

मैं थोड़ी देर के लिए उद्देश्य-सी का उपयोग कर रहा हूं लेकिन स्थिर प्रकार की पृष्ठभूमि (सी #) से होने पर मुझे लगता है कि मैं इसे एक बहुत ही स्थिर तरीके से उपयोग कर रहा हूं। आईडी के रूप में वस्तुओं को घोषित करना मेरे लिए विदेशी लगता है और मैं नहीं देख सकता कि लाभ क्या हैं। क्या कोई इस बारे में बेहतर समझने के लिए मेरे लिए एक प्रकाश चमकता है?उद्देश्य-सी गतिशील विशेषताओं का सर्वोत्तम उपयोग करना

उत्तर

13

उद्देश्य-सी एक संकर भाषा की तरह है, जिसमें आप गतिशील और यथासंभव स्थिर हो सकते हैं। यदि आप चाहें तो सभी प्रकार के सभी चर घोषित कर सकते हैं, आप एनएसओब्जेक्ट < प्रोटोकॉल > * के रूप में प्रतिनिधि चर घोषित कर सकते हैं। आईडी प्रकार वास्तविक प्रकार के रूप में कम काम करता है और कंपाइलर को संकेत देता है कि उसे "हे, मुझे पता है कि मैं क्या कर रहा हूं, बस मुझ पर भरोसा करें", जिससे कंपाइलर उस विशेष चर पर किसी भी प्रकार की जांच से बचने में मदद करता है ।

उद्देश्य-सी प्रकार प्रणाली का पहला स्पष्ट लाभ यह है कि कंटेनर प्रकार (एनएसएआरएआरई, एनएस डिक्शनरी, एनएसएसएटी) स्वीकार करते हैं और आईडी प्रकार वापस करते हैं। यह टेम्पलेट्स और जेनेरिकों की पूरी तरह से आवश्यकता को हटा देता है (जैसे सी ++, जावा और सी #)।

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

एक और लाभ कम संकलन समय है; ऑब्जेक्टिव-सी प्रोग्राम का संकलन सी ++ में इसके बराबर की तुलना में सामान्य रूप से बहुत तेज़ है, यह देखते हुए कि कई प्रकार के चेक नहीं किए जाते हैं, और रनटाइम पर बहुत अधिक लिंकिंग किया जाता है। कंपाइलर अधिक प्रोग्रामर पर भरोसा करता है।

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

मैं व्यक्तिगत रूप से अधिक स्थिर प्रकार की जांच के साथ काम करना पसंद करता हूं, और मैं उद्देश्य-सी संकलक में "त्रुटियों के रूप में चेतावनियों के रूप में चेतावनी" सेटिंग भी चालू करता हूं; मैं इसके बारे में एक ब्लॉग पोस्ट में लिखा है:

http://akosma.com/2009/07/16/objective-c-compiler-warnings/

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

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

+1

धन्यवाद @akosma इस उत्कृष्ट उत्तर को लिखने के लिए समय निकालने के लिए। : डी –

3

यह वास्तव में दुर्लभ है कि आपको ऑब्जेक्ट को id टाइप करने की आवश्यकता होगी, क्योंकि आपको आमतौर पर यह पता होना चाहिए कि आप किस प्रकार की अपेक्षा कर रहे हैं। कभी-कभी आप id<Protocol> प्रकार का उपयोग कर सकते हैं, यदि आप किसी ऑब्जेक्ट के वास्तविक प्रकार को नहीं जानते हैं लेकिन जानते हैं कि यह किसी विशिष्ट प्रोटोकॉल के अनुरूप होना चाहिए।

क्या कोई विशेष परिदृश्य है जिसके बारे में आप सोच रहे हैं?

+0

मैं आईडी का उपयोग कर रहा हूं लेकिन यह मुझे दृढ़ता से टाइप करता है और सी # में इंटरफेस का उपयोग करने के समान है। मैंने लोगों को उल्लेख किया है कि कुछ कार्य गतिशील भाषाओं में तुच्छ हो जाते हैं लेकिन उन्होंने कभी भी कोई उदाहरण नहीं दिया। मुझे लगता है कि मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि मुझे भाषा का पूरा लाभ मिल रहा है और दृढ़ता से टाइप करके सोचने के लिए चीजों को कठिन बना रहा है। – Ian1971

2

id के रूप में उत्तीर्ण उदाहरण सामान्य है जब कार्रवाई की विधि तैयार करना; किसी विधि को बटन से कनेक्ट करना, लक्ष्य doSomething:(id) sender; जैसा दिखता है।

इस मामले में, यह विभिन्न नियंत्रणों को उसी क्रिया की विधि का उपयोग करने की अनुमति देता है, बिना इन नियंत्रणों के पूर्व ज्ञान के। एक्शन के विधि कोड में, आप यह तय करने के लिए प्रेषक की कक्षा के लिए परीक्षण कर सकते हैं या बस tag संपत्ति का उपयोग कर सकते हैं।

-(void) doSomething:(id) sender { 
    // Get the sender's tag whatever it is 
    int tag = [sender tag]; 
    switch(tag) { 
     case 1: 
      // ... 
      break; 
     case 2: 
      // ... 
      break; 
    } 
} 
5

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

DO आपको एक अलग ऐप/अलग मशीन में ओब्जे-सी ऑब्जेक्ट के लिए प्रॉक्सी ऑब्जेक्ट सेट करने की अनुमति देता है। यह प्रॉक्सी ऑब्जेक्ट को भेजे गए सभी संदेश को अवरुद्ध करके, इसे पैक करने, इसे अन्य ऐप पर भेजने और इसे वहां आमंत्रित करने के द्वारा किया जाता है।

KVO गतिशील रूप से सेटटर विधि को प्रतिस्थापित करके कार्यान्वित किया जाता है ताकि यह स्वचालित रूप से पर्यवेक्षकों को सूचित कर सके। आदि (ठीक है यह तथ्य यह है कि तुलना में सूक्ष्म में है ...)

CoreData accessorsNSManagedObject से प्रत्येक उपवर्ग के लिए रन टाइम पर उत्पन्न कर रहे हैं,

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

माइक एश ने रनटाइम कैसे काम करता है और इसका प्रभावी ढंग से उपयोग करने के तरीके पर ब्लॉग पोस्ट की उत्कृष्ट श्रृंखला लिखी है। आपको बस इसे पढ़ना है! DO, KVO, message forwarding और अधिक। नेट पर कई अन्य रोचक पोस्ट भी हैं, जैसे fun with kvc और उच्च-आदेश संदेश 1, 2

+0

+1 यह लिंक का एक बड़ा संग्रह है - धन्यवाद! –

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