नियंत्रण के व्युत्क्रम को इस तरह क्यों नामित किया गया है?


98

मेरे द्वारा देखी गई परिभाषाओं में व्युत्क्रम नियंत्रण को परिभाषित करने के लिए शब्दों का उपयोग invertया controlबिल्कुल भी उपयोग नहीं किया जाता है।

परिभाषाएं

विकिपीडिया

व्युत्क्रम नियंत्रण (IoC) एक प्रोग्रामिंग तकनीक है, जिसे ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के संदर्भ में यहां व्यक्त किया गया है, जिसमें ऑब्जेक्ट युग्मन एक असेंबलर ऑब्जेक्ट द्वारा रन टाइम पर बाध्य होता है और आमतौर पर स्थिर विश्लेषण का उपयोग करके संकलन समय पर ज्ञात नहीं होता है। ~ http://en.wikipedia.org/wiki/Inversion_of_control

मार्टिन फाउलर

नियंत्रण को उलटना जावा समुदाय में एक सामान्य पैटर्न है जो तार के हल्के कंटेनरों की मदद करता है या अलग-अलग परियोजनाओं से घटकों को एक सामंजस्यपूर्ण अनुप्रयोग में इकट्ठा करता है। ~ http://www.martinfowler.com/articles/injection.html पर आधारित (प्रतिरूपित)


तो Inversion of Control को Inversion of Control क्यों कहा जाता है? क्या नियंत्रण उलटा हो रहा है और किसके द्वारा? क्या शब्दावली का उपयोग करके नियंत्रण के व्युत्क्रम को परिभाषित करने का एक तरीका है: उलटा और नियंत्रण ?


22
जो व्यक्ति इसे स्पष्ट अंग्रेजी में
रॉबर्ट हार्वे

2
यदि कोई परिभाषा यह शब्द परिभाषित करता है, तो यह एक शब्दकोश की विफलता होगी। यहां भी ऐसा ही तर्क लागू होता है।
इजाकाता


2
@ इज़्काटा, वाक्यांशों को वाक्यांश की अपनी शर्तों या पर्यायवाची शब्दों के रूप में परिभाषित करना बहुत आम है। अर्थात: प्रकृति परिभाषा का बल अपनी परिभाषा में शब्द बल और प्रकृति का उपयोग करता है या सेवा परिभाषा की शर्तें नियमों और सेवा शब्दों का उपयोग करती है जहां नियम शब्दों का पर्याय हैं।
कोरी हिंटन

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

जवाबों:


67

मान लें कि आपके पास "रिपॉजिटरी" वर्ग का कुछ प्रकार है, और यह कि रिपॉजिटरी डेटा स्रोत से आपको डेटा सौंपने के लिए जिम्मेदार है।

रिपॉजिटरी खुद से डेटा स्रोत के लिए एक कनेक्शन स्थापित कर सकती है। लेकिन क्या होगा अगर यह रिपॉजिटरी के कंस्ट्रक्टर के माध्यम से आपको डेटा स्रोत से जुड़ने की अनुमति देता है?

कॉलर को कनेक्शन प्रदान करने की अनुमति देकर, आपने रिपॉजिटरी वर्ग से डेटा स्रोत कनेक्शन की निर्भरता को कम कर दिया है, किसी भी डेटा स्रोत को रिपॉजिटरी के साथ काम करने की अनुमति देता है, न कि केवल उस रिपॉजिटरी को निर्दिष्ट करता है।

आपके पास नियंत्रण औंधा फोन करने वाले के लिए भंडार वर्ग से संबंध बनाने की जिम्मेदारी सौंपने से।

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


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

1
@ mustang2009cobra: धन्यवाद एक उदाहरण है कि मैं क्या था, उदाहरणों की एक व्यापक सूची नहीं है जहां यह होता है, और "नियंत्रण का व्युत्क्रम" शब्द डीआई के साथ सबसे अधिक निकटता से जुड़ा हुआ है, संदेश गुजर या अन्य समान अवधारणाओं से नहीं।
रॉबर्ट हार्वे

सच है, निर्भरता इंजेक्शन आईओसी का सबसे प्रचलित उदाहरण है, इसलिए डीआई का एक उदाहरण सबसे अधिक समझ में आता है। शायद आपके उत्तर में एक छोटा सा परिवर्तन यह निर्दिष्ट करता है कि यह एक DI उदाहरण है, जो सबसे प्रमुख प्रकार का IoC है?
dsw88

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

