2011-03-26 6 views
14

मैं निर्भरता इंजेक्शन के बारे में बहुत कुछ पढ़ रहा हूं कि यह प्रोग्राम के लिए कुछ वास्तव में उन्नत तरीका हो सकता है, लेकिन मुझे वैश्विक स्थिति से बचने के बीच अंतर नहीं दिख रहा है, क्योंकि जब कोई वैश्विक स्थिति नहीं है तो आपको पास करने के लिए मजबूर होना पड़ता है वस्तुओं के लिए सभी निर्भरताओं।वैश्विक चर का उपयोग न करने से निर्भरता इंजेक्शन कैसे भिन्न होता है?

क्या कोई मुझे कृपया समझा सकता है क्योंकि मुझे लगता है कि मैं निर्भरता इंजेक्शन के बारे में क्या सोच रहा हूं?

+1

वह चौथा डी प्रश्न मैंने देखा है। मैंने यहां पोस्ट किया गया यह बड़ा जवाब देखें। http://stackoverflow.com/questions/5433211/difference-between- निर्भरता- इंजेक्शन-and-mocking-framework-ninject-vs-rhinomo/5433231#5433231 – gideon

उत्तर

19

निर्भरता इंजेक्शन कोड को डीकॉप्लिंग कोड के बारे में है।

जब आप तर्क पारित करके ग्लोबल्स के उपयोग से बचते हैं तो आप कोड को डीकॉप्लिंग कर रहे हैं। आप ग्लोबल्स पर कोड की निर्भरता को हटा रहे हैं।

आप इस decoupling को केवल ग्लोबल्स से बचने के लिए सामान्यीकृत कर सकते हैं। निम्नलिखित कोड डालें:

def foo(arg): 
    return ClassBar(arg).attr 

foo(1) 

समारोह foo या कसकरClassBar के लिए युग्मित पर निर्भर है।

  • तर्क ClassBar परिवर्तन का निर्माण
  • आप और
  • एक और कोड attr में पहुंचना चाहता है कुछ करने के लिए ClassBar बदलना चाहते हैं: कारण यह अच्छा नहीं है आप जब foo अद्यतन करने के लिए मजबूर हो जाएगा

    : एक अलग वस्तु

तो कोड में लिखा गया था से

आपने युग्मन को कॉलर तक धक्का दिया है। इसने foo की परिभाषा से निर्भरता को हटा दिया। यह आपको उपरोक्त उल्लिखित मामलों में foo अपडेट करने से मुक्त करता है। आपके कोड का अधिक से अधिक decoupled है, कम कोड परिवर्तन करने के लिए आपको बनाना होगा।

+2

-1 न केवल पारंपरिक रूप से खराब उदाहरणों का उपयोग करने के लिए foo और bar, लेकिन उनका उपयोग संवेदनात्मक रूप से कर रहा है! : $ – Kzqai

+0

@Tchalvak: Idiomatic Python क्लास नामों के लिए पूंजीकृत शब्दों का उपयोग करता है और उदाहरणों और मानों के लिए कम केस शब्द (जब तक आप ग्लोबल्स के बारे में बात नहीं करते)। इस तरह के सभी मामलों में आप अलग-अलग आवरण का उपयोग करेंगे क्योंकि आप कक्षा और एक उदाहरण से निपट रहे हैं। – dietbuddha

+0

@Tchalvak: 'foo' और 'bar' खराब उदाहरण क्यों हैं। इस मामले में कोड मनमाने ढंग से है। उदाहरण कोड का एकमात्र बिंदु कोड को डीकॉप्लिंग करते समय होने वाले संरचनात्मक परिवर्तनों को दिखाना है। मैं 'क्षेत्र' और' सर्कल 'का उपयोग कर सकता था, लेकिन वे उदाहरण के लिए कुछ भी नहीं लाया होता। – dietbuddha

5

निर्भरता इंजेक्शन के बारे में जो मैं समझता हूं वह यह है कि आप ऑब्जेक्ट बनाने के विवरण छोड़ देते हैं और केवल यह घोषणा करते हैं कि ऐसी वस्तु की आवश्यकता है। उदाहरण के लिए एक ढांचा इस ऑब्जेक्ट को बाद में इसकी आवश्यकता से पहले सेट करेगा।

तो यहां मूल्य चिंता का अलगाव है। यह परीक्षण के लिए उपयोगी है जब आप वास्तविक वस्तु का नकली इंजेक्ट करेंगे।

+1

ढांचे के बजाय वैश्विक चर सेट अप नहीं कर सका? –

+0

