2008-10-28 12 views
6

this thread पर कई उत्तरों को पढ़ने के बाद, मुझे लगता है कि जो लोग इसे नापसंद करते हैं उनमें से कई नए कीवर्ड के दुरुपयोग की संभावना का हवाला देते हैं। मेरा सवाल है, किस प्रकार का दुरुपयोग? लोगों को जोर से नापसंद करने के लिए इस तरह से इतनी बुरी तरह दुर्व्यवहार कैसे किया जा सकता है? क्या यह सिर्फ शुद्धता के बारे में है? या क्या कोई वास्तविक गड़बड़ है जिसे मैं नहीं देख रहा हूं?सी # 4 गतिशील कीवर्ड - क्यों नहीं?

उत्तर

16

कुछ इसे एक उपकरण के रूप में देखते हैं जिसका दुरुपयोग किया जाएगा। वीबी में "विकल्प सख्त बंद" और "ऑन त्रुटि फिर से शुरू करें" की तरह "सी" और जावा जैसी "शुद्ध" भाषाएं कभी नहीं थीं।

कई "var" कीवर्ड के बारे में एक ही कहा, फिर भी मैं नहीं दिख रहा है यह दुरुपयोग किया जा रहा है, एक बार यह समझ गया कि यह वीबी के "संस्करण" के रूप में ही नहीं था बन गया

यह दुरुपयोग किया जा सकता है ऐसी जगहें जो आलसी डेवलपर्स कक्षाओं पर टाइपिंग नहीं चाहते हैं और लिखने के बजाय गतिशील कॉल को पकड़ने की कोशिश करें "अगर ब्ला ब्ला है ..."।

मुझे व्यक्तिगत रूप से लगता है कि यह this हालिया प्रश्नों जैसे परिस्थितियों में ठीक से उपयोग किया जा सकता है।

मुझे लगता है कि जो लोग वास्तव में इसकी शक्ति को समझते हैं वे गतिशील .NET भाषाओं में भारी हैं।

+3

var अलग तरीके से दुर्व्यवहार किया जाता है - यह पठनीयता को कम करता है, सुरक्षा नहीं। – TraumaPony

+1

मैं सहमत हूं। मेरा मतलब अन्यथा इंगित करने का मतलब नहीं था। – TheSoftwareJedi

+0

मैंने इसे दुर्व्यवहार देखा है। यह निश्चित रूप से पठनीयता को कम करता है, हालांकि जॉन स्कीट एक .NET में कहा चट्टानों पॉडकास्ट है कि यह पठनीयता बढ़ जाती है .. जो मुझे यकीन है कि नहीं कर रहा हूँ कि कैसे संभव है ... – BobbyShaftoe

6

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

public T Foo<T>(T other) where T: ICloneable, IAssignData{ 
    T clone = (T)other.Clone(); 
    clone.AssignData(this.Data); 
    return clone; 
} 

पहले एक नहीं स्थिर प्रकार की जानकारी, कोई संकलन समय है:

+2

निष्पक्ष होने के लिए, यह पहले से ही कुछ हद तक संभव था: इंटरफ़ेस-भारी सी # प्रोग्राम किसी दिए गए कॉल के लिए वास्तविक कार्यान्वयन का निर्धारण निराशा में एक अभ्यास, अनुमानों और पूर्ण-पाठ खोजों से भरा हुआ हो सकता है। – Shog9

+1

हां, लेकिन इंटरफ़ेस ऑपरेशन के कुछ संदर्भ प्रदान करता है। गतिशील वस्तु कोई संदर्भ प्रदान नहीं करता है। गतिशील क्यू के दूसरे छोर पर क्या है? कौन जानता है? –

7

गतिशील बुरा है क्योंकि इस तरह कोड हर जगह पॉप जाएगा:

public dynamic Foo(dynamic other) { 
    dynamic clone = other.Clone(); 
    clone.AssignData(this.Data); 
    return clone ; 
} 

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

मैं पहले से ही गतिशील से डरना शुरू कर रहा हूं।

संपादित: खतरे बीत चुका है (! ओह) ... और गतिशील सब के बाद, नीचे मुझे 3 साल के बाद वोट करने के लिए कोई ज़रूरत नहीं के साथ दुर्व्यवहार नहीं किया गया था किया गया :)

+2

आपको क्या लगता है कि लोगों को गतिशील कोड लिखने के लिए प्रोत्साहित किया जा सकता है? उन्हें क्या हतोत्साहित कर सकता है? –

2

जब लोगों को पता है कि वे डॉन dynamic के साथ अच्छा IntelliSense नहीं मिलता है, वे dynamic होने से वापस स्विच करेंगे-dynamic - -hen-required-and-var -at-all-times -happy से।

dynamic के प्रयोजनों में शामिल हैं: गतिशील भाषाओं और प्लेटफार्मों जैसे COM/C++ और DLR/IronPython/IronRuby के साथ अंतःक्रियाशीलता; साथ ही IDynamicObject को लागू करने वाली सभी चीज़ों के साथ C# को IronSmalltalkWithBraces में बदलना।

अच्छा समय सभी के साथ होगा। (जब तक आपको किसी और को कोड बनाए रखने की आवश्यकता नहीं होती है।)

+0

मैंने एक्शनस्क्रिप्ट में एक प्रोजेक्ट किया, जो गतिशील और स्थैतिक दोनों है, और मैं कहूंगा कि गतिशील/स्थैतिक संकर अच्छी तरह से काम नहीं करते हैं। – FlySwat

+1

सभी लोग केवल एक उदाहरण से सामान्यीकृत हैं। या कम से कम मुझे करना है। :) –

+0

