डिपेंडेंसी इनवर्सन से संबंधित नियंत्रण का व्युत्क्रम कैसे होता है


12

वेब पर सभी लेखों में कंट्रोल एंड डिपेंडेंसी इनवर्सन प्रिंसिपल के उलटा शब्द को मिलाया और पर्यायवाची के रूप में प्रयोग किया जाता है (आगे भ्रम "DI-कंटेनरों" और "IoC- कंटेनरों" कहा जाता है)। एक विकिपीडिया लेख यह समझाने की कोशिश करता है कि IoC DI के समान नहीं है:

नियंत्रण का उलटा (IoC) एक डिजाइन का वर्णन करता है जिसमें कंप्यूटर प्रोग्राम के कस्टम-लिखित भाग को एक सामान्य, पुन: प्रयोज्य पुस्तकालय से नियंत्रण का प्रवाह प्राप्त होता है।

तो डीआईपी कंक्रीट कार्यान्वयन के बजाय आपके मॉड्यूल अमूर्तता पर निर्भर करता है।

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

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

इसलिए, यहां कुछ प्रश्न दिए गए हैं, जिन्हें मैं अभी तक समझ नहीं पाया हूं:

  • IoC और DIP के बीच वास्तविक संबंध क्या है? क्या आईओसी हमेशा डीआईपी लागू करने के साधन के रूप में काम करता है?
  • निर्भरता के लिए उपकरण DI- और IoC- कंटेनर दोनों को क्यों हल किया जाता है? इसका तात्पर्य यह है कि DI और IoC एक ही चीज हैं।

नोट : यह प्रश्न डीआई और आईओसी के बीच अंतर का एक डुप्लिकेट नहीं है , क्योंकि बाद वाले डिपेंडेंसी इंजेक्शन के बारे में पूछते हैं, न कि डिपेंडेंसी इनवर्जन।



@gnat, नहीं, यह नहीं है, कृपया मेरा संपादन देखें
आंद्रे बोरगेस

सहमत हूँ, मुझे वह खेद याद आया
gnat

2
IMO, सरल उत्तर है "वे समान हैं"। IoC निर्भरता व्युत्क्रम का दूसरा नाम है और दोनों निर्भरता इंजेक्शन प्राप्त करने का एक तरीका है। मैं "निर्भरता व्युत्क्रम" को एक गहरी अनहेल्दी शब्द के रूप में देखता हूं क्योंकि यह बहुत आसानी से इंजेक्शन के साथ भ्रमित है। तो वहाँ DI (इंजेक्शन) और IoC निर्भरता के इंजेक्शन प्राप्त करने का एक तरीका है / इंजेक्शन के माध्यम से नियंत्रण।
डेविड अर्नो

जवाबों:


6

मार्टिन फाउलर की साइट पर एक शानदार लेख है जिसमें विशेष रूप से डीआईपी, डीआई और आईओसी के बीच अंतर के बारे में एक अध्याय है । इसका सार (जैसा कि उस साइट से कॉपी किया गया है) है

DI इस बारे में है कि कोई वस्तु किसी निर्भरता को कैसे प्राप्त करती है। जब एक निर्भरता बाहरी रूप से प्रदान की जाती है, तो सिस्टम DI का उपयोग कर रहा है। IoC कॉल शुरू करने वाले के बारे में है। यदि आपका कोड कॉल शुरू करता है, तो यह IoC नहीं है, यदि कंटेनर / सिस्टम / लाइब्रेरी उस कोड में वापस कॉल करता है जो आपने इसे प्रदान किया था, क्या यह IoC है।

दूसरी ओर डीआईपी, आपके कोड से भेजे गए संदेशों में अमूर्तता के स्तर के बारे में है जो इसे बुला रहा है। यह सुनिश्चित करने के लिए, डीआईपी के साथ डीआई या आईओसी का उपयोग अधिक अभिव्यंजक, शक्तिशाली और डोमेन-संरेखित होता है, लेकिन वे एक समग्र समस्या में विभिन्न आयामों या बलों के बारे में हैं। DI तारों के बारे में है, IoC दिशा के बारे में है, और DIP आकार के बारे में है।


2
IoC कॉल शुरू करने वाले व्यक्ति के बारे में है - जो कॉल को इंट्रोड्यूस करता है क्या? अगर मैं लिखूं ISomeInterface object = container.Resolve<ISomeInterface>()कि IoC है या नहीं?
आंद्रे बोर्गेस

1
आप जो लिखते हैं वह सेवा लोकेटर पैटर्न में एक कार्यान्वयन है। यह भी IoC है। नहीं IoC ISomeInterface ऑब्जेक्ट = नया MyClass () है। तो जो कॉल होता है, वह "कॉल टू इंस्टेंटिएशन" होता है (या जिसे 'नया' कहते हैं)।
Sjoerd222888

1
दूसरी ओर, डीआईपी, आपके कोड से भेजे गए संदेशों में अमूर्तता के स्तर के बारे में है जो इसे कॉल कर रहा है। " जो मुझे बकवास लगता है। उस में उलटा कहां है? वह निर्भरता अमूर्तता का वर्णन कर रहा है, उलटा नहीं।
डेविड अर्नो

@DavidArno, क्या आप कह रहे हैं कि हम मार्टिन फाउलर की वेबसाइट पर भरोसा नहीं कर सकते?
18en में होल्डनमग्रोइन

@holdenmcgrohen, यह चीजों पर उनकी राय है। सिर्फ इसलिए कि यह मार्टिन फाउलर है, यह तथ्य नहीं बनाता है। वह कई बार गलत है IMO, उदाहरण के लिए "एनीमिया डेटा मॉडल" के बारे में। दूसरी बार, वह बहुत ही जिंदादिल था। इस अवसर पर मुझे लगता है कि वह गलत है क्योंकि इसका कोई मतलब नहीं है।
डेविड अर्नो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.