@ जोसेफलेनॉक्स, क्या वैश्विक वैरिएबल बिल्कुल सेट है? - यकीन है कि यह हो सकता है, लेकिन आप इसका वर्णन नहीं कर रहे हैं कि इसे केवल इसका उपयोग कैसे किया जाता है। – Louis

1

एक और बात यह है कि निर्भरता इंजेक्शन आमतौर पर सिंगलटन ऑब्जेक्ट बनाता है। सेवाओं और डीएओ जैसी स्थितियों में, आप कभी भी एक से अधिक ऑब्जेक्ट नहीं लेना चाहेंगे। यह भी अच्छा है कि इसे पहले से ही (आमतौर पर वसंत में ऐप स्टार्टअप पर) तुरंत चालू किया जाए, ताकि आप जब भी जरूरतें उत्पन्न कर सकें।

+1

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

2

निर्भरता इंजेक्शन निर्भरता संकल्प के लिए वैश्विक स्थिति से बचने के लिए नियंत्रण पैटर्न के विचलन को लागू करने का एक तरीका है। आप निर्भरता-इंजेक्शन के साथ या उसके बिना नियंत्रण पैटर्न के उलटा उपयोग कर सकते हैं। हां वैश्विक चर का उपयोग नहीं कर रहे समीकरण मौसम का एक महत्वपूर्ण हिस्सा है जो आप निर्भरता-इंजेक्शन का उपयोग करते हैं या नहीं।

निर्भरता इंजेक्शन वास्तव में कुछ भी नहीं है यदि आप नीचे की शैली में एक प्रोग्राम लिखना चाहते थे जहां आवेदन के सबसे शीर्ष स्तर के हिस्से ने सभी उपप्रणाली के लिए निर्भरताओं को हल किया।

public static void main() { 
    World world = new World(); 
    world.player1 = new LocalPlayer(); 
    world.player2 = new NetworkPlayer(); 

    world.play(); 
} 

निर्भरता इंजेक्शन का उपयोग करते हुए बस की तरह कोड लिखने का अर्थ है: से अगर आप हाथ से ऑब्जेक्ट का निर्माण होगा यह वास्तव में कोई अलग होगा

<bean id="world" class="com.game.World" start-method="play"> 
    <property name="player1" ref="player1"/> 
    <property name="player2" ref="player2"/> 
</bean> 

<bean id="player1" class="com.game.LocalPlayer"/> 
<bean id="player2" class="com.game.NetworkPlayer/> 

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

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

आपके लिए निर्माण और चक्र निर्भरताओं के ढांचे को हल करने की तरह सुविधाएं हैं। अपनी घोषित वस्तुओं (यानी संपत्ति फाइलें, एक्सएमएल कॉन्फ़िगरेशन इत्यादि) में बाहरी कॉन्फ़िगरेशन और मानों का इंजेक्शन घोषित करना जो वास्तव में अच्छा है। इन सभी में से एक निर्भरता इंजेक्शन ढांचे को अपने आप सब कुछ करने के लिए उपयोग करने के लिए काफी मजबूती देता है।

1

मान लीजिए कि आप एक अच्छे कोडर हैं, आप अपने पार्ट्स सिस्टम को आसानी से परीक्षण और प्रतिस्थापित करने में सक्षम होना चाहते हैं। ऐसा करने का सबसे अच्छा तरीका मॉड्यूलर डिज़ाइन के साथ है। यही कहना है कि आप अपनी समस्या को छोटी समस्याओं में तोड़ना चाहते हैं जिन्हें आप हल कर सकते हैं और बग मुक्त रख सकते हैं।

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

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

0

निर्भरता इंजेक्शन का उपयोग करना विंडोज रजिस्ट्री का उपयोग करना प्रतीत होता है। आप अपनी इच्छित चीजों के साथ रजिस्ट्री को लोड करते हैं और फिर उन्हें बाहर खींचते हैं और कुछ मॉड्यूल में उनका उपयोग करते हैं।

हालांकि, यह ऑब्जेक्ट उन्मुख कोड को तोड़ देता है।

कहें कि आपके पास निर्भरता रजिस्ट्री में 20 आइटम हैं। एक डेटाबेस, एक लॉगर, एक अपवाद हैंडलर और इतने पर।

अब किसी दिए गए मॉड्यूल में आपके पास कोई मॉड्यूल नहीं है जो आपके मॉड्यूल का उपयोग करने वाली इन निर्भरता सेवाओं में से कौन सा है। आपका संदर्भ और खो गया है क्योंकि आप नहीं जानते कि जब आप कोड चलाते हैं तो निर्भरता रजिस्ट्री में क्या होगा!

मुझे यहां कोई लाभ नहीं दिख रहा है। यह बस असंभव डीबगिंग बनाता है।

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