नियंत्रण का व्युत्क्रम क्या है?


1825

जब पहली बार सामना किया जाता है तो इनवर्टर ऑफ कंट्रोल (IoC) काफी भ्रमित हो सकता है।

  1. यह क्या है?
  2. यह किस समस्या का हल है?
  3. कब उपयोग करना उचित है और कब नहीं?

292
इनमें से अधिकांश उत्तरों के साथ समस्या यह है कि प्रयुक्त शब्दावली। कंटेनर क्या है? उलट? निर्भरता? इसे बड़े शब्दों के बिना सामान्य शब्दों में समझाएं।
kirk.burleson


8
यह डिपेंडेंसी इंजेक्शन (DI) है - मार्टिन फाउलर्स का अवतरण
रिकार्डो सांचेज़


यह एक विशेषण है, संज्ञा नहीं है, यह कोई बात नहीं है, यह कोड में किए गए बदलाव का वर्णन है, जहां प्रवाह का नियंत्रण प्रतिनिधि में है, कंटेनर नहीं।
मार्टिन स्पर

जवाबों:


1522

व्युत्क्रम नियंत्रण (IoC) और निर्भरता इंजेक्शन (DI) पैटर्न आपके कोड से निर्भरता को दूर करने के बारे में हैं।

उदाहरण के लिए, मान लें कि आपके एप्लिकेशन में एक टेक्स्ट एडिटर घटक है और आप वर्तनी जाँच प्रदान करना चाहते हैं। आपका मानक कोड कुछ इस तरह दिखाई देगा:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

हमने यहां क्या किया है TextEditorऔर इसके बीच निर्भरता पैदा करता है SpellChecker। आईओसी परिदृश्य में हम इसके बजाय कुछ इस तरह करेंगे:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

पहले कोड उदाहरण में हम तात्कालिक हैं SpellChecker( this.checker = new SpellChecker();), जिसका अर्थ है कि TextEditorवर्ग सीधे वर्ग पर निर्भर करता है SpellChecker

दूसरे कोड उदाहरण में हम SpellCheckerनिर्भरता वर्ग के TextEditorनिर्माणकर्ता के हस्ताक्षर (वर्ग में निर्भरता को शुरू नहीं करना) के आधार पर बना रहे हैं। यह हमें निर्भरता को कॉल करने की अनुमति देता है, फिर उसे TextEditor वर्ग की तरह पास करें:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

अब TextEditorक्‍लास बनाने वाले क्‍लाइंट का इस पर नियंत्रण होता है कि कौन से SpellCheckerकार्यान्वयन का उपयोग करना है क्‍योंकि हम निर्भरता को TextEditorहस्‍ताक्षर में इंजेक्‍ट कर रहे हैं ।


50
अच्छा स्पष्ट उदाहरण। हालाँकि, मान लीजिए कि ISpellChecker इंटरफ़ेस को ऑब्जेक्ट के कंस्ट्रक्टर को पास करने की आवश्यकता है, हमने इसे एक सेटलेबल प्रॉपर्टी (या SetSpellChecker मेथड) के रूप में उजागर किया। क्या यह अभी भी IoC का गठन करेगा?
devios1

25
chainguy1337 - हाँ यह होगा। कंस्ट्रक्टर इंजेक्शन (दोनों निर्भरता इंजेक्शन तकनीक) के विपरीत सेटर जैसे इंजेक्शन को सेटर इंजेक्शन कहा जाता है। IoC एक काफी सामान्य पैटर्न है, लेकिन निर्भरता इंजेक्शन acheives IoC
जैक Ukleja

257
कई वोटों के बावजूद, यह जवाब गलत है। कृपया martinfowler.com/articles/injection.html#InversionOfControl देखें । विशेष रूप से, भाग पर ध्यान दें "उलटा नियंत्रण बहुत सामान्य शब्द है, और इस प्रकार लोग इसे भ्रामक पाते हैं। विभिन्न आईओसी अधिवक्ताओं के साथ बहुत चर्चा के परिणामस्वरूप हम डिपेंडेंसी इंजेक्शन नाम पर बसे"।
Rogério

45
मैं @ रोगेरिया से सहमत हूं। यह स्पष्ट नहीं करता है कि इसे आईओसी क्यों कहा जाता है और मुझे वोटों की संख्या से आश्चर्य होता है
;;

31
मैं @Rogerio और @ पैंजिया के साथ हूं। यह कंस्ट्रक्टर इंजेक्शन के लिए एक अच्छा उदाहरण हो सकता है लेकिन मूल प्रश्न का अच्छा जवाब नहीं है। आईओसी, जैसा कि फाउलर द्वारा परिभाषित किया गया है , किसी भी प्रकार के इंजेक्शन का उपयोग किए बिना महसूस किया जा सकता है, जैसे कि सेवा लोकेटर या यहां तक ​​कि साधारण वंशानुक्रम का उपयोग करके ।
mtsz

642

नियंत्रण का उलटा वह है जो आपको तब मिलता है जब आपका प्रोग्राम कॉलबैक करता है, जैसे कि एक गिनी कार्यक्रम।

उदाहरण के लिए, एक पुराने स्कूल मेनू में, आपके पास हो सकता है:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

इस प्रकार उपयोगकर्ता संपर्क के प्रवाह को नियंत्रित करता है।

GUI कार्यक्रम या किसी चीज़ में, इसके बजाय हम कहते हैं:

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

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

मूल रूप से, ईवेंट लूप, कॉलबैक या ट्रिगर्स निष्पादित करने वाली कोई भी चीज़ इस श्रेणी में आती है।