79

मुझे नहीं लगता कि मार्टिन फाउलर की तुलना में कोई भी इसे बेहतर तरीके से समझा सकता है, इससे आगे के लेख से जुड़ा हुआ है

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

जैसा कि वह ऊपर के पैराग्राफ में बताते हैं, यह काफी समान नहीं है, क्योंकि शब्द "नियंत्रण का व्युत्क्रम" उत्पन्न हुआ है।

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

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

यही कारण है कि वह नियंत्रण के व्युत्क्रम के इस विशिष्ट कार्यान्वयन को कवर करने के लिए "डिपेंडेंसी इंजेक्शन" शब्द को गढ़ा।

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

थोड़ा स्पष्ट करने के लिए: नियंत्रण के व्युत्क्रम का मतलब कुछ भी है जो क्लासिक प्रक्रियात्मक डिजाइन से एक कार्यक्रम के नियंत्रण संरचना को निष्क्रिय करता है।

योर के दिनों में, इसका एक प्रमुख उदाहरण सीधे UI को उत्पन्न करने के लिए आपके कोड को छोड़ने के बजाय, UI और आपके कोड के बीच एक फ्रेमवर्क संचार को संचालित करने दे रहा था।

हाल के दिनों में (जब इस तरह के ढांचे बहुत ज्यादा हावी हो गए थे, इसलिए सवाल अब प्रासंगिक नहीं था), एक उदाहरण वस्तुओं की तात्कालिकता पर नियंत्रण का अयोग्य था।

फाउलर, और अन्य लोगों ने निर्णय लिया कि नियंत्रण के व्युत्क्रम शब्द ने कई तकनीकों को कवर किया है और हमें वस्तुओं की तात्कालिकता (डिपेंडेंसी इंजेक्शन) के विशिष्ट उदाहरण के लिए एक नए शब्द की आवश्यकता है लेकिन, जब तक समझौता नहीं किया गया था, तब तक वाक्यांश "आईओसीएयरर" “उतार दिया था।

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


4
मैं आम तौर पर इतना वोट नहीं करता, लेकिन यह एक शानदार जवाब है। 1 वोट पर्याप्त नहीं होगा :(
RJD22

1
यह उत्तर वास्तव में IoC और DI भ्रम के सभी प्रश्नों का उत्तर देता है।
अली उमैर

32

यहां "नियमित" नियंत्रण प्रवाह कार्यक्रमों का आमतौर पर पालन किया जाता है:

  • क्रमवार चलाएं
  • आप कार्यक्रम के नियंत्रण प्रवाह पर नियंत्रण बनाए रखते हैं

नियंत्रण का उलटा "inverts" जो प्रवाह को नियंत्रित करता है, जिसका अर्थ है कि यह उसके सिर पर फ़्लिप करता है:

  • आपका प्रोग्राम अब प्रवाह को नियंत्रित नहीं करता है। आदेशों को कॉल करने के बजाय जैसे ही आप फिट होते हैं, आप किसी और को कॉल करने की प्रतीक्षा करते हैं

वह अंतिम पंक्ति महत्वपूर्ण है। जब आप ऐसा महसूस करते हैं, तो किसी और को फोन करने के बजाय, जब आप ऐसा महसूस करते हैं, तो कोई और आपको बुलाता है।

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


19
[सोवियत में मज़ाक में "सम्मिलित करें"]
रॉबर्ट हार्वे

2
एक तरफ हटना, मुझे लगता है कि आप जो वर्णन कर रहे हैं वह संदेश पारित करने की तरह है, जो दशकों से ओओ का एक प्रमुख केंद्र रहा है।
रॉबर्ट हार्वे

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

7
@ जिमीहॉफ: मैं असहमत हूं। यह आपके उत्तर या रॉबर्ट के नियंत्रण के व्युत्क्रम की उतनी ही सही परिभाषा है, जो वास्तव में भ्रम है कि फाउलर वर्णन करता है कि डिपेंडेंसी इंजेक्शन (जो आप दोनों IoC कह रहे हैं) को गढ़ा जाता है।
पीडीआर

5
मैं @pdr के इस कथन से सहमत हूं: "नियंत्रण के व्युत्क्रम का अर्थ है, जो किसी भी प्रक्रिया के नियंत्रण संरचना को क्लासिक प्रक्रियात्मक डिजाइन से प्रभावित करता है।" यही मैं वर्णन कर रहा हूं, और यह नियंत्रण का सामान्य उलटा है। निर्भरता इंजेक्शन आईओसी का एक प्रकार है, लेकिन यह एकमात्र ऐसी चीज नहीं है जो आईओसी का अभ्यास करती है
dsw88

13

यह निर्भरता के तात्कालिकता को नियंत्रित करने वाले के बारे में है।

परंपरागत रूप से, जब एक वर्ग / विधि को किसी अन्य वर्ग (निर्भरता) का उपयोग करने की आवश्यकता होती है, तो इसे सीधे वर्ग / विधि द्वारा तत्काल किया जाता है। यह उसकी निर्भरता को नियंत्रित करता है।

उलटा नियंत्रण (IoC) के साथ, कॉलर निर्भरता में पारित हो गया, इसलिए यह निर्भरता को तुरंत समाप्त कर देता है। कॉलर निर्भरता को नियंत्रित करता है।

जहां एक निर्भरता को त्वरित रूप से नियंत्रित किया जाता है, उसका नियंत्रण "नीचे" में होने के बजाय, जहां कोड की आवश्यकता होती है, उसे तुरंत "शीर्ष" पर लाया जाता है, जहां कोड की आवश्यकता होती है।


1
सादा अंग्रेजी नहीं। असमर्थ रहे हैं।
रॉबर्ट हार्वे

2
@RobertHarvey - सादा कितना सादा है?
ऊद

4
@RobertHarvey हुह? यह मुझे काफी स्पष्ट लगता है ... क्या सादा नहीं है? शब्द "तात्कालिकता" या "निर्भरता"?
जिमी हॉफ

@ जिमीहॉफ: मेरा जवाब देखें, जो एक विशिष्ट उदाहरण प्रदान करता है। आईओसी उन परेशानियों में से एक है जिसका उपयोग हर कोई करता है लेकिन कोई भी समझाता है; लोग ऐसे कार्यक्रमों में IoC कंटेनरों का उपयोग करते हैं जिनकी उन्हें आवश्यकता नहीं है क्योंकि वे गलत समझते हैं। उस ने कहा, मुझे लगता है कि इस जवाब में निनजा के कुछ संपादन थे। :)
रॉबर्ट हार्वे

