डिपेंडेंसी इंजेक्शन और आईओसी कंटेनरों का उपयोग करने के क्या फायदे हैं?


62

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

इस तकनीक और इन उपकरणों का उपयोग करने के सबसे महत्वपूर्ण लाभ क्या हैं?


1
देखें यहाँ और यहाँ StackOverflow जवाब के लिए और यहां आईओसी पर एक अच्छा पूरा लेख के लिए। और अगर आप तुलना के लिए इसके खिलाफ तर्क चाहते हैं, तो एसओ पर यहां सिर दें।
जेसी सी। स्लाइसर

14
बट न होना ... लेकिन अगर आपको नहीं पता कि DI / IOC का उपयोग क्यों किया जाना चाहिए, तो आप इसके बारे में क्यों बात कर रहे हैं? एक शर्त हार गए? ;-)
स्टीवन ए। लोव

2
@ सच, ​​उसके बॉस ने उसे ऐसा करने के लिए कहा होगा।

1
@ सच, ​​मैं पहले से ही हर समय DI का उपयोग करता हूं (कुछ तो अक्सर कहते हैं: -D), मैं सिर्फ कुछ अच्छे तर्कों की तलाश कर रहा हूं ताकि अन्य लोगों को इसका उपयोग करने के लिए मिल सके।
एंडी लॉरी

2
लोग शायद ही कभी डीआई के अति प्रयोग के बारे में बात करते हैं । यदि आप हर एक निर्णय में देरी करते हैं, तो आप OO को स्पेगेटी कोड के समतुल्य बनाएंगे। एक सुसंगत डिजाइन होने के लिए कुछ बिंदु पर, एक वास्तविक निर्णय किया जाता है।
16

जवाबों:


47

मेरे लिए सबसे महत्वपूर्ण, एकल जिम्मेदारी सिद्धांत का पालन करना आसान बना रहा है ।

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

इसका एक और परिणाम यह है कि मैं बहुत आसानी से ओपन-क्लोज्ड सिद्धांत का समर्थन करने वाले डिजाइन के माध्यम से अपना रास्ता देख सकता हूं । यह सबसे अधिक आत्मविश्वास प्रेरक तकनीकों में से एक है (केवल स्वचालित परीक्षण के लिए दूसरा)। मुझे संदेह है कि मैं ओपन-क्लोज्ड प्रिंसिपल के गुणों को पर्याप्त रूप से जान सकता हूं।

DI / IoC मेरे प्रोग्रामिंग करियर की कुछ चीजों में से एक है जो "गेम चेंजर" रही है। वहाँ एक है विशाल गुणवत्ता में अंतर कोड के बीच मैंने पहले और डि / आईओसी सीखने के बाद लिखा था। मुझे इस बात पर जोर देना चाहिए कि कुछ और। कोड की गुणवत्ता में बड़ा सुधार।


3
ओपन-क्लोज्ड सिद्धांत इतना बड़ा सौदा क्यों है? यदि आपको लगता है कि आपको एपीआई / इंटरफ़ेस बदलने की आवश्यकता है तो आपको क्यों नहीं करना चाहिए?
४son बजे अर्ने एवरटसन

@ArneEvertsson रॉबर्ट सी। मार्टिन को ओपन-क्लोज्ड सिद्धांत के बारे में बात करें। तुम प्रबुद्ध हो जाओगे।
अल्टरनेटेक्स

@AmeEvertsson ओपन-क्लोज्ड बहुत महत्वपूर्ण है जब आपके कोड की आपूर्ति की जाती है (उदाहरण के लिए एक वाणिज्यिक उत्पाद के रूप में) दूसरों के उपयोग के लिए एक मॉड्यूल के रूप में, क्योंकि यह आपके कोड को उपयोग करने के लिए उनके बिना अधिक अनुकूलनीय बनाता है इसे बदलने के लिए
जेम्स एनिस-जोन्स

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

1
मैंने वर्षों पहले इस उत्तर को अस्वीकार कर दिया था; यहां कुछ टिप्पणियां दी गई हैं: 1) व्यवहार में, डीआर का व्यापक उपयोग एसआरपी के खिलाफ काम करने के लिए जाता है , क्योंकि प्रोग्रामर केवल अपने इंजेक्शन "नियंत्रक", "सेवाएं", "डीएओ", आदि के लिए नई कक्षाएं बनाने के बजाय तरीके जोड़ते रहते हैं। नई कार्यक्षमता। यह वही है जो आप सामान्य रूप से जावा और सी # .NET प्रोजेक्ट्स में देखते हैं जो कुछ DI फ्रेमवर्क या कंटेनर का उपयोग करते हैं। 2) खुले-बंद सिद्धांत सिर्फ बर्ट्रेंड मेयर का भ्रम था जो वर्ग की उपयोगिता (कार्यान्वयन) विरासत के बारे में था; अगर आप इसे अपनी 1400+ पेज की किताब में खोजते हैं तो आप देखेंगे कि मेरा क्या मतलब है - यह वास्तव में मूर्खतापूर्ण है।
रोजेरियो

9

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


3

