मैं एक नई प्रणाली तैयार कर रहा हूं और मैं जानना चाहता हूं कि नियंत्रण का उलटा (आईओसी) क्या है, और इससे भी महत्वपूर्ण बात यह है कि इसका उपयोग कब किया जाए।
क्या इसे इंटरफेस के साथ लागू किया जाना है या कक्षाओं के साथ किया जा सकता है?
मैं एक नई प्रणाली तैयार कर रहा हूं और मैं जानना चाहता हूं कि नियंत्रण का उलटा (आईओसी) क्या है, और इससे भी महत्वपूर्ण बात यह है कि इसका उपयोग कब किया जाए।
क्या इसे इंटरफेस के साथ लागू किया जाना है या कक्षाओं के साथ किया जा सकता है?
जवाबों:
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 पर एक नज़र डालें
मुझे आशा है कि मेरी व्याख्या आपकी मदद करती है।
सादर,
अकु
चूँकि मैंने हाल ही में खुद को इसमें खोदा, और सभी बुकमार्क रखे, निम्नलिखित में मुझे IOC / DI के बारे में जानने के लिए अमूल्य पाया गया।
IOC / DI पर मार्टिन फाउलर्स का मूल लेख
कुछ अवधारणाओं को पहले जानने के लिए
IOC / DI ट्यूटोरियल का एक उत्कृष्ट संग्रह
मैनिंग प्रेस से आईओसी / डीआई पर बुक करें
अपने खुद के आईओसी बनाने के तरीके और स्रोत का स्पष्टीकरण - क्योंकि एक अवधारणा को समझने के लिए स्रोत कोड पढ़ना हमेशा सबसे अच्छा तरीका है।
हे JMS, मूल रूप से IoC / DI आपको यह निर्धारित करने की अनुमति देगा कि आप किस कार्यान्वयन का उपयोग एक बार कर रहे हैं, और अपने कंटेनर की एक स्थिर प्रति रखें जिसे आप संदर्भ देना चाहते हैं।
विकिपीडिया शायद आपकी मदद करेगा, लेकिन मैं आपके दूसरे भाग को संदर्भित करना चाहता था - हाँ, वर्गों के लिए निर्भरता इंजेक्शन किया जा सकता है (यानी, हर बार इस वर्ग प्रकार को एक विधि को पारित करने की आवश्यकता होती है, इस वर्ग का उपयोग करें), लेकिन यह बेहतर है इंटरफेस का उपयोग करें, क्योंकि इस तरह से आप किसी प्रदाता, रिपॉजिटरी आदि के किस संस्करण को बदल सकते हैं, जिसे आप अपने सेटअप में फिर से संदर्भित करके उपयोग कर रहे हैं।
IE, कहते हैं कि आपके पास एक स्ट्रीम पढ़ने के लिए एक इंटरफ़ेस था और आपके पास XMLStreamReader और SQLStreamReader कार्यान्वयन था। फिर आप इंटरफ़ेस के संदर्भ को अपनी विधियों में पास कर सकते हैं और फिर अपने IoC कंटेनर में यह बता सकते हैं कि किसका उपयोग करना है।
तो, आपके पास सार्वजनिक सूची रीडपाइन्स (IStreamReader रीडर) हो सकती है और आपके आईओसी कंटेनर के लिए आपके सेटअप में इसे बताएं, हर बार जब आप उम्मीद करते हैं कि IStreamReader SQLStreamReader का उपयोग करें।
फिर यदि आप बाद में अपना विचार बदलते हैं, तो आपको इसे केवल एक जगह (अपने कंटेनर का सेटअप) में बदलने की आवश्यकता है और इससे कोई फर्क नहीं पड़ेगा कि IStreamReader के लिए कितने तरीके पूछते हैं, यह हमेशा आपके कंटेनर को बताए गए डिफ़ॉल्ट को प्राप्त करेगा। परोसना।
मान लीजिए कि आपके सिस्टम में कोई व्यवसाय वैध है या नहीं, इसकी जाँच के लिए आपके पास एक सत्यापनकर्ता है। आपके "BusinessValidator" में एक प्रकार का AddressValidator हो सकता है, जो व्यवसाय के पते वाले हिस्से की पुष्टि करता है। यदि आप बाहर के कोड (यानी एड्रेसवीडिएटर कोड) को निष्पादित किए बिना BusinessValidator का परीक्षण करना चाहते हैं, तो यदि आपने अपने ढांचे में कुछ प्रकार के IoC / DI का उपयोग किया है, तो आप एक नकली पते में "इंजेक्शन" को आसानी से लगा सकते हैं और परीक्षण के बारे में चिंता करने की ज़रूरत नहीं है। परीक्षण के तहत कक्षा के दायरे से बाहर कोड।