2009-12-24 10 views
12

टेस्टेबल सी # कोड लिखने के लिए, मैं डीआई का भारी उपयोग करता हूं।गतिशील भाषाओं में निर्भरता इंजेक्शन की कोई आवश्यकता?

हालांकि हाल ही में मैं आयरनपीथन के साथ गड़बड़ कर रहा हूं और पाया कि आप किसी भी तरीके/कक्षाओं/कार्यों आदि का नकल कर सकते हैं ... आपको पसंद है, DI की आवश्यकता समाप्त हो गई है।

क्या यह पाइथन जैसे गतिशील लैंगगेज के मामले में है?

बजाय:

class Person(Address) { 
... 

आप हो सकते हैं:

class Person() { 
... 
    // Address initialised in here. 

गतिशील भाषाओं के लिए और इसलिए गतिशील langagues के लिए manaual डि निम्नलिखित बस जरूरत नहीं है।

इस पर कोई सलाह?

+0

डि का उपयोग करते रहें ... :-) इस सवाल का डुप्लिकेट हो रहा है .. http://stackoverflow.com/questions/2273683/why-are-ioc-containers- अनावश्यक-गतिशील-भाषाओं/2308494 # 2308494 –

उत्तर

10

निर्भरता इंजेक्शन यह भी है कि आप एक साथ चीजों को कैसे तारते हैं --- जिसमें निर्भर वस्तुओं की नकल करने के बारे में कुछ भी नहीं है। वहाँ तरह यह सीधे का दृष्टांत एक Foo -instance कि एक Barकी -connection कुछ जरूरत होने और यह पूरी तरह से उपेक्षा यह कैसे हो जाता है कि कनेक्शन के रूप में लंबे समय तक यह यह है के रूप में होने के बीच एक अंतर है।

यदि आप निर्भरता इंजेक्शन का उपयोग करते हैं तो आप भी बेहतर परीक्षण योग्यता प्राप्त करते हैं। लेकिन बातचीत सच नहीं है। कुछ भी ओवरराइट करने में सक्षम होने से आसान टेस्टेबिलिटी निर्भरता इंजेक्शन के अन्य फायदे नहीं लाती है। इन कारणों से पाइथन के लिए उपलब्ध कई घटक/डी-फ्रेमवर्क हैं।

+1

निर्भरता इंजेक्शन के "अन्य फायदे" क्या हैं? – asmaier

-2

मुझे लगता है कि आप एक ऐसा प्रश्न पेश कर रहे हैं जो सर्वोत्तम अभ्यास के बारे में प्रतीत होता है लेकिन वास्तव में रन-टाइम प्रदर्शन के बारे में है।

निर्भरता इंजेक्शन से छुटकारा पाएं? एक सॉफ्टवेयर रिलीज प्रबंधक रात में कैसे सो सकता है?

प्रदर्शन करने के लिए फ़ंक्शन के परीक्षण निश्चित रूप से प्रोग्राम को एक या दो टैड से धीमा कर देना चाहिए।

// my generic function entry point - IronPython 
if func="a": 
    ... 
if func="b": 
    ... 
if func="c": 
    ... 

आप कक्षाओं के साथ मानक पायथन का उपयोग कर सकते हैं ... या आप फ़ंक्शन पॉइंटर्स को फ़ंक्शन पॉइंटर सदस्यों को असाइन कर सकते हैं। बस यह किस तरह का जानवर है ... ?? मैं जानता हूँ मैं जानता हूँ। मुझे लगता है कि पाइथन परिभाषित करना मुश्किल है लेकिन मुझे यह पसंद है। और मुझे निर्भरता इंजेक्शन की अत्यधिक पसंद है और लगता है कि मेरे पास लंबे समय तक नहीं है जहां मैं इस अभ्यास के लिए इतना लंबा नाम असाइन करना चाहता हूं।

+1

पढ़ना मुझे उलझन में छोड़ दिया। –

9

मैं आपके बयान से दृढ़ता से असहमत हूं कि गतिशील रूप से टाइप की गई भाषाओं में निर्भरता इंजेक्शन की आवश्यकता नहीं है। डीआई उपयोगी और आवश्यक क्यों है, इसके कारण भाषा के टाइपिंग अनुशासन से पूरी तरह से स्वतंत्र हैं।

मुख्य अंतर यह है कि गतिशील रूप से टाइप की गई भाषाओं में DI आसान और दर्द रहित है: आपको हेवीवेट फ्रेमवर्क और एक्सएमएल कॉन्फ़िगरेशन की गैज़िलियन लाइनों की आवश्यकता नहीं है।

रुबी में, उदाहरण के लिए, केवल दो DI ढांचे हैं। दोनों जावा प्रोग्रामर द्वारा लिखे गए थे। दो फ्रेमवर्कों में से कोई भी एकल प्रोजेक्ट द्वारा उपयोग नहीं किया जाता है। उन ढांचे के लेखक तक भी नहीं।

हालांकि, रूई में पूरे जगह डीआई का उपयोग किया जाता है।

Jamis बक, जो उन चौखटे के दोनों के लेखक हैं और के बारे में कैसे और क्यों वह उन चौखटे लिखा RubyConf 2008 में एक टॉक Recovering from Enterprise बुलाया दिया क्यों कि एक बुरा विचार है, जो अच्छी तरह से देखने लायक है था। (जब भी वह "रूबी" कहता है तो बस "पायथन" को प्रतिस्थापित करें और सबकुछ मान्य होगा।)

+2

"गैज़िलियन" असाधारण नहीं है? मैं सी # में भारी उपयोग करता हूं और मैं बहुत कम, अगर कोई है, एक्सएमएल विन्यास का उपयोग करता हूं। – Darren

+1

हां, यह निश्चित रूप से एक असाधारण है। यह भी पुराना असाधारण है, क्योंकि .NET2 और बाद के जावा 5 डी फ्रेमवर्क एक्सएमएल के बजाय विशेषताओं/एनोटेशन का उपयोग करते हैं। मूल विचार यह है: जावा या सी # में गतिशील रूप से वायरिंग चीजें कठिन है। यही कारण है कि एक डी ढांचे का उपयोग करना समझ में आता है: मुझे XML को पार्स करने या एनोटेशन/विशेषताओं को प्रोसेस करने की परवाह नहीं है, इसलिए मैंने किसी और को काम करने दिया, जो उस तरह की चीजें का आनंद लेता है। लेकिन पायथन या रूबी में, सब कुछ * हमेशा * गतिशील रूप से तारित होता है, * वैसे भी *। * भाषा * स्वयं * पहले से ही एक डी ढांचा है। शीर्ष पर एक और डालने की जरूरत नहीं है। –

+2

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

0

मैं फिर कोशिश करूंगा। मेरा आखिरी जवाब एक मील से सवाल और विषय से ज़ूम किए गए तरीके से चूक गया।

छद्म कोड का उपयोग करना, निर्भरता इंजेक्शन के साथ बाहर का कहना है:

class Person 
    def Chat() { 
    someOperation("X","Y","Z") 
    end 
end 
... 
Person.new().Chat() 

और के साथ:

class Person 
    initialize(a,b,c) 
    @a=a 
    @b=b 
    @c=c 
    end 
    def Chat() 
    someOperation(@a,@b,@c) 
    end 
end 
... 
Person.new("X","Y","Z").Chat() 

, और आम तौर पर में वस्तु और के लिए अलग अलग फ़ाइलों में कॉल डाल के साथ। एससीएम उद्देश्यों।

चाहे "एक्स", "वाई" या "जेड" मजाक कर रहे हैं (... यदि वे बदले में ऑब्जेक्ट्स थे ... (!) ... (!) ...) के पास कुछ भी नहीं है क्या डी अच्छा है। वास्तव में। :-)

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

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

मेरे सिफारिश:

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