2010-02-14 17 views
5

डाउनकास्टिंग पर आपका दृष्टिकोण क्या है? क्या यह हमेशा गलत है, या ऐसे मामले हैं जहां यह स्वीकार्य है, या यहां तक ​​कि बेहतर या वांछित है?डाउनकास्टिंग (यानी व्युत्पन्न प्रकार कास्टिंग) हमेशा गलत है?

क्या कोई अच्छा उपाय/दिशानिर्देश है जो हम दे सकते हैं जो हमें बताता है कि डाउनकास्टिंग "बुरा" है, और जब यह "ठीक"/"अच्छा" होता है?

(मैं a similar question exists पता है, लेकिन इस सवाल का एक ठोस मामले से बाहर घूमती है। मैं इसे एक सामान्य डिजाइन के नजरिए से जवाब करना चाहते हैं।)

+2

कुछ भी __ALWAYS__ गलत नहीं है, ठीक पहले बिना किसी प्रोफाइल के गेटोस और समयपूर्व अनुकूलन को छोड़कर। :-) –

+0

ठीक है, शायद मुझे अपने हेडर को दोहराया जाना चाहिए था। ;) मैं (अधिमानतः एक सेट) मामलों की तलाश में था जहां यह "अच्छा"/"बुरा" होगा। –

+1

यदि गेटोस बहुत गलत हैं, तो जावा अपने अपवादों के लिए लंबे कूद का उपयोग क्यों करता है? यहां तक ​​कि जिन बयानों का दुरुपयोग किया जाता है, उनके पास भी उनका उद्देश्य है ... – Scharrels

उत्तर

8

नहीं, यह निश्चित रूप से नहीं हमेशा गलत है।

उदाहरण के लिए, मान लें कि सी # में आपके पास एक ईवेंट हैंडलर है - जिसे sender पैरामीटर दिया जाता है, जो ईवेंट के उत्प्रेरक का प्रतिनिधित्व करता है। अब आप उस ईवेंट हैंडलर को कई बटनों पर लगा सकते हैं, लेकिन आप जानते हैं कि वे हमेशा बटन हैं। उस कोड के भीतर senderButton पर डालना उचित है।

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

+0

सच है, जॉन, लेकिन सी # घटनाओं (कम से कम भाग में) के मामले को सह-/ अनुबंध-प्रकार के प्रकार के परिचय से बचा नहीं जा सका? आप उदास करने में सक्षम होंगे यदि आप एक बटन में हुकिंग कर रहे थे, तो एक (ऑब्जेक्ट, इवेंट एआरजीएस) यदि आप एक संदर्भ में थे, तो आप एक बेस टाइप पर हुकिंग कर रहे थे ... –

+0

@ हावर्ड एस: यह संभव है, लेकिन हो सकता है हमेशा व्यावहारिक रहें ... और यह न भूलें कि हमें अक्सर दिए गए एपीआई के साथ रहना होगा।मैं निश्चित रूप से पूरे WinForms को कभी-कभी कभी-कभी कास्ट से बचने के लिए फिर से लिखने वाला नहीं हूं ... –

+0

बेशक, विरासत दिया गया, डाउनकास्टिंग व्यावहारिक है, लेकिन विरासत के बिना आप पर्याप्त घटना के मामले से बचने में सक्षम होंगे सिस्टम टाइप करें। –

3

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

1

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

जॉन व्लिसाइडेस इस मुद्दे (उर्फ "प्रकार लॉन्ड्रिंग") अपने उत्कृष्ट पुस्तक Pattern Hatching में एक बहुत (व्यावहारिक रूप से Design Patterns की ही अगली कड़ी) का विश्लेषण करती है।

+0

अच्छी किताब संदर्भ, धन्यवाद। यह सवाल का एक और पहलू है, वास्तव में: क्या डाउनकास्टिंग/"बुरा होने लगने लगती है" के लिए एक सामान्य उपाय देना संभव है? –

+0

@ हावर्ड मुझे डर है कि इसके लिए कोई उद्देश्य उपाय नहीं है। जॉन अच्छे उदाहरण देता है, जो आईएमओ को अंगूठे के इस नियम की तरह समझा जा सकता है: यदि डाउनकास्ट आपके कोड के एक छोटे से हिस्से में स्थानीयकृत हो जाते हैं और आप सुनिश्चित हो सकते हैं कि वे हमेशा सफल होते हैं, तो वे ठीक हैं। यदि कोड पर डाउनकास्ट फैल गए हैं और/या असफलताओं कास्टिंग करने का मौका है, तो वे खराब हैं। –

+0

ठीक है, इसलिए कुछ कम से कम "आम सहमति" के लिए कॉल करें। अच्छा सारांश –

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