C # में गतिशील प्रकारों के उपयोग की कमियाँ


14

मैं हाल ही में C # में गतिशील प्रकारों पर अधिक अध्ययन कर रहा हूं । कुछ उदाहरणों के साथ मुझे समझ में आया कि एक बार कोड संकलित करने के बाद, इसे फिर से पुन: संकलित करने की आवश्यकता नहीं है लेकिन इसे सीधे निष्पादित किया जा सकता है।

मुझे लगता है कि कीवर्ड द्वारा प्रदान की गई लचीलापन वास्तव में इच्छा पर डेटा प्रकार को बदलने में सक्षम है, एक महान लाभ है

सवाल,

क्या गलत डायनामिक मेथड कॉल्स के अलावा कोई ख़ास कमियाँ हैं जो रन टाइम के अपवादों को फेंकती हैं जिन्हें डेवलपर्स को कार्यान्वयन शुरू करने से पहले जानना चाहिए


3
C # 3 में, मैंने हमेशा objectएक कोड-गंध के रूप में या प्रत्यक्ष प्रकार के कलाकारों के उपयोग पर विचार किया । लगभग हर मामले में इसका मतलब था कि मैंने या मेरी एक टीम ने उस कार्यक्षमता के लिए एक उपयुक्त इंटरफ़ेस तैयार नहीं किया था। मैं अनुमान लगा रहा हूं कि अगर मैं अब C # 4 का उपयोग कर रहा हूं, तो मैं भी उसी तरह से उपयोग करने के बारे में बहुत अधिक महसूस करूंगा dynamic। यदि आप सब कुछ गतिशील बनाते हैं, तो मैं इसके लिए मामला देख सकता था, लेकिन उस मामले में आपने पहले स्थान पर एक गतिशील टाइप की हुई भाषा का चयन किया होगा। * 8 ')
मार्क बूथ

परिप्रेक्ष्य के लिए @MarkBooth +1। क्या यह कहना सुरक्षित है कि C # का उपयोग करने वाला कोर कार्यान्वयन अभी भी 4.0 में गतिशील प्रकारों को शुरू करने के बावजूद दृढ़ता से टाइप किया जा रहा है
कार्तिक श्रीनिवासन

dynamicC # का उपयोग करने का मतलब है कि यदि आपके पास अपने कोड के एक छोटे से हिस्से के लिए कुछ गतिशील टाइपिंग की आवश्यकता है, तो आपको आयरनपीथॉन को छोड़ना नहीं है। एक अभिव्यक्ति मूल्यांकनकर्ता के लिए, मुझे एक अभिव्यक्ति dynamicके ऑपरेंड का मूल्यांकन करने और मूल्यांकन से परिणाम का उपयोग करने में बड़ी सफलता मिली है ।
एड जेम्स

@ एडीजम्स - यह एक महान उपयोग की तरह लगता है dynamic, साथ ही मैं चाहता हूं कि मैं आयरनपाइथन के बारे में जानता हूं जब मैं .Net के साथ विकसित हो रहा था - यह कुछ ऐसी चीजें बना सकता था जिन्हें हम बहुत आसान करने की कोशिश कर रहे थे ।
मार्क बूथ

जवाबों:


16

मुख्य कमी यह है कि आप C # के मुख्य गुणों में से एक (आवश्यक रूप से लाभ नहीं) को फेंक देते हैं - यह कि यह सांख्यिकीय रूप से टाइप किया गया है (और अधिकांश भाग प्रकार के लिए सुरक्षित है)।

डायनेमिक टाइपिंग में समस्या यह है कि यह अक्सर बग को छिपा देता है जिसे अन्यथा संकलन के दौरान प्रकट किया जाएगा। इस तरह की बग तो केवल रन-टाइम पर प्रकट होती है, जो निश्चित रूप से यह पता लगाने के लिए बहुत कठिन है।

IM # C # में डायनामिक टाइपिंग का उपयोग करने के लिए बहुत कम कारण हैं, मुख्य एक डायनामिक टाइप की गई भाषाओं के साथ सहयोग किया जा रहा है (जो कि AFAIK कारण डायनेमिक को पहली जगह में पेश किया गया था)।

यदि आप पूरी तरह से गतिशील टाइपिंग प्रोग्रामिंग करना चाहते हैं, तो आपको कुछ ऐसी भाषा देखनी चाहिए जो गतिशील होने के लिए डिज़ाइन की गई है, न कि C # को गतिशील होने के लिए हैक करें। आप उदाहरण के लिए आयरनपाइथन का उपयोग कर सकते हैं यदि आप .Net पुस्तकालयों का उपयोग करना चाहते हैं


लौहपथ के लिए +1। इसका मतलब यह है कि यह लंबे समय तक रखरखाव के मुद्दों को जन्म दे सकता है।
कार्तिक श्रीनिवासन

