कैसे निर्भरता इंजेक्शन केवल जटिलता को एक अलग वर्ग में नहीं ले जा रहा है?


9

मैं इस सप्ताह निर्भरता इंजेक्शन के लिए टाइफून फ्रेमवर्क का उपयोग कर रहा हूं। मुझे लगता है कि यूनिट के परीक्षण के दौरान मॉक के साथ मनमाने घटकों को बदलने के लिए वस्तुओं के निर्माण को अलग करना फायदेमंद है, और अब तक मैंने इससे अकेले लाभ देखा है।

लेकिन मैं मदद नहीं कर सकता, लेकिन यह सोचता हूं कि पहले जहां मेरे पास एक विनम्र दृश्य नियंत्रक वर्ग था जिसमें हेडर आयात के दसियों थे, अब मेरे पास एक विनम्र कारखाना वर्ग है जिसमें हेडर आयात के दसियों हैं। क्या मैं एक विशाल कारखाना वर्ग से बचने वाला था?


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

5
मुझे नहीं लगता कि निर्भरता इंजेक्शन जटिलता को कम करने का एक तरीका है, लेकिन स्पष्ट निर्भरता (स्पष्ट पैरामीटर / बाध्य चर का उपयोग करें) के पक्ष में निहित निर्भरता (वैश्विक प्रतीकों / मुक्त चर का उपयोग) से बचने का एक तरीका है। तो, जटिलता अभी भी है, लेकिन आप इससे निपटने के लिए मजबूर हैं क्योंकि आप इसे अपने तरीके / निर्माण हस्ताक्षर में स्पष्ट करते हैं।
जियोर्जियो

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

1
यदि आपको 50 हेडर आयात करने पड़ते हैं, तो आपको इसे कहीं करना होगा। DI आपको अपने कोड के परीक्षण के यूनिट के आसान तरीके से मदद करता है।
B46овиЈ

2
तो, क्या आप कह रहे हैं कि अब आपके नियंत्रक को नियंत्रित करने पर ध्यान केंद्रित किया गया है और आपके हेडर आयात कारखाने को हेडर आयात पर फोकस किया गया है? यह कभी भी एक बुरी बात कैसे हो सकती है, चाहे आप डीआई फ्रेमवर्क का उपयोग कर रहे हों या नहीं।
पीडीआर

जवाबों:


16

निर्भरता इंजेक्शन बस यह परिभाषित करने में मदद करता है कि कोई वस्तु किसी अन्य निर्भर वस्तु के बारे में कैसे जानती है। यह सिस्टम की समग्र जटिलता को कम करने में आपकी मदद करने वाला नहीं है। यदि आपको DI से पहले दसियों आयात की आवश्यकता है, तो आपको इसके बाद भी दसियों आयात की आवश्यकता होगी। अंतर यह है कि ये आयात एक स्थान (वर्ग) में होंगे जो अधिक समझ (कारखाना, बिल्डर, आदि) बनाता है।

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

ऐसे कई सिद्धांत हैं जो समान हैं और अक्सर एक साथ उपयोग किए जाते हैं: डिपेंडेंसी इंजेक्शन (DI), कंट्रोल ऑफ इंवर्टेंस (IoC), और डिपेंडेंसी इनवर्जन प्रिंसिपल (DIP)

इस लेख से http://martinfowler.com/articles/dipInTheWild.html

DI तारों के बारे में है, IoC दिशा के बारे में है, और DIP आकार के बारे में है


2
अंतिम उद्धरण के लिए +1। यह इन 3 अवधारणाओं का सबसे अच्छा स्पष्टीकरण है जो लोग अक्सर गलत समझते हैं।
ज्येष्ठ

ऊपर लिंक किया गया लेख वास्तव में बकाया है। पर्याप्त रूप से गहरी और बहुत स्पष्ट व्याख्या।
डेमेट्रीकॉट्स

10

निर्भरता इंजेक्शन जटिलता को कम नहीं करता है, लेकिन यह चिंताओं को अलग करने और युग्मन को कम करने के माध्यम से व्यवहार्यता को बढ़ाता है।

लेकिन मैं मदद नहीं कर सकता, लेकिन यह सोचता हूं कि पहले जहां मेरे पास एक विनम्र दृश्य नियंत्रक वर्ग था जिसमें हेडर आयात के दसियों थे, अब मेरे पास एक विनम्र कारखाना वर्ग है जिसमें हेडर आयात के दसियों हैं। क्या मैं एक विशाल कारखाना वर्ग से बचने वाला था?

आप "विनम्र" वर्गों, अवधि से बचने वाले हैं। तो मान लें कि आप व्यू कंट्रोलर को छोटे, अधिक रख-रखाव वाली कक्षाओं में विभाजित करते हैं। अब वे सभी अपनी निर्भरता को पाने के लिए जिम्मेदार हैं। DI आपको उन सभी वर्गों से एक कारखाने / कॉन्फ़िगरेशन वर्ग में इस निर्भरता प्रबंधन को स्थानांतरित करने में मदद करता है जो केवल निर्भरता प्रबंधन के लिए जिम्मेदार है - एकल जिम्मेदारी सिद्धांत देखें। और जबकि यह निश्चित रूप से मूल दृश्य नियंत्रक की तुलना में बहुत कम "विनम्र" होगा, अगर यह बहुत बड़ा हो जाता है तो आपके पास हमेशा इसे छोटे निर्भरता-प्रबंधन वर्गों में विभाजित करने का विकल्प होता है जो आवेदन के विभिन्न हिस्सों के लिए जिम्मेदार होते हैं।


2

आम आदमी के शब्दों में:

निर्भरता इंजेक्शन जटिलता को स्थानांतरित करता है जहां यह कम नुकसान करता है।

EDIT for @gnat: DI सिर्फ एक अलग वर्ग के लिए जटिलता नहीं बढ़ रहा है, यह इसे उस स्थान पर ले जा रहा है जहां यह कम नुकसान पहुंचाता है।


यह पूछे गए प्रश्न का उत्तर कैसे देता है?
gnat

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