161
इस आदमी को नीचे चिह्नित न करें। तकनीकी रूप से वह सही है martinfowler.com/bliki/InversionOfControl.html IoC एक बहुत ही सामान्य प्रिंसिपल है। नियंत्रण का प्रवाह निर्भरता इंजेक्शन द्वारा "उल्टा" है क्योंकि आपने प्रभावी रूप से कुछ बाहरी प्रणाली (जैसे
IoC

38
श्नाइडर की टिप्पणी से सहमत हैं। 5 डाउनवोट्स? दिमाग चकरा जाता है, क्योंकि यह एकमात्र उत्तर है जो वास्तव में सही है। उद्घाटन पर ध्यान दें: ' एक गुई कार्यक्रम की तरह ।' डिपेंडेंसी इंजेक्शन केवल IoC का सबसे अधिक देखा जाने वाला अहसास है।
जेफ़ सनाट

40
वास्तव में, यह कुछ सही awsers में से एक है! दोस्तों, IoC मूल रूप से निर्भरता के बारे में नहीं है । हर्गिज नहीं।
रोजेरियो

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

14
मुझे अब यह
समझ में

419

नियंत्रण का व्युत्क्रम क्या है?

यदि आप इन सरल दो चरणों का पालन करते हैं, तो आपने नियंत्रण को उलटा कर दिया है:

  1. क्या -to भाग को अलग करें जब -to भाग करें।
  2. सुनिश्चित करें कि जब भाग के रूप में जानता है थोड़ा संभव के रूप में के बारे में क्या हिस्सा; और इसके विपरीत।

आपके द्वारा उपयोग की जा रही तकनीक / भाषा के आधार पर इनमें से प्रत्येक चरण के लिए कई तकनीकें संभव हैं।

-

उलट नियंत्रण के उलट (आईओसी) के हिस्से के भ्रामक बात है, क्योंकि व्युत्क्रम सापेक्ष शब्द है। IoC को समझने का सबसे अच्छा तरीका उस शब्द को भूल जाना है!

-

उदाहरण

  • घटना से निपटना। इवेंट हैंडलर (क्या-क्या करें)
  • इंटरफेस। घटक ग्राहक (जब-से-भाग करें) - घटक इंटरफ़ेस कार्यान्वयन (क्या-क्या करना है)
  • xUnit स्थिरता। सेटअप और टियरडाउन (क्या करें)
  • खाका विधि डिजाइन पैटर्न। टेम्पलेट विधि जब-टू-पार्ट भाग - आदिम उपवर्ग कार्यान्वयन क्या-क्या करना है
  • COM में DLL कंटेनर विधियाँ। DllMain, DllCanUnload, etc (what-to-do part) - COM / OS (जब-जब भाग करें)

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

'कंपोनेंट क्लाइंट' से मेरा मतलब इंटरफेस के यूजर / क्लाइंट से था। क्लाइंट 'कब' को 'क्या-क्या' भाग को ट्रिगर करने के लिए जानता है कि क्या उद्देश्य कार्यक्षमता का विस्तार करना है या नहीं।
rpattabi

मार्टिन फाउलर के इस अद्भुत लेख पर एक नज़र डालें। वह दिखाता है कि इंटरफेस कैसे नियंत्रण के व्युत्क्रम का मूल हिस्सा बनाते हैं: martinfowler.com/articles/injection.html#InversionOfControl
rpattabi

दो पहले वाक्य शानदार हैं। बहुत बढ़िया !! कब-कब और क्या-क्या करना द्वारा अलग अलग !! मुझे नहीं पता कि अन्य उत्तर क्यों प्राप्त होते हैं जो बहुत से अपवोट हैं। वे बिना किसी समझ के सिर्फ कोड बोल रहे हैं।
अमीर ज़ियारती

2
मुझे स्पष्टीकरण पसंद है what-to-doऔरwhen-to-do
KimchiMan

164

नियंत्रणों का विलयन चिंताओं को अलग करने के बारे में है।

बिना IoC : आपके पास एक लैपटॉप कंप्यूटर है और आप गलती से स्क्रीन तोड़ देते हैं। और धन्नो, तुम वही मॉडल लैपटॉप स्क्रीन बाजार में कहीं नहीं है। तो तुम फंस गए।

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

आपका डेस्कटॉप इस मामले में IoC को सफलतापूर्वक लागू करता है। यह विभिन्न प्रकार के मॉनिटर को स्वीकार करता है, जबकि लैपटॉप नहीं करता है, इसे ठीक करने के लिए एक विशिष्ट स्क्रीन की आवश्यकता होती है।


1
@Luo Jiong हुई अच्छी व्याख्या।
सचिन

3
अधिकांश डिज़ाइन पैटर्न, यदि सभी नहीं हैं, तो हमारे दैनिक जीवन में उनके समकक्ष हैं जिन्हें हम इतनी अच्छी तरह से देखते और समझते हैं। एक डिजाइन पैटर्न को समझने का सबसे कुशल तरीका उनके दैनिक जीवन समकक्षों को जानना है। और मेरा मानना ​​है कि कई हैं।
लुओ जियोन्ग हुई

6
गलत जवाब। आप निर्भरता इंजेक्शन समझा रहे हैं न कि आईओसी। ऊपर इस जवाब
रोजेरियो

2
मैं सहमत हूँ। यह DI है, IoC नहीं। फिर भी इससे एक उत्थान मिलता है, क्योंकि यह एक सरल दृष्टिकोण है, फिर भी विषय की समझ का विस्तार करने में मदद करता है।
मार्च

यह निर्भरता इंजेक्शन की व्याख्या करता है। आईओसी नहीं। लेकिन अच्छी और स्पष्ट व्याख्या।
चमन विक्रमरत्न

120

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

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

नियंत्रण के उलटा लागू करने से, एक सॉफ्टवेयर / वस्तु उपभोक्ता को नियंत्रित या कम विकल्प होने के बजाय सॉफ्टवेयर / वस्तुओं पर अधिक नियंत्रण / विकल्प मिलते हैं।

मन में उपरोक्त विचारों के साथ। हम अभी भी आईओसी का एक महत्वपूर्ण हिस्सा याद करते हैं। IoC के परिदृश्य में, सॉफ्टवेयर / ऑब्जेक्ट उपभोक्ता एक परिष्कृत ढांचा है। इसका मतलब है कि आपके द्वारा बनाए गए कोड को खुद नहीं कहा जाता है। अब आइए बताते हैं कि वेब एप्लिकेशन के लिए यह तरीका बेहतर क्यों है।

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

यद्यपि श्रमिक प्रबंधकों को शीर्ष स्तर पर परियोजना के प्रबंधन का नियंत्रण देते हैं (ढांचा)। लेकिन कुछ पेशेवरों की मदद करना अच्छा है। यह सही मायने में आईओसी की अवधारणा है।

MVC आर्किटेक्चर के साथ आधुनिक वेब एप्लिकेशन URL रूटिंग करने के लिए फ्रेमवर्क पर निर्भर करता है और कॉल करने के लिए फ्रेमवर्क के लिए नियंत्रकों को रखता है।

निर्भरता इंजेक्शन और नियंत्रण के व्युत्क्रम संबंधित हैं। डिपेंडेंसी इंजेक्शन माइक्रो लेवल पर है और कंट्रोल ऑफ इनवर्सन मैक्रो लेवल पर है। खाना खत्म करने के लिए आपको (खाने को लागू करने के लिए) डीआईई को लागू करना होगा।


21
मैंने शादी और IoC की तुलना DI से तलाक के लिए की।
मारेक बार

"हालांकि श्रमिक प्रबंधकों (ढांचे) को शीर्ष स्तर पर परियोजना के प्रबंधन का नियंत्रण देते हैं। लेकिन कुछ पेशेवरों की मदद करना अच्छा होता है। यह आईओसी की अवधारणा वास्तव में है।" - सबसे पहले नियंत्रण है प्रबंधक के साथ। क्या आप बता सकते हैं कि नियंत्रण कैसे उलटा होता है? पेशेवरों की मदद से (किस तरह का पेशेवर)? कैसे ?
इस्तियाक अहमद

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

2
विवाहित लोगों को संदेश: अब तलाक न दें, आपका बच्चा वर्ग भी आईओसी लागू कर सकता है।
जुलियन

हां, शादी के बारे में मेरी यही दूरदृष्टि भी आईओसी
बालरून

94

नियंत्रण के व्युत्क्रम का उपयोग करने से पहले आपको इस तथ्य से अच्छी तरह से अवगत होना चाहिए कि इसके नियम और विपक्ष हैं और आपको पता होना चाहिए कि यदि आप ऐसा करते हैं तो आप इसका उपयोग क्यों करते हैं।

पेशेवरों:

  • आपका कोड डिकोड हो जाता है ताकि आप आसानी से वैकल्पिक कार्यान्वयन के साथ एक इंटरफ़ेस के कार्यान्वयन का आदान-प्रदान कर सकें
  • यह कार्यान्वयन के बजाय इंटरफेस के खिलाफ कोडिंग के लिए एक मजबूत प्रेरक है
  • अपने कोड के लिए यूनिट टेस्ट लिखना बहुत आसान है क्योंकि यह इसके कंस्ट्रक्टर / सेटर्स में मौजूद ऑब्जेक्ट्स के अलावा और कुछ नहीं पर निर्भर करता है और आप आसानी से अलगाव में सही ऑब्जेक्ट्स के साथ इन्हें इनिशियलाइज़ कर सकते हैं।

विपक्ष:

  • आईओसी न केवल आपके कार्यक्रम में नियंत्रण प्रवाह को प्रभावित करता है, बल्कि यह काफी हद तक बादल भी करता है। इसका मतलब है कि आप अब केवल अपना कोड नहीं पढ़ सकते हैं और एक स्थान से दूसरे स्थान पर जा सकते हैं क्योंकि जो कनेक्शन सामान्य रूप से आपके कोड में होंगे वे अब कोड में नहीं हैं। इसके बजाय यह XML कॉन्फ़िगरेशन फ़ाइलों या एनोटेशन और आपके IoC कंटेनर के कोड में है जो इन मेटाडेटा की व्याख्या करता है।
  • एक नए वर्ग की बग पैदा होती है जहाँ आप अपने XML कॉन्फिगरेशन या अपने एनोटेशन को गलत पाते हैं और आप यह जानने में बहुत समय बिता सकते हैं कि आपका IoC कंटेनर कुछ शर्तों के तहत आपकी किसी एक ऑब्जेक्ट में एक शून्य संदर्भ क्यों इंजेक्ट करता है।

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


3
पहला कॉन गलत है। आदर्श रूप से आपके कोड में IOC कंटेनर का केवल 1 उपयोग होना चाहिए, और यह आपकी मुख्य विधि है। बाकी सब कुछ वहाँ से नीचे आना चाहिए
mwjackson

23
मुझे लगता है कि उसका क्या मतलब है, आप अभी नहीं पढ़ सकते हैं: myService.DoSomething () और DoSomething की परिभाषा पर जाएं, क्योंकि IoC के साथ, myService सिर्फ एक इंटरफ़ेस है, और वास्तविक कार्यान्वयन आपके लिए अज्ञात है, जब तक कि आप नहीं देखते हैं। यह xml कॉन्फिग फाइलों या मुख्य विधि में होता है जहां आपका ioc सेटअप हो जाता है।
करिश्मा

7
यही वह जगह है जहाँ Resperper मदद करता है - इंटरफ़ेस के खिलाफ "कार्यान्वयन पर क्लिक करें"। IoC (या अपने उदाहरण से अधिक विशेष रूप से DI) से बचने का मतलब शायद यह भी है कि आप ठीक से परीक्षण नहीं कर रहे हैं
IThasTheAnswer

10
पुन: यह आपके सॉफ़्टवेयर को उन कक्षाओं के संग्रह में बदल देता है जो अब "वास्तविक" प्रोग्राम नहीं बनाते हैं, लेकिन बस कुछ ऐसा है जिसे XML कॉन्फ़िगरेशन या एनोटेशन मेटाडेटा द्वारा एक साथ रखना होगा और इसके बिना (और गिर जाएगा) - मुझे लगता है कि बहुत भ्रामक है। वही किसी भी कार्यक्रम के बारे में कहा जा सकता है जो एक रूपरेखा के ऊपर लिखा गया है। एक अच्छा IoC कंटेनर के साथ अंतर यह है कि आपको सक्षम होना चाहिए, यदि आपका प्रोग्राम अच्छी तरह से डिज़ाइन किया गया है और लिखा गया है, तो इसे बाहर निकालें और अपने कोड में कम से कम बदलाव के साथ दूसरे में रखें, या IoC को पूरी तरह से टॉस करें और हाथ से अपनी वस्तुओं का निर्माण करें। ।
द ऐनुरी बीयर

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

68
  1. विकिपीडिया लेख । मेरे लिए, नियंत्रण का व्युत्क्रम आपके क्रमिक रूप से लिखे गए कोड को बदलकर प्रतिनिधिमंडल संरचना में बदल रहा है। आपके कार्यक्रम के बजाय स्पष्ट रूप से सब कुछ नियंत्रित करने के लिए, आपका कार्यक्रम कुछ कार्यों के साथ एक वर्ग या पुस्तकालय स्थापित करता है, जब कुछ चीजें होती हैं।

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

  3. नियंत्रण का उलटा कोड दोहराव को कम करने का एक व्यावहारिक तरीका है, और यदि आप अपने आप को एक पूरी विधि की नकल करते हुए पाते हैं और केवल कोड का एक छोटा सा टुकड़ा बदलते हैं, तो आप इसे नियंत्रण के व्युत्क्रम से निपटने पर विचार कर सकते हैं। प्रतिनिधियों, इंटरफेस, या यहां तक ​​कि कच्चे फ़ंक्शन पॉइंटर्स की अवधारणा के माध्यम से कई भाषाओं में नियंत्रण का उलटा आसान बनाया जाता है।

    यह सभी मामलों में उपयोग करने के लिए उपयुक्त नहीं है, क्योंकि इस तरह से लिखे जाने पर एक कार्यक्रम का प्रवाह कठिन हो सकता है। पुस्तकालय लिखते समय तरीकों को डिजाइन करने का यह एक उपयोगी तरीका है जिसका पुन: उपयोग किया जाएगा, लेकिन इसका उपयोग आपके स्वयं के कार्यक्रम के मूल में किया जाना चाहिए जब तक कि यह वास्तव में एक कोड दोहराव की समस्या का हल नहीं करता है।


37
मुझे लगता है कि विकिपीडिया लेख बहुत भ्रामक है और इसे ठीक करने की आवश्यकता है। हंसी के लिए चर्चा पृष्ठ देखें।
devios1

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

45

लेकिन मुझे लगता है कि आपको इससे बहुत सावधान रहना होगा। यदि आप इस पैटर्न का उपयोग करेंगे, तो आप बहुत जटिल डिजाइन और यहां तक ​​कि अधिक जटिल कोड बनाएंगे।

जैसे TextEditor के साथ इस उदाहरण में: यदि आपके पास केवल एक SpellChecker है तो शायद IoC का उपयोग करना आवश्यक नहीं है? जब तक आपको इकाई परीक्षण या कुछ लिखने की आवश्यकता न हो ...

वैसे भी: उचित हो। डिजाइन पैटर्न अच्छी प्रथाएं हैं लेकिन बाइबिल का प्रचार नहीं किया जाता है। इसे हर जगह चिपका न दें।


3
आपको कैसे पता चलेगा कि आपके पास केवल एक स्पेलचेकर होगा?
ट्रेस

@ आप जान सकते हैं कि आप जिस प्रोग्राम को लिखने जा रहे हैं, वह उदाहरण के लिए कैसे इस्तेमाल किया जाएगा। फिर भी कुछ तकनीकें जैसे कि निर्भरता इंजेक्शन इतना सस्ता है कि इस तरह के मामले में उनका उपयोग नहीं करने का शायद ही कोई कारण है।
लिजैट

44

IoC / DI मुझे कॉलिंग ऑब्जेक्ट्स पर निर्भरता को बढ़ा रहा है। सुपर सिंपल है।

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


44

मान लीजिए कि आप एक वस्तु हैं। और आप एक रेस्तरां में जाते हैं:

आईओसी के बिना : आप "सेब" के लिए पूछते हैं, और जब आप अधिक पूछते हैं तो आपको हमेशा सेब परोसा जाता है।

IoC के साथ : आप "फल" के लिए पूछ सकते हैं। हर बार आपको परोसे जाने वाले अलग-अलग फल मिल सकते हैं। उदाहरण के लिए, सेब, नारंगी, या पानी तरबूज।

तो, जाहिर है, जब आप किस्में पसंद करते हैं तो IoC को प्राथमिकता दी जाती है।


26
  1. नियंत्रण का उलटा एक पैटर्न है जिसका उपयोग सिस्टम में घटकों और परतों को डिकूप करने के लिए किया जाता है। जब यह निर्माण किया जाता है तो पैटर्न एक घटक में निर्भरता को इंजेक्शन के माध्यम से कार्यान्वित किया जाता है। ये निर्भरता आमतौर पर आगे के डिकॉउपिंग के लिए इंटरफेस के रूप में और परीक्षण क्षमता का समर्थन करने के लिए प्रदान की जाती हैं। आईओसी / डीआई कंटेनर जैसे कि कैसल विंडसर, यूनिटी उपकरण (पुस्तकालय) हैं जिनका उपयोग आईओसी प्रदान करने के लिए किया जा सकता है। ये उपकरण सरल निर्भरता प्रबंधन के ऊपर और परे विस्तारित सुविधाएँ प्रदान करते हैं, जिसमें जीवनकाल, AOP / अवरोधन, नीति, आदि शामिल हैं।

  2. ए। यह निर्भरता के प्रबंधन के लिए जिम्मेदार होने से एक घटक को हटा देता है।
    ख। विभिन्न वातावरणों में निर्भरता कार्यान्वयन को स्वैप करने की क्षमता प्रदान करता है।
    सी। एक घटक को निर्भरता के मजाक के माध्यम से परीक्षण करने की अनुमति देता है।
    घ। एक आवेदन भर में संसाधनों को साझा करने के लिए एक तंत्र प्रदान करता है।

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


2
दरअसल, IoC मुख्य रूप से निर्भरता के प्रबंधन के बारे में नहीं है। कृपया martinfowler.com/articles/injection.html#InversionOfControl देखें , विशेष रूप से, यह कहते हुए भाग पर ध्यान दें कि "नियंत्रण का व्युत्क्रम बहुत सामान्य शब्द है, और इस प्रकार लोग इसे भ्रामक पाते हैं। परिणामस्वरूप विभिन्न आईओसी अधिवक्ताओं के साथ बहुत चर्चा के साथ हम। डिपेंडेंसी इंजेक्शन नाम पर बसे "।
Rogério

26

केवल पहले भाग का उत्तर देना। यह क्या है?

इनवर्टर ऑफ कंट्रोल (IoC) का अर्थ है वर्ग के पहले और बाद के उदाहरणों की निर्भरता का निर्माण करना। इस प्रकार, नियंत्रण का व्युत्क्रम कार्यक्रम के नियंत्रण के प्रवाह को प्रभावित करता है । के बजाय कॉल प्राप्त करने वाला नियंत्रित नियंत्रण के प्रवाह (जबकि निर्भरता बनाने), फोन करने वाले कार्यक्रम के नियंत्रण के प्रवाह को नियंत्रित करता है


वर्ग या वस्तु निर्माण के बारे में नहीं, इस martinfowler.com/articles/injection.html#InversionOfControl पर
राघवेन्द्र सिंह

22

मैं इस दो शब्दों के बारे में अपनी सरल समझ लिखूंगा:

For quick understanding just read examples*

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

इसके साथ ही वस्तुएं निर्भरता को बताती हैं। और वसंत इसे उपलब्ध करता है।
यह शिथिल युग्मित अनुप्रयोग विकास की ओर ले जाता है।

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

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

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it

नियंत्रण के उलटा लागू करने से, एक सॉफ्टवेयर / वस्तु उपभोक्ता को नियंत्रित या कम विकल्प होने के बजाय सॉफ्टवेयर / वस्तुओं पर अधिक नियंत्रण / विकल्प मिलते हैं।

एक डिजाइन दिशानिर्देश के रूप में नियंत्रण का उलटा निम्नलिखित उद्देश्यों को पूरा करता है:

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

विस्तृत विवरण


17

मैं NilObject से सहमत हूं , लेकिन मैं इसे जोड़ना चाहूंगा:

यदि आप अपने आप को एक पूरी विधि की नकल करते हुए पाते हैं और केवल एक छोटा सा कोड बदलते हैं, तो आप इसे नियंत्रण के उलट होने से निपटने पर विचार कर सकते हैं।

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


17

उदाहरण के लिए, कार्य # 1 ऑब्जेक्ट बनाना है। IOC अवधारणा के बिना, कार्य # 1 प्रोग्रामर द्वारा किया जाना चाहिए। लेकिन IOC अवधारणा के साथ, कार्य # 1 कंटेनर द्वारा किया जाएगा।

शॉर्ट कंट्रोल में प्रोग्रामर से कंटेनर तक उल्टा हो जाता है। तो, इसे नियंत्रण का व्युत्क्रम कहा जाता है।

मुझे यहां एक अच्छा उदाहरण मिला ।


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

17

बता दें कि हम किसी होटल में कुछ मीटिंग करते हैं।

बहुत से लोग, कई कारफ जल, कई प्लास्टिक के कप।

जब कोई पीना चाहता है, तो वह कप भरती है, पीती है और फर्श पर कप फेंकती है।

घंटे या कुछ के बाद हमारे पास प्लास्टिक के कप और पानी से ढका फर्श है।

नियंत्रण को उलटने दें।

एक ही जगह पर एक ही बैठक, लेकिन प्लास्टिक के कप के बजाय हमारे पास एक ग्लास कप (सिंगलटन) के साथ एक वेटर है

और वह हर समय मेहमानों को शराब पिलाती है

जब कोई पीना चाहता है, तो वह वेटर के गिलास से मिलता है, पीता है और वेटर को वापस लौटाता है।

स्वच्छता के सवाल को छोड़ दें, तो पीने के नियंत्रण का अंतिम रूप अधिक प्रभावी और आर्थिक है।

और यह वास्तव में वसंत (एक और IoC कंटेनर है, उदाहरण के लिए: Guice) करता है। इसके बजाय आवेदन करने के लिए नए कीवर्ड (प्लास्टिक के कप लेने), स्प्रिंग IoC कंटेनर का उपयोग करने के लिए आवश्यक वस्तु (गिलास के पानी) के एक ही उदाहरण (सिंगलटन) को लागू करने की पेशकश करते हैं।

इस तरह की बैठक के आयोजक के रूप में अपने बारे में सोचें। आपको होटल प्रशासन को संदेश देने का तरीका चाहिए

बैठक के सदस्यों को पानी के गिलास की आवश्यकता होगी, लेकिन केक के टुकड़े की नहीं।

उदाहरण:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

उपयोगी कड़ियाँ:-


एकल स्थिर प्रकार की वस्तुएं नहीं हैं?
गॉकिगॉउक्स ने

16

ऐसा लगता है कि "IoC" के बारे में सबसे भ्रामक बात यह है कि संक्षिप्त नाम और जिसके लिए वह खड़ा है, यह एक नाम का ग्लैमरस है - लगभग एक शोर नाम है।

क्या हमें वास्तव में एक नाम की आवश्यकता है जिसके द्वारा प्रक्रियात्मक और घटना संचालित प्रोग्रामिंग के बीच अंतर का वर्णन किया जा सके? ठीक है, अगर हमें ज़रूरत है, लेकिन क्या हमें एक नया "जीवन से बड़ा" नाम लेने की ज़रूरत है जो इसे हल करता है?


1
IoC! = ईवेंट संचालित। समानताएं (और कुछ मामलों में ओवरलैप होती हैं), लेकिन वे मुख्य रूप से समान प्रतिमान नहीं हैं।
द अवनी बीयर

अच्छा प्रश्न। घटना संचालित प्रोग्रामिंग निश्चित रूप से IoC है। हम ईवेंट हैंडलर लिखते हैं और उन्हें ईवेंट लूप से बुलाया जाता है। लेकिन, IoC इवेंट संचालित प्रोग्रामिंग की तुलना में अधिक सामान्य अवधारणा है .. यदि आप उपवर्ग में एक विधि को ओवरराइड करते हैं, तो यह भी एक प्रकार का आईओसी है। आप एक कोड लिखते हैं जो उपयुक्त संदर्भ (उदाहरण) का उपयोग किए जाने पर आह्वान किया जाएगा।
vi.su

15

नियंत्रण का उलटा का है जब आप किराने की दुकान पर जाते हैं और आपकी पत्नी आपको खरीदने के लिए उत्पादों की सूची देती है।

प्रोग्रामिंग शब्दों में, वह उस फ़ंक्शन getProductList()को कॉलबैक फ़ंक्शन देती है जिसे आप निष्पादित कर रहे हैं -doShopping()

यह फ़ंक्शन के उपयोगकर्ता को इसके कुछ हिस्सों को परिभाषित करने की अनुमति देता है, जिससे यह अधिक लचीला हो जाता है।


5
मेरी पत्नी आमतौर पर मेरे साथ खरीदारी करती है, लेकिन मैं इस कथन से सहमत हूं।
ha9u63ar

1
@ ha9u63ar आपकी पत्नी आपके साथ दुकानें? वैसे इसे एकत्रीकरण कहा जाता है।
जूलियन २

2
यदि वह पैसे भी देती है, तो उसे DI कहा जाता है।
सैन

1
शब्द उलटा - उल्टा - से आया, जब आपकी पत्नी कहती है कि getProductList()आपको पैसे के लिए स्रोत ढूंढना है, तो इसका मतलब है कि नियंत्रण आपके पक्ष में है। उलटा के मामले में, वह नियंत्रित करेगा, इसका मतलब है कि वह पैसे भी खरीदेगा।
सैन

13

मुझे यहां एक बहुत स्पष्ट उदाहरण मिला, जो बताता है कि 'नियंत्रण उलटा' कैसे होता है।

क्लासिक कोड (निर्भरता इंजेक्शन के बिना)

यहाँ बताया गया है कि DI का उपयोग न करने वाला कोड मोटे तौर पर कैसे काम करेगा:

  • एप्लिकेशन को फू (जैसे नियंत्रक) की आवश्यकता है, इसलिए:
  • अनुप्रयोग फू बनाता है
  • एप्लिकेशन फू को बुलाता है
    • फू को बार की जरूरत है (जैसे एक सेवा), इसलिए:
    • फू बर बनाता है
    • फू को बार कहते हैं
      • बार को बिम (एक सेवा, एक भंडार, ...) की जरूरत है, इसलिए:
      • बार बिम बनाता है
      • बार कुछ करता है

निर्भरता इंजेक्शन का उपयोग करना

यहां बताया गया है कि DI का उपयोग करने वाला कोड मोटे तौर पर कैसे काम करेगा:

  • एप्लिकेशन को फू की जरूरत है, जिसे बार की जरूरत है, जिसे बिम की जरूरत है, इसलिए:
  • आवेदन बिम बनाता है
  • आवेदन बार बनाता है और यह Bim देता है
  • अनुप्रयोग फू बनाता है और इसे बार देता है
  • एप्लिकेशन फू को बुलाता है
    • फू को बार कहते हैं
      • बार कुछ करता है

आश्रितों का नियंत्रण एक कॉल करने के लिए एक से उलटा है।

यह किन समस्याओं का समाधान करता है?

निर्भरता इंजेक्शन इंजेक्शन वर्गों के विभिन्न कार्यान्वयन के साथ स्वैप करना आसान बनाता है। इकाई परीक्षण के दौरान आप एक डमी कार्यान्वयन को इंजेक्ट कर सकते हैं, जिससे परीक्षण बहुत आसान हो जाता है।

पूर्व: मान लीजिए कि आपका एप्लिकेशन Google डिस्क में उपयोगकर्ता द्वारा अपलोड की गई फ़ाइल संग्रहीत करता है, DI के साथ आपका नियंत्रक कोड इस तरह दिखाई दे सकता है:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

जब आपकी आवश्यकताएं बदल जाती हैं, तो GoogleDrive के बजाय आपको ड्रॉपबॉक्स का उपयोग करने के लिए कहा जाता है। आपको केवल StorageServiceInterface के लिए एक ड्रॉपबॉक्स कार्यान्वयन लिखना होगा। जब तक ड्रॉपबॉक्स कार्यान्वयन StorageServiceInterface का पालन करता है, तब तक आप नियंत्रक में कोई परिवर्तन नहीं करते हैं।

परीक्षण करते समय आप डमी कार्यान्वयन के साथ StorageServiceInterface के लिए नकली बना सकते हैं जहां सभी विधियाँ शून्य (या आपके परीक्षण की आवश्यकता के अनुसार कोई पूर्वनिर्धारित मूल्य) वापस आती हैं।

इसके बजाय अगर आपके पास newइस तरह के कीवर्ड के साथ स्टोरेज ऑब्जेक्ट बनाने के लिए कंट्रोलर क्लास था :

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

जब आप ड्रॉपबॉक्स कार्यान्वयन के साथ बदलना चाहते हैं तो आपको सभी लाइनों को बदलना होगा जहां new GoogleDriveService ऑब्जेक्ट का निर्माण किया गया है और ड्रॉपबॉक्स सेवा का उपयोग करें। जब SomeController क्लास का परीक्षण करते हैं, तो कंस्ट्रक्टर हमेशा GoogleDriveService क्लास की उम्मीद करता है और इस क्लास के वास्तविक तरीकों को ट्रिगर किया जाता है।

यह कब उचित है और कब नहीं? मेरे विचार से आप DI का उपयोग तब करते हैं जब आपको लगता है कि किसी वर्ग के वैकल्पिक कार्यान्वयन हैं (या हो सकते हैं)।


यह सबसे सही उत्तर होना चाहिए क्योंकि इसका एकमात्र यह बताता है कि "नियंत्रण" कैसे उलटा है।
यारीमदम

अब तक का सबसे अच्छा विवरण
अली ०

12

एक बहुत ही सरल लिखित स्पष्टीकरण यहाँ पाया जा सकता है

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

इसे कहते हैं -

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


12

नियंत्रण का व्युत्क्रम एक सामान्य सिद्धांत है, जबकि डिपेंडेंसी इंजेक्शन इस सिद्धांत को ऑब्जेक्ट ग्राफ निर्माण के लिए एक डिज़ाइन पैटर्न के रूप में महसूस करता है (अर्थात कॉन्फ़िगरेशन नियंत्रित करता है कि ऑब्जेक्ट एक-दूसरे को कैसे संदर्भित कर रहे हैं, बजाय ऑब्जेक्ट को नियंत्रित करने के कि कैसे किसी अन्य ऑब्जेक्ट का संदर्भ प्राप्त करें)।

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

कंट्रोल ऑफ इन्वॉर्शन पर अधिक गहराई में रुचि रखने वालों के लिए डिजाइन के पैटर्न के रूप में कंट्रोल ऑफ इन्वर्टेशन की एक और पूरी तस्वीर को प्रकाशित करते हुए प्रकाशित किया गया है (OfficeFloor: सॉफ्टवेयर डिजाइन में सुधार के लिए कार्यालय पैटर्न का उपयोग करना http://doi.acm.org/10.1145/ 2739011.2739013 http://www.officefloor.net/about.html से डाउनलोड करने के लिए नि: शुल्क कॉपी उपलब्ध है ) ।

क्या पहचाना जाता है निम्नलिखित संबंध:

नियंत्रण का उलटा (तरीकों के लिए) = निर्भरता (राज्य) इंजेक्शन + निरंतरता इंजेक्शन + थ्रेड इंजेक्शन

नियंत्रण के व्युत्क्रम के लिए उपरोक्त संबंध का सारांश उपलब्ध है - http://dzone.com/articles/inversion-of-coupling-control


यह बहुत स्पष्ट उत्तर है। स्पष्टीकरण के लिए धन्यवाद।
कुनिउ त्सई

11

IoC आपके कोड और थर्ड-पार्टी कोड (लाइब्रेरी / फ्रेमवर्क) के बीच संबंध स्थापित करने के बारे में है:

  • सामान्य एस / डब्ल्यू विकास में, आप मुख्य () विधि लिखते हैं और "लाइब्रेरी" तरीके कहते हैं। आप नियंत्रण में हैं :)
  • IoC में "फ्रेमवर्क" मुख्य नियंत्रित करता है () और आपके तरीकों को कॉल करता है। फ्रेमवर्क नियंत्रण में है :(

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

अंत में आप हमेशा जीतते हैं :)


10

मुझे यह स्पष्टीकरण पसंद है: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

यह सरल शुरू होता है और साथ ही कोड उदाहरण दिखाता है।

यहां छवि विवरण दर्ज करें

उपभोक्ता, एक्स, को कुछ हासिल करने के लिए उपभोग किए गए वर्ग, वाई की आवश्यकता होती है। यह सब अच्छा और स्वाभाविक है, लेकिन क्या एक्स को वास्तव में यह जानने की जरूरत है कि यह वाई का उपयोग करता है?

क्या यह पर्याप्त नहीं है कि एक्स जानता है कि यह कुछ ऐसा उपयोग करता है जिसमें वाई के व्यवहार, तरीके, गुण आदि होते हैं, यह जानने के बिना कि वास्तव में व्यवहार को कौन लागू करता है?

एक्स द्वारा वाई में उपयोग किए जाने वाले व्यवहार की एक सार परिभाषा निकालने से, जैसा कि मैंने नीचे वर्णित किया है, और उपभोक्ता एक्स को वाई के बजाय एक उदाहरण का उपयोग करने देता है, यह वाई के बारे में बारीकियों को जानने के बिना ऐसा करना जारी रख सकता है।

यहां छवि विवरण दर्ज करें

Y के ऊपर के चित्रण में I और X, I के उदाहरण का उपयोग करता है। जबकि यह काफी संभव है कि X अभी भी Y का उपयोग करता है, दिलचस्प यह है कि X को यह पता नहीं है। यह सिर्फ इतना जानता है कि यह कुछ ऐसी चीज़ों का उपयोग करता है जो मैं लागू करता है।

अधिक जानकारी और लाभ के विवरण के लिए लेख पढ़ें:

  • X, Y पर अब निर्भर नहीं है
  • अधिक लचीला, कार्यान्वयन रनटाइम में तय किया जा सकता है
  • कोड यूनिट का अलगाव, आसान परीक्षण

...


लिंक बहुत मददगार है। रियली
थैंक्स

10

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

इनवर्टर ऑफ कंट्रोल (IoC) हॉलीवुड सिद्धांत नामक एक बहुत ही सरल सिद्धांत पर बनाया गया है । और यह कहता है कि,

हमें कॉल न करें, हम आपको कॉल करेंगे

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

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

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

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

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

तो, विचार बहुत सरल है। एक उपयोगकर्ता एप्लिकेशन बनाने के बजाय जो सब कुछ नियंत्रित करेगा, पहले आप एक पुन: प्रयोज्य ढांचा बनाएं जो सब कुछ नियंत्रित करेगा फिर अपने कस्टम कोड लिखें और समय पर उन पर अमल करने के लिए इसे फ्रेमवर्क में हुक करें।

लारवेल और ईजेबी ऐसे ढांचे के उदाहरण हैं।

संदर्भ:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control


1
सबसे उपयुक्त उत्तर मुझे यहां मिला।
blueray

8

प्रोग्रामिंग बोल रहा हूँ

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

उदाहरण के लिए, मान लें कि हमारे पास दो वर्ग हैं: डॉग और कैट । दोनों समान गुण / अवस्थाएं साझा करते हैं: आयु, आकार, वजन। इसलिए मैं DogService और CatService नामक सेवा की एक क्लास बनाने के बजाय , मैं AnimalService नामक एक एकल बना सकता हूं जो केवल कुत्ते और बिल्ली का उपयोग करने की अनुमति देता है यदि वे इंटरफ़ेस IAnimal का उपयोग करते हैं ।

हालाँकि, व्यावहारिक रूप से, यह कुछ पीछे की ओर है।

क) अधिकांश डेवलपर्स यह नहीं जानते कि इसका उपयोग कैसे किया जाए । उदाहरण के लिए, मैं ग्राहक नामक एक वर्ग बना सकता हूं और मैं स्वतः ही बना सकता हूं (आईडीई के औजारों का उपयोग करके) एक इंटरफ़ेस जिसे ICustomer कहा जाता है । इसलिए, वर्गों और इंटरफेस से भरा एक फ़ोल्डर ढूंढना दुर्लभ नहीं है, भले ही इंटरफेस का पुन: उपयोग किया जाएगा या नहीं। इसे BLOATED कहा जाता है। कुछ लोग तर्क दे सकते हैं कि "भविष्य में हम इसका उपयोग कर सकते हैं"। : - |