यह और ऊपर @ dsw88 पोस्ट मेरे लिए काफी स्पष्ट हैं। देखो, अगर मैंने आईओसी के बारे में कभी नहीं सुना, तो मैं सहजता से सोचता हूं "ओह, जहां एक तरफ से दूसरी तरफ कुछ झपटने वालों को काबू में किया जाता है"। इस पर अच्छा काम!
ओलिवर विलियम्स

2

आमतौर पर उच्च स्तरीय कोड कॉल (यानी, नियंत्रण) निचले स्तर का कोड होता है। मुख्य () कॉल फ़ंक्शन (), फ़ंक्शन () कॉल लाइब्रेरीफंक्शन ()।

यह उलटा हो सकता है, इसलिए निचले स्तर के लाइब्रेरी फ़ंक्शन निचले स्तर के फ़ंक्शन को कॉल करते हैं।

तुम ऐसा क्यों करोगे? Middleware। कभी-कभी आप शीर्ष स्तर और निचले स्तर को नियंत्रित करना चाहते हैं, लेकिन बीच में बहुत काम है जो आप अभी नहीं करना चाहते हैं। C stdlib में क्विकॉर्ट के कार्यान्वयन को लें । आप शीर्ष स्तर पर क्विकॉर्ट कहते हैं। आप अपने स्वयं के फ़ंक्शन के लिए qsort () एक फ़ंक्शन पॉइंटर को सौंपते हैं, जो भी आपको लगता है कि एक तुलनित्र को लागू करता है। जब qsort () कहा जाता है, तो यह तुलनित्र फ़ंक्शन को कॉल करता है। qsort () आपके उच्च स्तरीय फ़ंक्शन को नियंत्रित / कॉल / ड्राइविंग कर रहा है।


1

यहाँ एक सरल अवलोकन है:

  1. नियंत्रण से तात्पर्य है कि कार्यक्रम आगे क्या करता है
  2. शीर्ष स्तर पर, आमतौर पर दो चीजें होती हैं जो नियंत्रण को नियंत्रित करती हैं: एप्लिकेशन स्वयं और उपयोगकर्ता

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

