समस्या typeid
के साथ नहीं है।
PolymorphicType *pType = ...;
if(typeid(*pType) == typeid(Derived1))
pType->Func1();
else if(typeid(*pType) == typeid(Derived2))
pType->Func2();
else if(typeid(*pType) == typeid(Derived3))
pType->Func3();
यह है कि हम क्या कॉल "वास्तव में बेवकूफ" है: समस्या यह है कि typeid
देखकर यह लिखने के लिए प्रोत्साहित करते हैं है। यह एक वर्चुअल फ़ंक्शन कॉल है जो कम से कम उचित तरीके से संभव है। typeid
में dynamic_cast
और virtual
फ़ंक्शंस को प्रतिस्थापित करने के लिए उपयोग किए जाने पर दुरुपयोग की संभावना है।
यह उदाहरण दूर-दूर तक लग सकता है। आखिरकार, यह स्पष्ट है कि यह सिर्फ एक वर्चुअल कॉल है। लेकिन खराब कोड अक्सर कम से कम प्रतिरोध के मार्ग से बढ़ता है; यह सब एक व्यक्ति के लिए typeid() == typeid()
करने के लिए होता है, और इस कोड का बीज शुरू हो गया है। आम तौर पर, यदि आप सीधे typeid
का उपयोग कर रहे हैं, तो बाधाएं बहुत अच्छी हैं कि आप ऐसा कुछ कर रहे हैं जो अन्य भाषा संरचनाओं के साथ बेहतर हो सके।
typeid
की अंतिम रिज़ॉर्ट की बहुलक प्रकार की कटौती विधि है।
क्या typeid
का सभी उपयोग गलत है? बिलकूल नही। boost::any
इसके बिना संभव नहीं होगा। वैसे यह संभव होगा, लेकिन यह void*
से अधिक सुरक्षित नहीं होगा। typeid
क्या टाइप-सुरक्षित boost::any
प्रकार मिटा सकता है। इसके अन्य वैध उपयोग भी हैं।
लेकिन कोड-लाइन-टू-यूज अनुपात में, मैं सुझाव दूंगा कि यह कोड की 10,000 लाइनों में से एक में होना चाहिए। उससे बहुत कम, और आप शायद इसे गलत इस्तेमाल कर रहे हैं।
टाइपिंग धीमा है?
सामान्य तौर पर, typeid
कॉल करने के लिए मुख्य कारण या तो (boost::any
के रूप में) टेम्प्लेटेड कोड या जब आप एक बहुरूपी प्रकार की उम्मीद कर रहे है। यदि प्रकार स्थिर रूप से निर्धारित होता है (यानी: एक टाइपनाम या गैर-पॉलीमोर्फिक प्रकार का मान दिया जाता है), तो आप संकलन-समय पर इसे करने की उम्मीद कर सकते हैं।
यह पॉलीमोर्फिक मान है जिसके बारे में आपको चिंतित होना चाहिए। मैंने एक प्रदर्शन परीक्षण देखा है जो दिखाता है कि कुछ typeid
कार्यान्वयन वास्तव में कक्षा पदानुक्रम चलते हैं, इसलिए उनके लिए प्रकार ढूंढने में लगने वाला समय वास्तविक प्रकार और दिए गए प्रकार के बीच कक्षाओं की संख्या के समान होता है। प्रत्येक कार्यान्वयन अलग होगा, लेकिन यह एक बहुत अच्छा संकेत है कि शायद आपको इसे प्रदर्शन-महत्वपूर्ण कोड में नहीं डालना चाहिए।
स्रोत
2012-03-03 16:13:36
यह कहां कहता है कि यह खराब डिजाइन है? –
@ सेठ कार्नेगी मैंने कुछ लोगों को एसओ पर यह कहते हुए सुना है, और इसे एक पुस्तक में भी पढ़ा है जो जांच प्रकार खराब डिजाइन है, फिर भी कोई कारण नहीं दिया गया है। – xcrypt
कि उन्होंने कोई कारण नहीं दिया है शायद उनके दावों की वैधता का संकेत है। कुछ लोग कहते हैं कि यदि आप बहुत से प्रकार की जांच कर रहे हैं, तो आपको अपने कोड को पॉलिमॉर्फिक फ़ंक्शन कॉल में दोबारा प्रतिक्रिया देना चाहिए। उदाहरण के लिए, 'if (typeid (a) == atype) करने के बजाय doa(); अन्यथा अगर (टाइपिड (ए) == बिट प्रकार) डॉब(); अन्यथा अगर (टाइपिड (ए) == सीटीपीई) दस्तावेज़(); 'आप केवल' a-> doafunc(); 'कर सकते हैं और उचित वर्चुअल फ़ंक्शन को' ए' के रनटाइम प्रकार के लिए बुलाया जाएगा। –