6
बड़ी चीज जो dynamicआपको देती है, वह किसी भी प्रकार के प्रतिबिंब हैक के बिना किसी वास्तविक प्रकार के ऑब्जेक्ट को अप-कास्ट करने की क्षमता है। उदाहरण के लिए यदि Base foo = new Derived();दो Moo(Base x)और ओवरलोड तरीके थे और Moo(Derived x)फिर Moo(foo)कॉल Moo(Base x), लेकिन Moo((dynamic)foo)कॉल Moo(Derived x)। यह उदाहरण के लिए विज़िटर पैटर्न के एक बहुत ही सुरुचिपूर्ण कार्यान्वयन की ओर जाता है: code.logos.com/blog/2010/03/… और सामान्य रूप से एक बहुत शक्तिशाली तकनीक है।

@ TheMouthofaCow अच्छा, निश्चित रूप से गतिशील के रूप में कुछ अन्य "वैध" उपयोग करता है, हालांकि ये बीच में कुछ और दूर हैं (और आपको निश्चित रूप से यह जानना होगा कि आप ऐसा कुछ करने से पहले क्या कर रहे हैं)।
Mat --j Zábský

नोट करने के लिए @ TheMouthofaCow एक अपेक्षाकृत नया डिज़ाइन पैटर्न (विज़िटर पैटर्न)। धन्यवाद।
कार्तिक श्रीनिवासन

1
हाँ, यह बहुत अच्छा है। मैं पिछले सप्ताह स्वतंत्र रूप से इसके साथ आया था, इसलिए यह देखकर अच्छा लगा कि यह एक स्वीकृत विचार है जिसे C # शस्त्रागार में अपनाया गया है।

9

मुझे यकीन नहीं है कि आप किस प्रकार की कमियों की तलाश कर रहे हैं, लेकिन यदि आप उन विशेषताओं के बारे में जानना चाहते हैं जो स्थैतिक टाइपिंग के साथ काम करती हैं, लेकिन dynamicकुछ के साथ नहीं हैं:

  1. एक्सटेंशन के तरीके काम नहीं करते हैं। यह शायद सबसे बड़ा है। यदि आपके पास है dynamic collection, तो आप कोड का उपयोग नहीं कर सकते collection.Distinct()। ऐसा इसलिए है क्योंकि उपलब्ध विस्तार विधियां नाम स्थान के आधार पर निर्भर करती हैं usingऔर डीएलआर के पास उन्हें जानने का कोई तरीका नहीं है।

    वर्कअराउंड के रूप में, आप या तो विधि को लागू कर सकते हैं जैसे कि यह सामान्य स्थिर विधि थी Enumerable.Distinct(collection):। या आप संग्रह के प्रकार को कुछ इस तरह से बदल सकते हैं IEnumerable<dynamic>

  2. foreachकी आवश्यकता है IEnumerable। सामान्य C # में, foreachपैटर्न-आधारित है। यही है, इसे किसी भी विशिष्ट इंटरफ़ेस की आवश्यकता नहीं है, बस एक GetEnumerator()विधि जो उपयुक्त वस्तु लौटाती है। यदि आप पर उपयोग foreachकरते हैं dynamic, के कार्यान्वयन की IEnumerableआवश्यकता है। लेकिन इस व्यवहार का कारण यह है कि C # 1.0 में जेनेरिक नहीं था, यह "कमी" बहुत अप्रासंगिक है।


एक्सटेंशन विधि के लिए +1। क्या यह अन्य LINQ क्वेरी ऑपरेटरों जैसे GroupBy () पर भी लागू होता है?
कार्तिक श्रीनिवासन

2
@ कार्तिक: हाँ यह करता है। मुझे लगता है कि विस्तार विधियाँ समय संश्लिष्ट चीनी संकलित हैं, इसलिए तथ्य यह है कि वे हल नहीं करते हैं।

@ TheMouthofaCow +1 - स्पष्टीकरण के लिए धन्यवाद।
कार्तिक श्रीनिवासन

1
मैं विस्तार के तरीकों से सहमत हूं, अर्थात गतिशील रन समय पर विस्तार विधियों का पता नहीं लगा सकता है लेकिन मैं आपके द्वारा बताए गए गतिशील संग्रह का पालन नहीं कर सकता।
कार्तिक श्रीनिवासन

7

.Net में डायनामिक टाइप ( डायनेमिक घोषित नहीं किए गए वैरिएबल) के साथ समस्या यह है कि उनके पास स्टैटिक प्रकार के लिए बहुत अधिक कार्यक्षमता उपलब्ध नहीं है।

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

इसलिए डायनामिक प्रकारों के साथ कोड न लिखें जब तक कि आपको पता न हो कि आप क्या कर रहे हैं।


6

चूंकि dynamicयह केवल एक चिह्नित है, objectइसलिए यह मूल्य प्रकारों को बॉक्स करता है।

इसका प्रदर्शन निहितार्थ हो सकता है, लेकिन चूंकि मैं प्रदर्शन महत्वपूर्ण कोड वैसे भी स्थैतिक टाइपिंग का उपयोग करूंगा, इसलिए यह व्यवहार में समस्या नहीं है।

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


+1 मैं निश्चित रूप से सहमत हूं। स्टेटिक क्रिटिकल कोड के लिए स्टेटिक टाइपिंग सबसे अच्छा तरीका होगा।
कार्तिक श्रीनिवासन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.