b) इसकी कुछ सीमाएँ हैं। उदाहरण के लिए, चलो कुत्ते और बिल्ली के मामले के बारे में बात करते हैं और मैं केवल कुत्तों के लिए एक नई सेवा (कार्यक्षमता) जोड़ना चाहता हूं। मान लीजिए कि मैं उन दिनों की संख्या की गणना करना चाहता हूं जो मुझे एक कुत्ते को प्रशिक्षित करने की आवश्यकता है ( trainDays()), बिल्ली के लिए यह बेकार है, बिल्लियों को प्रशिक्षित नहीं किया जा सकता है (मैं मजाक कर रहा हूं)।

b.1) अगर मैं trainDays()सेवा AnimalService में जोड़ता हूं तो यह बिल्लियों के साथ भी काम करता है और यह बिल्कुल भी मान्य नहीं है।

b.2) मैं एक शर्त जोड़ सकता हूं trainDays()कि यह कहां मूल्यांकन करता है कि किस वर्ग का उपयोग किया जाता है। लेकिन यह पूरी तरह से आईओसी को तोड़ देगा।

b.3) मैं नई कार्यक्षमता के लिए केवल DogService नामक सेवा का एक नया वर्ग बना सकता हूं । लेकिन, यह कोड की स्थिरता को बढ़ाएगा क्योंकि डॉग के लिए हमारे पास दो वर्गों की सेवा (समान कार्यक्षमता के साथ) होगी और यह खराब है।