निर्भरता इंजेक्शन के लाभ हैं:

  1. आपका कोड साफ और अधिक पठनीय है।
  2. कोड शिथिल रूप से युग्मित हैं।
  3. अधिक पुन: प्रयोज्य के रूप में कार्यान्वयन XML फ़ाइल में कॉन्फ़िगर किए गए हैं, इसे एक अलग संदर्भ में उपयोग किया जा सकता है।
  4. विभिन्न मॉक कार्यान्वयन के साथ कोड को आसानी से परीक्षण किया जा सकता है।

1

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

आप सेवा लोकेटरों का उपयोग करके या जब भी लागू हो (जो कि ज्यादातर समय होता है) पर सीधे निर्भरता द्वारा उच्च सामंजस्य और कम युग्मन के संबंध में समान लक्ष्य प्राप्त कर सकते हैं।

अब, मुझे पता है कि कई लोग इस राय से असहमत होंगे। मुझे ठोस उदाहरणों पर चर्चा करने में खुशी होगी।


2
लेकिन एक सेवा लोकेटर को सीधे लागू करना या एक ठोस निर्भरता को तत्काल करना, आमतौर पर आपके आश्रितों को कड़ी-तार देता है, या कम से कम जहां आपकी निर्भरताएं हैं। यह DI के उद्देश्य को पराजित करता है। आपको अभी भी सर्विस लोकेटर को इंजेक्ट करना है।
मैट एच

एक सेवा लोकेटर का उपयोग करना मुश्किल नहीं है, केवल सेवा लोकेटर वर्ग के उपयोग को छोड़कर, जो सामान्य रूप से "इंजेक्शन" नहीं है। एक ठोस कार्यान्वयन वर्ग को त्वरित करना उन मामलों में पूरी तरह से ठीक है, जहां आपको बाहरी कॉन्फ़िगरेशन की आवश्यकता नहीं है (उदाहरण के लिए, प्रोग्रामर आमतौर पर डीआई का उपयोग करने के बजाय सीधे एरेलेस्ट क्लास को तत्काल भेजते हैं - जो ओवरकिल होगा)।
रोजेरियो

1
आप "कम युग्मन" का उल्लेख करते हैं और बाद में आप कहते हैं कि सेवा लोकेटर का किसी अनुप्रयोग के युग्मन के स्तर पर कोई प्रभाव नहीं पड़ता है। कोड पर सीधे सहयोगियों को तत्काल करने के लिए, मैं अपनी निर्भरता के साथ किसी वस्तु को जोड़े रखने के लिए अधिक सटीक तरीका नहीं सोच सकता। आप दोनों परिदृश्यों का परीक्षण कैसे करते हैं? मैं, सम्मानपूर्वक, आपकी हर बात से पूरी तरह असहमत हूं।
क्लिंट ईस्टवुड

@ जोनाथन आपको उस लेख को पढ़ना चाहिए जिसने DI का परिचय दिया ; लेखक ने यह कहकर निष्कर्ष निकाला कि DI और सर्विसलॉकर "लगभग बराबर" हैं, उत्तरार्द्ध के लिए "मामूली बढ़त" के साथ। युग्मन जो मायने रखता है वह एक घटक और अन्य घटकों के बीच होता है जिसमें कई कार्यान्वयन हो सकते हैं; एक ServiceLocator केवल एक कार्यान्वयन के साथ एक बुनियादी ढांचा सेवा है, इसलिए यह ठीक है। नोट मैंने लिखा है " जब भी लागू हो निर्भरता पर निर्भर करता है "; बेशक, अगर आपको उपयोग से कॉन्फ़िगरेशन को अलग करने की आवश्यकता है, तो आप ऐसा नहीं करेंगे।
रोगियो

1
@ जोनाथन इकाई परीक्षण के संबंध में, यह एक मिथक है कि तत्काल सहयोगियों ने ऐसे परीक्षणों के निर्माण को रोक दिया है; वहाँ जाने-माने उपकरण हैं जो एक वर्ग को निर्भरता कार्यान्वयन से अलग करने का काम करते हैं, चाहे वे इंजेक्शन हों या न हों।
रोजेरियो

-1

जब परीक्षण के उद्देश्य के लिए आंतरिक वस्तुओं को उजागर करने के लिए DI का उपयोग किया जाता है, तो पैटर्न का दुरुपयोग किया गया है।


1
आप "आंतरिक वस्तुओं" से क्या मतलब है ?. में वास्तविक OOP (नोट प्रोग्रामर की शायद केवल 1% जानते हैं कि क्या है कि वास्तव में इसका मतलब है), वहाँ गए संदेशों (यानी विधि आमंत्रण) भेजने के माध्यम से एक दूसरे के साथ संवाद स्थापित वस्तुओं रहे हैं। उस अर्थ में, प्रत्येक वस्तु की एक ही जिम्मेदारी होनी चाहिए, दूसरों की तुलना में "अधिक महत्वपूर्ण" वस्तुएं नहीं हैं ... हर एक का एक ही कर्तव्य है और वे पूरे सिस्टम द्वारा प्रदान की गई कार्यक्षमता को प्राप्त करने के लिए सहयोग करते हैं। प्रत्येक वस्तु को अलग-थलग तरीके से जांचना महत्वपूर्ण है ताकि हम जान सकें कि हम किसी भी मामले में चूक नहीं गए हैं, यही डीआई वास्तव में अच्छा है।
क्लिंट ईस्टवुड

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