नियंत्रण का उलटा क्या है, और मुझे इसका उपयोग कब करना चाहिए?


64

मैं एक नई प्रणाली तैयार कर रहा हूं और मैं जानना चाहता हूं कि नियंत्रण का उलटा (आईओसी) क्या है, और इससे भी महत्वपूर्ण बात यह है कि इसका उपयोग कब किया जाए।

क्या इसे इंटरफेस के साथ लागू किया जाना है या कक्षाओं के साथ किया जा सकता है?


जवाबों:


62

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

आईओसी पैटर्न का सबसे सरल उदाहरण सी में कॉलबैक फ़ंक्शन होगा। उदाहरण के लिए आप फ़ंक्शन की घोषणा कर सकते हैं:

void Iterator(void *list, Func* f)

यह प्रत्येक आइटम के listलिए fफ़ंक्शन को लागू करने पर पुनरावृत्त करता है। Iteratorसमारोह यह नहीं पता कि प्रत्येक आइटम कार्रवाई की जाएगी, तो आप सिर्फ एक तर्क के रूप में एक समारोह प्रदान करते हैं और यह उन्हें संसाधित करता है।

जैसा कि पिछले उदाहरण से पता चलता है, IoC आपको अपने प्रोग्राम को अलग-अलग घटकों में बदलने की अनुमति देता है जो एक दूसरे के बारे में नहीं जानते हैं। का सबसे आम संस्करणों में से एक आईओसी है निर्भरता इंजेक्शन

में निर्भरता इंजेक्शन प्रत्येक घटक यह कार्य करने के लिए आवश्यक निर्भरता की एक सूची घोषित करना चाहिए। रनटाइम पर एक विशेष घटक (आम तौर पर) जिसे आईओसी कंटेनर कहा जाता है, इन घटकों के बीच बाध्यकारी कार्य करता है। यह प्रकाशित घटक निर्भरता के लिए मान प्रदान करने का प्रयास करता है।

यहाँ छद्म कोड में एक उदाहरण दिया गया है:

class Foo 
{ 
   <Require Boo>Constructor(Boo boo){ boo.DoSomething } 
}

इस उदाहरण में कक्षा Fooमें एक रचनाकार होता है जिसे Booकुछ क्रिया करने के लिए तर्क के प्रकार की आवश्यकता होती है ।

आप इसके Fooसमान कोड का उपयोग करके कक्षा का एक उदाहरण बना सकते हैं :

MyContainer.Create(typeof Foo)

MyContainer- एक आईओसी कंटेनर है , जो कंस्ट्रक्टर के Booपास जाने और उसे पास करने का ध्यान रखता है Foo

संक्षेप में, आईओसी आपको अपने कार्यक्रम को अलग-अलग हिस्सों में डिकॉप करने देता है। यह अच्छा है क्योंकि:

  • घटकों को आसानी से स्वतंत्र रूप से परीक्षण किया जा सकता है।
  • कार्यक्रम की जटिलता को कम किया जा सकता है।
  • आप घटकों को किसी अन्य कार्यान्वयन पर स्विच कर सकते हैं।

हालांकि कुछ मामलों में, आईओसी कोड को समझने में कठिन बना सकता है।

यदि आप आईओसी के वास्तविक-विश्व उपयोग का अच्छा उदाहरण देखना चाहते हैं , तो Mircosoft Composite UI Application Block और CompositeWPF पर एक नज़र डालें

मुझे आशा है कि मेरी व्याख्या आपकी मदद करती है।

सादर,
अकु


1
पांच साल बाद, लेकिन फिर भी .... यह एक उत्कृष्ट विवरण था। धन्यवाद।
निक हॉजेस

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

तो, एक कोड जो अपनी सभी निर्भरता के लिए इंटरफ़ेस आधारित समाधान का उपयोग करता है वह भी IoC डिज़ाइन पर आधारित है?
निकेल

18

चूँकि मैंने हाल ही में खुद को इसमें खोदा, और सभी बुकमार्क रखे, निम्नलिखित में मुझे IOC / DI के बारे में जानने के लिए अमूल्य पाया गया।

IOC / DI पर मार्टिन फाउलर्स का मूल लेख

कुछ अवधारणाओं को पहले जानने के लिए

IOC / DI ट्यूटोरियल का एक उत्कृष्ट संग्रह

मैनिंग प्रेस से आईओसी / डीआई पर बुक करें

अपने खुद के आईओसी बनाने के तरीके और स्रोत का स्पष्टीकरण - क्योंकि एक अवधारणा को समझने के लिए स्रोत कोड पढ़ना हमेशा सबसे अच्छा तरीका है।


4

हे JMS, मूल रूप से IoC / DI आपको यह निर्धारित करने की अनुमति देगा कि आप किस कार्यान्वयन का उपयोग एक बार कर रहे हैं, और अपने कंटेनर की एक स्थिर प्रति रखें जिसे आप संदर्भ देना चाहते हैं।

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

IE, कहते हैं कि आपके पास एक स्ट्रीम पढ़ने के लिए एक इंटरफ़ेस था और आपके पास XMLStreamReader और SQLStreamReader कार्यान्वयन था। फिर आप इंटरफ़ेस के संदर्भ को अपनी विधियों में पास कर सकते हैं और फिर अपने IoC कंटेनर में यह बता सकते हैं कि किसका उपयोग करना है।

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

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


3

मान लीजिए कि आपके सिस्टम में कोई व्यवसाय वैध है या नहीं, इसकी जाँच के लिए आपके पास एक सत्यापनकर्ता है। आपके "BusinessValidator" में एक प्रकार का AddressValidator हो सकता है, जो व्यवसाय के पते वाले हिस्से की पुष्टि करता है। यदि आप बाहर के कोड (यानी एड्रेसवीडिएटर कोड) को निष्पादित किए बिना BusinessValidator का परीक्षण करना चाहते हैं, तो यदि आपने अपने ढांचे में कुछ प्रकार के IoC / DI का उपयोग किया है, तो आप एक नकली पते में "इंजेक्शन" को आसानी से लगा सकते हैं और परीक्षण के बारे में चिंता करने की ज़रूरत नहीं है। परीक्षण के तहत कक्षा के दायरे से बाहर कोड।

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