फूला हुआ वर्ग / इंटरफेस के बारे में: आपको हमेशा हर एक इंटरफ़ेस का पुन: उपयोग करने की आवश्यकता नहीं है। कभी-कभी यह केवल कार्यात्मक सीमाओं को देखने के लिए एक बड़े इंटरफ़ेस को कई छोटे में विभाजित करने के लिए समझ में आता है। छोटे इंटरफेस भी अन्य कार्यान्वयन में पुन: उपयोग करने के लिए आसान हैं। इसके अलावा यह आपको एक इंटरफ़ेस पर कोड करने के लिए प्रोत्साहित करता है जहाँ भी यह समझ में आता है। "इंटरफ़ेस अलगाव" पर विचार करें। केवल इसलिए कि आप एक इंटरफ़ेस का उपयोग कर रहे हैं इसका मतलब यह नहीं है कि आप डिकॉउंडेड हैं। एक एकल वसा इंटरफ़ेस बेकार है। - बस मेरे 2 सेंट :)
एमके

7

मैंने इसके लिए बहुत से उत्तर पढ़े हैं, लेकिन अगर कोई अभी भी भ्रमित है और IoC को समझाने के लिए एक प्लस अल्ट्रा "लैमैन्स टर्म" की आवश्यकता है, तो यह है:

एक माता-पिता और बच्चे को एक दूसरे से बात करने की कल्पना करें।

बिना आईओसी:

* जनक : आप केवल तभी बोल सकते हैं जब मैं आपसे प्रश्न पूछूं और आप केवल तभी कार्य कर सकते हैं जब मैं आपको अनुमति दूंगा।

जनक : इसका मतलब है, आप मुझसे यह नहीं पूछ सकते हैं कि क्या आप खा सकते हैं, खेल सकते हैं, बाथरूम जा सकते हैं या सो भी सकते हैं अगर मैं आपसे नहीं पूछता।

जनक : क्या आप खाना चाहते हैं?

बच्चा : नहीं।

जनक : ठीक है, मैं वापस आ जाऊंगा। मेरा इंतजार करना।

बच्चा : (खेलना चाहता है लेकिन चूंकि माता-पिता से कोई सवाल नहीं है, बच्चा कुछ नहीं कर सकता)।

1 घंटे के बाद...

जनक : मैं वापस आ गया हूं। क्या आप खेलना चाहते हैं?

बच्चा : हाँ।

जनक : अनुमति दी गई।

बच्चा : (आखिरकार खेलने में सक्षम है)।

यह सरल परिदृश्य बताता है कि नियंत्रण माता-पिता पर केंद्रित है। बच्चे की स्वतंत्रता प्रतिबंधित है और माता-पिता के सवाल पर अत्यधिक निर्भर करती है। बच्चे को केवल बोलने के लिए कहा जा सकता है, और अनुमति मिलने पर केवल कार्य कर सकते हैं ।