मैंने क्यूबीएएसआईसी में एक परियोजना की, और यह एक भाषा भी नहीं होनी चाहिए थी। लेकिन एक्शनस्क्रिप्ट और क्यूबीएएसआईसीआईसी के बारे में अंक वास्तव में सी # के लिए कोई प्रासंगिकता नहीं है। सी #, मूल रूप से स्थिर वस्तु उन्मुख टाइप किया जाएगा रहते हैं, बहुत ही उपयोगी विकल्प सुविधा सेटों में मिश्रित के साथ। – yfeldblum

17

मुझे लगता है कि तबदीली है कि लोगों को इस सुविधा को व्यक्त कर रहे हैं की एक बहुत कुछ करने पर निर्भर करता है "क्योंकि यह बुरा डेवलपर्स बुरा कोड लिखने के लिए अनुमति देगा यह एक बुरा भाषा विशेषता है।" यदि आप इसके बारे में सोचते हैं, तो उस तर्क द्वारा सभी भाषा सुविधाएं खराब हैं।

जब मैं वीबी कोड के एक ब्लॉक में चलाता हूं कि कुछ प्रतिभा On Error Resume Next के साथ उपसर्ग कर चुके हैं, तो यह वीबी नहीं है जिसे मैं शाप देता हूं। शायद मुझे लगता है, मुझे लगता है। लेकिन मेरे अनुभव में एक व्यक्ति जो फ्यूज बॉक्स में पैसा लगाने के लिए निर्धारित है, उसे एक रास्ता मिलेगा। यहां तक ​​कि यदि आप अपने जेब खाली करते हैं, तो वह अपने पैनीज़ तैयार करेगा।

मी, मैं सी # और पायथन के बीच इंटरऑपरेट करने का एक और अधिक उपयोगी तरीका ढूंढ रहा हूं। मैं अधिक से अधिक कोड लिख रहा हूं जो यह करता है। dynamic कीवर्ड उस विशेष उपयोग के मामले के लिए जल्द ही पर्याप्त नहीं आ सकता है, क्योंकि ऐसा करने का वर्तमान तरीका मुझे महसूस करता है कि मैं 1 9 50 के दशक में सोवियत अकादमिक हूं जो एक सम्मेलन के लिए पश्चिम की यात्रा कर रहा है: वहां बहुत सारे नियम हैं और छोड़ने से पहले कागजी कार्य, मुझे पूरा यकीन है कि कोई मुझे पूरा समय देख रहा है, मैं वहां हूं, और जब मैं वहां हूं, तो मैं जो कुछ भी उठाता हूं, वह मुझे वापस ले जाएगा जब मैं वापस आऊंगा ।

+0

दिलचस्प सादृश्य –

-2

मैं एक कारण नहीं दिख रहा है यही कारण है कि dynamicly तरीकों लागू की वर्तमान तरीका त्रुटिपूर्ण है:

यह यह करने के लिए तीन लाइनों लेता है, या आप System.Object पर एक विस्तार विधि जोड़ सकते हैं आप के लिए यह करने के लिए :

class Program 
{ 
    static void Main(string[] args) 
    { 
     var foo = new Foo();    
     Console.WriteLine(foo.Invoke("Hello","Jonathan")); 
    }   
} 

static class DynamicDispatchHelper 
{ 
    static public object Invoke(this object ot, string methodName, params object[] args) 
    { 
     var t = ot.GetType(); 
     var m = t.GetMethod(methodName); 
     return m.Invoke(ot, args); 
    } 
} 

class Foo 
{ 
    public string Hello(string name) 
    { 
     return ("Hello World, " + name); 
    } 
} 
+2

क्या होगा यदि "हैलो" ओवरलोड हो गया है? क्या होगा अगर कोई लंबे समय तक int पास करता है? प्रदर्शन के बारे में क्या? जब आप इस सड़क को काफी दूर यात्रा करते हैं, तो आप डीएलआर का एक अच्छा हिस्सा फिर से लिख लेंगे और अभी भी पायथन या COM इंटरऑप को संभाला नहीं है। –

+0

... इंडेक्सिंग या इंफिक्स ऑपरेटरों के लिए प्राकृतिक सी # वाक्यविन्यास का उल्लेख नहीं करना –

+0

जो केवल प्रतिबिंब-आधारित देर बाध्यकारी का समर्थन करता है। यह IDynamicObject आधारित देर से बाध्यकारी के लिए काम नहीं करता है। न ही यह JSON या XML- आधारित ऑब्जेक्ट्स के लिए काम करता है। –

1

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

कोई कारण नहीं क्यों आप अपने खुद के कोडन दिशानिर्देश में "डायनामिक" कीवर्ड गैर-कानूनी घोषित नहीं कर सकता है यदि आप उन्हें जरूरत नहीं है नहीं है। तो समस्या क्या है? मेरा मतलब है, अगर आप "गतिशील" कीवर्ड के साथ पागल चीजें करना चाहते हैं और सी # दिखाते हैं तो जावास्क्रिप्ट के कुछ उत्परिवर्ती चचेरे भाई हैं, मेरे अतिथि बनें। बस इन प्रयोगों को मेरे कोडबेस से बाहर रखें। ;)

-1

FUD। कटा हुआ रोटी के बाद से यह सबसे अच्छी बात हो सकती है, लेकिन वीबी, जावास्क्रिप्ट इत्यादि के साथ मेरे पास जो अनुभव है, वह मुझे ठंड लाता है कि सी # में गतिशील बाध्यकारी होगा। मुझे पता है कि मैं इसे निकट भविष्य में तर्कसंगत रूप से देख पाएगा और देख सकता हूं कि गतिशील भाषाओं के साथ अंतःक्रियाशीलता को सक्षम करने के लिए यह नई सुविधा कितनी अच्छी होगी। लेकिन इसमें कुछ समय लगेगा। मैं इंसान हूँ, ठीक है? :-)

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