2011-02-06 11 views
6

उदाहरण के लिए अगर वहाँ एक 'संभाल सब' प्रकार विधि है ...आईफोन, isKindOfClass का उपयोग किसी भी तरह से खराब अभ्यास माना जाता है?

if ([obj isKindOfClass:class1]) { 
    // ... 
} else if ([obj isKindOfClass:class2]) { 
    // etc.. 

यह बुरा व्यवहार है? कोड बनाने के लिए कोई साफ विकल्प या बेहतर तरीका है?

रनटाइम, पठनीयता, रखरखाव या कुछ भी के आंसुओं में नुकसान हैं?

उत्तर

7

जब भी अच्छा/बुरा अभ्यास माना जाता है, तो यह कम या ज्यादा व्यक्तिपरक होता है। कुछ करते समय मूल रूप से सही/गलत है, यह कम या कम उद्देश्य है।

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

तथ्य यह है कि कुछ वस्तुएं अपनी कक्षा के बारे में झूठ बोल सकती हैं, आपको वास्तव में बंद नहीं करना चाहिए। वे खुद को किसी भी वर्ग को तोड़ने के बिना किसी अन्य वर्ग की वस्तुओं के रूप में छिपाते हैं। और अगर वह कुछ भी तोड़ता नहीं है, तो मुझे क्यों परवाह करना चाहिए?

मुख्य बात यह है कि आपको हमेशा किसी भी उद्देश्य के लिए सही उपकरण का उपयोग करना याद रखना चाहिए। उदाहरण के लिए, isKindOfClass:respondsToSelector: या conformsToProtocol: के लिए कोई विकल्प नहीं है।

1

क्रमबद्ध करें। यह प्रश्न मूल रूप से जो आप पूछ रहे हैं उसे कवर करता है: Is it safe to use isKindOfClass: against an NSString instance to determine type?

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

0

मैं उस उदाहरण पर विचार करूंगा जिसे आपने एंटी-पैटर्न कहा है, इसलिए हाँ, मैं कहूंगा कि यह हानिकारक है। IsKindOf का उपयोग करना जैसे पॉलिमॉर्फिज्म और ऑब्जेक्ट ओरिएंटेशन को हरा रहा है।

मैं अब तक पसंद करेंगे, जिसे आप कॉल:

[obj doTheThing]; 

और फिर अपने उपवर्गों में अलग doTheThing लागू।

यदि ओबीजे उन वर्गों से संबंधित हो सकता है जिन पर आपका नियंत्रण नहीं है, तो अपनी डॉटिंग विधि जोड़ने के लिए श्रेणियों का उपयोग करें। यदि आपको डिफ़ॉल्ट व्यवहार की आवश्यकता है, तो NSObject पर एक श्रेणी जोड़ें।

यह मेरी राय में एक क्लीनर समाधान है, और यह कार्यान्वयन विवरण (यह विशिष्ट प्रकार के ऑब्जेक्ट के लिए इसे कैसे करें) से तर्क (आप क्या कर रहे हैं) को अलग करने में मदद करता है।

+0

आत्मनिरीक्षण उपकरण का उपयोग करने की आवश्यकता से बचने के लिए श्रेणियों में कार्यान्वयन विधियों को मेरे लिए बदतर लगता है। iE NSJSONSerialization की 'JSONObjectWithData: विकल्प: त्रुटि:' विभिन्न प्रकारों को वापस कर सकता है। (ऐरे, शब्दकोश)।सरणी में हैकिंग डिक्शनरी विधि और इसके विपरीत बेहद बेवकूफ ध्वनि। – vikingosegundo

+0

क्या होगा अगर केवल एक उपclass के पास एक विधि होनी चाहिए? –

+0

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

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

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