आईओसी के साथ:

बच्चे के पास अब सवाल पूछने की क्षमता है और अभिभावक जवाब और अनुमति दे सकते हैं। बस इसका मतलब है कि नियंत्रण उल्टा है! बच्चा अब किसी भी समय प्रश्न पूछने के लिए स्वतंत्र है और यद्यपि अनुमतियों के संबंध में माता-पिता के साथ अभी भी निर्भरता है, वह प्रश्नों को बोलने / पूछने के साधनों में निर्भर नहीं है।

समझाने के तकनीकी तरीके से, यह कंसोल / शेल / सेमी / बनाम जीयूआई बातचीत के समान है। (जो मार्क हैरिसन का उत्तर नंबर 2 से ऊपर का उत्तर है)। कंसोल में, आप उस चीज़ पर निर्भर होते हैं जो आपसे पूछा जा रहा है / प्रदर्शित किया जाता है और आप पहले सवाल के जवाब के बिना अन्य मेनू और सुविधाओं पर नहीं जा सकते हैं; एक सख्त अनुक्रमिक प्रवाह के बाद। (प्रोग्रामेटिकली यह एक मेथड / फंक्शन लूप जैसा है)। हालांकि, GUI के साथ, मेनू और फीचर्स को निर्धारित किया गया है और उपयोगकर्ता जो कुछ भी इसकी आवश्यकता है उसका चयन कर सकता है और इस प्रकार अधिक नियंत्रण और कम प्रतिबंधित है। (प्रोग्रामेटिक रूप से, मेन्यू में कॉलबैक होता है जब सिलेक्ट किया जाता है और एक्शन होता है)।


