मैं थोड़ी देर के लिए उद्देश्य-सी का उपयोग कर रहा हूं लेकिन स्थिर प्रकार की पृष्ठभूमि (सी #) से होने पर मुझे लगता है कि मैं इसे एक बहुत ही स्थिर तरीके से उपयोग कर रहा हूं। आईडी के रूप में वस्तुओं को घोषित करना मेरे लिए विदेशी लगता है और मैं नहीं देख सकता कि लाभ क्या हैं। क्या कोई इस बारे में बेहतर समझने के लिए मेरे लिए एक प्रकाश चमकता है?उद्देश्य-सी गतिशील विशेषताओं का सर्वोत्तम उपयोग करना
उत्तर
उद्देश्य-सी एक संकर भाषा की तरह है, जिसमें आप गतिशील और यथासंभव स्थिर हो सकते हैं। यदि आप चाहें तो सभी प्रकार के सभी चर घोषित कर सकते हैं, आप एनएसओब्जेक्ट < प्रोटोकॉल > * के रूप में प्रतिनिधि चर घोषित कर सकते हैं। आईडी प्रकार वास्तविक प्रकार के रूप में कम काम करता है और कंपाइलर को संकेत देता है कि उसे "हे, मुझे पता है कि मैं क्या कर रहा हूं, बस मुझ पर भरोसा करें", जिससे कंपाइलर उस विशेष चर पर किसी भी प्रकार की जांच से बचने में मदद करता है ।
उद्देश्य-सी प्रकार प्रणाली का पहला स्पष्ट लाभ यह है कि कंटेनर प्रकार (एनएसएआरएआरई, एनएस डिक्शनरी, एनएसएसएटी) स्वीकार करते हैं और आईडी प्रकार वापस करते हैं। यह टेम्पलेट्स और जेनेरिकों की पूरी तरह से आवश्यकता को हटा देता है (जैसे सी ++, जावा और सी #)।
इससे भी बेहतर, आप वास्तव में किसी भी प्रकार के तत्वों के साथ कंटेनर रख सकते हैं। जब तक आप जानते हैं कि अंदर क्या होता है, तो कोई भी शिकायत नहीं करेगा यदि आप दो एनएसएसआरटींग्स, एक एनएसएनंबर और एनएसवीएलयू को उसी एनएसएआरएआरई के अंदर जोड़ते हैं। आप इसे अन्य भाषाओं में कर सकते हैं, लेकिन आपको "ऑब्जेक्ट" बेस क्लास, या शून्य * प्रकार का उपयोग करना होगा, और फिर आपको वही व्यवहार प्राप्त करने के लिए बॉक्स और अनबॉक्स (या ऊपर और नीचे) चर की आवश्यकता होती है। उद्देश्य-सी में आप बस असाइन करते हैं, जो ऑपरेटरों और मुक्केबाजी संचालन कास्टिंग द्वारा उत्पन्न शोर को हटा देता है। फिर आप रनटाइम पर पहचान और संचालन के बारे में जानने के लिए, प्रत्येक ऑब्जेक्ट को "जवाब देने के लिए चयनकर्ता:" या "कक्षा" पूछ सकते हैं। उद्देश्य-सी में, प्रतिबिंब एक प्रथम श्रेणी का नागरिक है।
एक और लाभ कम संकलन समय है; ऑब्जेक्टिव-सी प्रोग्राम का संकलन सी ++ में इसके बराबर की तुलना में सामान्य रूप से बहुत तेज़ है, यह देखते हुए कि कई प्रकार के चेक नहीं किए जाते हैं, और रनटाइम पर बहुत अधिक लिंकिंग किया जाता है। कंपाइलर अधिक प्रोग्रामर पर भरोसा करता है।
अंत में, उद्देश्य-सी की गतिशील प्रकार प्रणाली इंटरफेस बिल्डर जैसे टूल के लिए संभव बनाता है। यह मुख्य कारण है कि कोको और कोको टच में तेजी से विकास के समय क्यों हैं; जीयूआई पूरे स्थान पर "आईडी" प्रकारों के साथ कोड उत्पन्न कर सकता है, और जब भी एनआईबी स्मृति में लोड होता है तो यह deserialized है। यूआई डिज़ाइन अनुभव के संदर्भ में ऑब्जेक्टिव-सी के करीब आने वाली एकमात्र भाषा सी # (और निश्चित रूप से वीबी.नेट) है, लेकिन बहुत अधिक भारी आवेदन की कीमत पर।
मैं व्यक्तिगत रूप से अधिक स्थिर प्रकार की जांच के साथ काम करना पसंद करता हूं, और मैं उद्देश्य-सी संकलक में "त्रुटियों के रूप में चेतावनियों के रूप में चेतावनी" सेटिंग भी चालू करता हूं; मैं इसके बारे में एक ब्लॉग पोस्ट में लिखा है:
http://akosma.com/2009/07/16/objective-c-compiler-warnings/
यह विशेष रूप से उपयोगी है जब आप डेवलपर्स जो भाषा के लिए नए हैं के साथ काम कर रहे हैं। यह सामान्य से अधिक कंपाइलर whine बनाता है :)
स्टेटिक टाइप सिस्टम पंडित इन सभी बिंदुओं से असहमत हो सकते हैं, बहस करते हैं कि स्थिर प्रकार की जांच "इंटेलिजेंस" आईडीई और सामान्य रूप से बेहतर रखरखाव की अनुमति देती है। मैंने वर्षों से (2001 - 2006) का उपयोग करके काम किया और मुझे कहना होगा कि गतिशील भाषाएं कम कोड उत्पन्न करती हैं, पढ़ने में आसान होती हैं, और सामान्य रूप से, काम करने की अधिक स्वतंत्रता देती है। ट्रेडऑफ (हमेशा एक ट्रेडऑफ होता है) यह है कि संकलन समय पर कम जानकारी है। लेकिन जैसा कि मैं कहता हूं, कंपाइलर्स एक गरीब व्यक्ति के परीक्षण के सूट हैं। सबसे अच्छी बात यह है कि आईएमएचओ परीक्षणों का एक अच्छा सूट है, और मानव परीक्षकों का एक अच्छा गुच्छा बग खोजने के लिए आपके कोड को यातना दे रहा है, इससे कोई फर्क नहीं पड़ता कि आप कौन सी भाषा चुनते हैं।
यह वास्तव में दुर्लभ है कि आपको ऑब्जेक्ट को id
टाइप करने की आवश्यकता होगी, क्योंकि आपको आमतौर पर यह पता होना चाहिए कि आप किस प्रकार की अपेक्षा कर रहे हैं। कभी-कभी आप id<Protocol>
प्रकार का उपयोग कर सकते हैं, यदि आप किसी ऑब्जेक्ट के वास्तविक प्रकार को नहीं जानते हैं लेकिन जानते हैं कि यह किसी विशिष्ट प्रोटोकॉल के अनुरूप होना चाहिए।
क्या कोई विशेष परिदृश्य है जिसके बारे में आप सोच रहे हैं?
मैं आईडी
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;
}
}
उद्देश्य-सी की गतिशीलता न केवल इस तथ्य में चमकता है कि प्रत्येक वस्तु id
है। इसके बजाय, यह उद्देश्य-सी रनटाइम की शक्ति और इसका उपयोग करने में आसानी की चमक में चमकता है। ऐप्पल द्वारा रनटाइम के चालाक उपयोग के कुछ उदाहरण:
DO आपको एक अलग ऐप/अलग मशीन में ओब्जे-सी ऑब्जेक्ट के लिए प्रॉक्सी ऑब्जेक्ट सेट करने की अनुमति देता है। यह प्रॉक्सी ऑब्जेक्ट को भेजे गए सभी संदेश को अवरुद्ध करके, इसे पैक करने, इसे अन्य ऐप पर भेजने और इसे वहां आमंत्रित करने के द्वारा किया जाता है।
KVO गतिशील रूप से सेटटर विधि को प्रतिस्थापित करके कार्यान्वित किया जाता है ताकि यह स्वचालित रूप से पर्यवेक्षकों को सूचित कर सके। आदि (ठीक है यह तथ्य यह है कि तुलना में सूक्ष्म में है ...)
CoreData accessorsNSManagedObject
से प्रत्येक उपवर्ग के लिए रन टाइम पर उत्पन्न कर रहे हैं,
और, यदि आप भी अपने कोड से runtime उपयोग कर सकते हैं। मैंने इसे एक अच्छे प्रभाव के लिए इस्तेमाल किया, कोरडाटा की नकल करना और रन टाइम पर एक्सेसर्स उत्पन्न करना, और हेडर फ़ाइल में केवल उनकी घोषणा करना। इस प्रकार आप स्थिर टाइपिंग (शीर्षलेख में घोषणा से समय त्रुटि संकलित) और गतिशीलता (विधियों की रनटाइम पीढ़ी) दोनों की योग्यता प्राप्त कर सकते हैं।
माइक एश ने रनटाइम कैसे काम करता है और इसका प्रभावी ढंग से उपयोग करने के तरीके पर ब्लॉग पोस्ट की उत्कृष्ट श्रृंखला लिखी है। आपको बस इसे पढ़ना है! DO, KVO, message forwarding और अधिक। नेट पर कई अन्य रोचक पोस्ट भी हैं, जैसे fun with kvc और उच्च-आदेश संदेश 1, 2।
+1 यह लिंक का एक बड़ा संग्रह है - धन्यवाद! –
- 1. सूची सरणी का उपयोग करना - सर्वोत्तम अभ्यास
- 2. गतिशील रूप बनाना (सर्वोत्तम दृष्टिकोण)
- 3. सर्वोत्तम प्रथाओं: एक्सएमएल विशेषता बनाम एक्सएमएल तत्व - मुझे तत्वों का उपयोग कब करना चाहिए और मुझे विशेषताओं का उपयोग कब करना चाहिए?
- 4. पायथन में स्थिर तरीकों का उपयोग करना - सर्वोत्तम अभ्यास
- 5. गतिशील रूप से कक्षा विशेषताओं को बनाएँ
- 6. सी/सी ++ विशेष सीपीयू विशेषताओं का उपयोग
- 7. गतिशील सेल का उपयोग
- 8. कस्टम .NET विशेषताओं का वास्तविक विश्व उपयोग
- 9. NSManagedObject विशेषताओं का ऐरे
- 10. जीडीबी का उपयोग करके डीबगिंग - सर्वोत्तम प्रथाओं
- 11. jQuery चयनकर्ताओं और एचटीएमएल 5 डेटा- * गतिशील सेट विशेषताओं
- 12. विशिष्ट फ़ाइल विशेषताओं को प्राप्त करना
- 13. चर घोषित करना - सर्वोत्तम प्रथाओं
- 14. "आंशिक दृश्य" का उपयोग/उपयोग करते समय सर्वोत्तम प्रथाएं?
- 15. पर्यावरण में सूची विशेषताओं को असाइन करना
- 16. गतिशील डेटा का स्थानीयकरण
- 17. गतिशील सीएसएस उत्पन्न करना
- 18. जेनेरिक पैरामीटर पर विशेषताओं का क्या उपयोग है?
- 19. संपत्ति सजावट का उपयोग करके विशेषताओं को कैसे सेट करें?
- 20. Django गतिशील सेटिंग्स बुनियादी ढांचे और सर्वोत्तम प्रथाओं
- 21. विशेषताओं के रूप में श्रेणियों का उपयोग कर रैखिक प्रतिगमन
- 22. स्टोरीबोर्ड का उपयोग कर गतिशील एनीमेशन
- 23. गतिशील वातावरण में पैक्सो का उपयोग
- 24. क्या HTML विशेषताओं के लिए सिंगल कोट्स का उपयोग करना सही है?
- 25. सी/सी ++ देशी कार्यों का उपयोग करके फ़ाइल विशेषताओं को सेट करना
- 26. गतिशील रूप से नेस्टेड ऑब्जेक्ट का उपयोग
- 27. मैं वाला में सीसीओडी विशेषताओं का उपयोग कैसे करूं?
- 28. मैं savon नेस्टेड विशेषताओं का उपयोग कैसे करूं! हैश?
- 29. mono.cecil का उपयोग कर कस्टम विशेषताओं को जोड़ना?
- 30. मल्टीथ्रेडेड पर्यावरण में HttpClient का उपयोग करने का सर्वोत्तम अभ्यास
धन्यवाद @akosma इस उत्कृष्ट उत्तर को लिखने के लिए समय निकालने के लिए। : डी –