यदि हम उस स्विच को इधर-उधर करते हैं और उपयोगकर्ता को प्राथमिक नियंत्रण देते हैं, तो हमने नियंत्रण को उल्टा कर दिया है। इसका मतलब यह है कि उपयोगकर्ता को आवेदन करने के लिए इसके चारों ओर इंतजार करने के बजाय यह करने के लिए कुछ करने के लिए एप्लिकेशन उपयोगकर्ता के इंतजार में बैठता है। GUI इसका एक बेहतरीन उदाहरण है और एक इवेंट लूप के साथ बहुत कुछ उल्टा नियंत्रण है।

ध्यान दें कि मेरा उदाहरण शीर्ष स्तर पर है और यह कि नियंत्रण के व्युत्क्रम की यह अवधारणा अनुप्रयोग के भीतर नियंत्रण की विभिन्न परतों (यानी निर्भरता इंजेक्शन) के लिए अमूर्त हो सकती है। यह क्यों हो सकता है कि सीधे उत्तर प्राप्त करना इतना कठिन है।


0

आइए हम इसे दो उदाहरणों के माध्यम से समझने का प्रयास करें।

उदाहरण 1

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

उदाहरण 2

CustomerProcessorनीचे वर्ग पर विचार करें:

class CustomerProcessor
{
    SqlCustRepo custRepo = new SqlCustRepo(); 
    private void processCustomers()
    {
            Customers[] custs = custRepo.getAllCusts();
    }
}

अगर मैं processCustomer()किसी भी कार्यान्वयन के लिए स्वतंत्र होना चाहता हूं getAllCusts(), न कि केवल एक के द्वारा प्रदान की गई SqlCustRepo, मुझे लाइन से छुटकारा पाने की आवश्यकता होगी: SqlCustRepo custRepo = new SqlCustRepo()और इसे कुछ और सामान्य के साथ प्रतिस्थापित करें, विभिन्न प्रकार के कार्यान्वयन को स्वीकार करने में सक्षम, जैसे कि processCustomers()बस के लिए काम करेंगे कोई भी कार्यान्वयन। उपरोक्त कोड ( SqlCustRepoमुख्य प्रोग्राम लॉजिक द्वारा आवश्यक वर्ग की तात्कालिकता ) एक पारंपरिक तरीका है और इसे processCustomers()लागू करने से डिकॉउलिंग के इस लक्ष्य को प्राप्त नहीं होता है getAllCusts()। नियंत्रण के उलट में, कंटेनर आवश्यक कार्यान्वयन वर्ग को बताता है (जैसा कि xml विन्यास के अनुसार निर्दिष्ट किया गया है), इसे मुख्य कार्यक्रम तर्क में इंजेक्ट करता है जो निर्दिष्ट हुक के अनुसार बाध्य हो जाता है ( स्प्रिंग फ्रेमवर्क में @Autowiredएनोटेशन या getBean()विधि के अनुसार)।

आइए देखें कि यह कैसे किया जा सकता है। नीचे दिए गए कोड पर विचार करें।

config.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="custRepo" class="JsonCustRepo" />
</beans>

CustRepo.java

interface ICustRepo 
{ ... }

JsonCustRepo.java

class JsonCustRepo implements CustRepo
{ ... }

App.java

class App
{
    public static void main(String[] args) 
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("Config.xml");
        ICustRepo custRepo = (JsonCustRepo) context.getBean("custRepo");
    }
}

हम भी कर सकते हैं

class GraphCustRepo implements ICustRepo { ... }   

तथा

<bean id="custRepo" class="GraphCustRepo">

और हमें App.java को बदलने की आवश्यकता नहीं होगी।

कंटेनर के ऊपर (जो कि स्प्रिंग फ्रेमवर्क है) xml फ़ाइल को स्कैन करने, विशिष्ट प्रकार के बीन को तुरंत निकालने और उपयोगकर्ता प्रोग्राम में इंजेक्ट करने की जिम्मेदारी है। उपयोगकर्ता प्रोग्राम का कोई नियंत्रण नहीं है कि किस वर्ग को त्वरित किया जाए।

पुनश्च: IoC सामान्य अवधारणा है और कई मायनों में हासिल की है। उपरोक्त उदाहरण निर्भरता इंजेक्शन द्वारा इसे प्राप्त करते हैं।

संदर्भ: मार्टिन फाउलर का लेख

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