6

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


5

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

नियंत्रण का व्युत्क्रम एक पैटर्न है जो डिपेंडेंसी इनवर्जन सिद्धांत (डीआईपी) को लागू करता है। डीआईपी निम्नलिखित बताता है: 1. उच्च-स्तरीय मॉड्यूल को निम्न-स्तर के मॉड्यूल पर निर्भर नहीं होना चाहिए। दोनों को सार (जैसे इंटरफेस) पर निर्भर होना चाहिए। 2. सार विवरण पर निर्भर नहीं होना चाहिए। विवरण (ठोस कार्यान्वयन) अमूर्तता पर निर्भर होना चाहिए।

नियंत्रण के व्युत्क्रम के तीन प्रकार हैं:

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

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

क्रिएशन इनवर्जन यह निम्नलिखित पैटर्न द्वारा लागू किया जा सकता है: फ़ैक्टरी पैटर्न, सर्विस लोकेटर, और डिपेंडेंसी इंजेक्शन। क्रिएशन इनवर्जन उन प्रकारों के बाहर निर्भरता को खत्म करने में मदद करता है जो इन निर्भरता ऑब्जेक्ट्स का उपयोग करने वाले प्रकार के बाहर निर्भरता ऑब्जेक्ट निर्माण की प्रक्रिया को आगे बढ़ाते हैं। निर्भरताएं खराब क्यों हैं? यहां कुछ उदाहरण दिए गए हैं: आपके कोड में एक नई वस्तु का प्रत्यक्ष निर्माण परीक्षण को कठिन बनाता है; पुनर्संयोजन (OCP सिद्धांत उल्लंघन) के बिना असेंबली में संदर्भ बदलना असंभव है; आप आसानी से डेस्कटॉप-यूआई को वेब-यूआई द्वारा प्रतिस्थापित नहीं कर सकते।


3
  1. तो नंबर 1 ऊपरनियंत्रण का व्युत्क्रम क्या है?

  2. रखरखाव वह नंबर एक चीज है जो वह मेरे लिए हल करता है। यह गारंटी देता है कि मैं इंटरफेस का उपयोग कर रहा हूं ताकि दो कक्षाएं एक-दूसरे के साथ अंतरंग न हों।

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

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

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

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

अरे हाँ, परीक्षण की चिंताएँ हैं, लेकिन वे IoC / DI के लाभों के लिए गौण हैं।

मैं निश्चित रूप से IoC / DI से प्यार कर रहा हूं।

३। यह उस समय अधिक उपयुक्त हो जाता है जब आपके पास कुछ अधिक जटिलता का मध्यम आकार का प्रोजेक्ट होता है। मैं कहूंगा कि यह उचित मिनट है जब आप दर्द महसूस करना शुरू करते हैं।



3

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

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