जब पहली बार सामना किया जाता है तो इनवर्टर ऑफ कंट्रोल (IoC) काफी भ्रमित हो सकता है।
- यह क्या है?
- यह किस समस्या का हल है?
- कब उपयोग करना उचित है और कब नहीं?
जब पहली बार सामना किया जाता है तो इनवर्टर ऑफ कंट्रोल (IoC) काफी भ्रमित हो सकता है।
जवाबों:
व्युत्क्रम नियंत्रण (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
हस्ताक्षर में इंजेक्ट कर रहे हैं ।
नियंत्रण का उलटा वह है जो आपको तब मिलता है जब आपका प्रोग्राम कॉलबैक करता है, जैसे कि एक गिनी कार्यक्रम।
उदाहरण के लिए, एक पुराने स्कूल मेनू में, आपके पास हो सकता है:
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
तो अब नियंत्रण उल्टा है ... कंप्यूटर एक निश्चित क्रम में उपयोगकर्ता इनपुट को स्वीकार करने के बजाय, उपयोगकर्ता उस आदेश को नियंत्रित करता है जिसमें डेटा दर्ज किया जाता है, और जब डेटा डेटाबेस में सहेजा जाता है।
मूल रूप से, ईवेंट लूप, कॉलबैक या ट्रिगर्स निष्पादित करने वाली कोई भी चीज़ इस श्रेणी में आती है।
नियंत्रण का व्युत्क्रम क्या है?
यदि आप इन सरल दो चरणों का पालन करते हैं, तो आपने नियंत्रण को उलटा कर दिया है:
आपके द्वारा उपयोग की जा रही तकनीक / भाषा के आधार पर इनमें से प्रत्येक चरण के लिए कई तकनीकें संभव हैं।
-
उलट नियंत्रण के उलट (आईओसी) के हिस्से के भ्रामक बात है, क्योंकि व्युत्क्रम सापेक्ष शब्द है। IoC को समझने का सबसे अच्छा तरीका उस शब्द को भूल जाना है!
-
उदाहरण
what-to-do
औरwhen-to-do
नियंत्रणों का विलयन चिंताओं को अलग करने के बारे में है।
बिना IoC : आपके पास एक लैपटॉप कंप्यूटर है और आप गलती से स्क्रीन तोड़ देते हैं। और धन्नो, तुम वही मॉडल लैपटॉप स्क्रीन बाजार में कहीं नहीं है। तो तुम फंस गए।
IoC के साथ : आपके पास एक डेस्कटॉप कंप्यूटर है और आप गलती से स्क्रीन तोड़ देते हैं। आप पाते हैं कि आप बाजार से लगभग किसी भी डेस्कटॉप मॉनिटर को ले सकते हैं, और यह आपके डेस्कटॉप के साथ अच्छी तरह से काम करता है।
आपका डेस्कटॉप इस मामले में IoC को सफलतापूर्वक लागू करता है। यह विभिन्न प्रकार के मॉनिटर को स्वीकार करता है, जबकि लैपटॉप नहीं करता है, इसे ठीक करने के लिए एक विशिष्ट स्क्रीन की आवश्यकता होती है।
उलटा नियंत्रण, (या IoC), स्वतंत्रता प्राप्त करने के बारे में है (आप शादी कर लेते हैं, आपने स्वतंत्रता खो दी है और आपको नियंत्रित किया जा रहा है। आपने तलाक दिया है, आपने बस उलटा नियंत्रण लागू किया है। यही हम कहते हैं, "डिकम्पोज्ड"। अच्छा कंप्यूटर) कुछ बहुत करीबी संबंधों को हतोत्साहित करता है।) अधिक लचीलापन (आपके कार्यालय में रसोई केवल स्वच्छ नल का पानी प्रदान करता है, जब आप पीना चाहते हैं तो यह आपकी एकमात्र पसंद है। आपके बॉस ने एक नई कॉफी मशीन की स्थापना करके इन्वर्ज़न ऑफ कंट्रोल लागू किया है। अब आपको मिलता है। नल के पानी या कॉफी को चुनने का लचीलापन।) और कम निर्भरता(आपके साथी के पास एक नौकरी है, आपके पास नौकरी नहीं है, आप वित्तीय रूप से अपने साथी पर निर्भर हैं, इसलिए आप नियंत्रित हैं। आपको एक नौकरी मिल जाती है, आपने नियंत्रण को उलटा लागू कर दिया है। अच्छी कंप्यूटर प्रणाली निर्भरता को प्रोत्साहित करती है।)
जब आप डेस्कटॉप कंप्यूटर का उपयोग करते हैं, तो आपने स्लाव (या कहें, नियंत्रित) किया है। आपको स्क्रीन के सामने बैठकर इसे देखना होगा। टाइप करने के लिए कीबोर्ड का उपयोग करना और नेविगेट करने के लिए माउस का उपयोग करना। और एक बुरी तरह से लिखा गया सॉफ्टवेयर आपको और भी अधिक गुलाम बना सकता है। यदि आप अपने डेस्कटॉप को लैपटॉप के साथ बदलते हैं, तो आप कुछ हद तक उल्टे नियंत्रण का उपयोग करते हैं। आप इसे आसानी से ले जा सकते हैं और घूम सकते हैं। इसलिए अब आप अपने कंप्यूटर को नियंत्रित करने के बजाय, जहाँ आप अपने कंप्यूटर के साथ हैं, को नियंत्रित कर सकते हैं।
नियंत्रण के उलटा लागू करने से, एक सॉफ्टवेयर / वस्तु उपभोक्ता को नियंत्रित या कम विकल्प होने के बजाय सॉफ्टवेयर / वस्तुओं पर अधिक नियंत्रण / विकल्प मिलते हैं।
मन में उपरोक्त विचारों के साथ। हम अभी भी आईओसी का एक महत्वपूर्ण हिस्सा याद करते हैं। IoC के परिदृश्य में, सॉफ्टवेयर / ऑब्जेक्ट उपभोक्ता एक परिष्कृत ढांचा है। इसका मतलब है कि आपके द्वारा बनाए गए कोड को खुद नहीं कहा जाता है। अब आइए बताते हैं कि वेब एप्लिकेशन के लिए यह तरीका बेहतर क्यों है।
मान लीजिए कि आपका कोड श्रमिकों का एक समूह है। उन्हें कार बनाने की जरूरत है। इन श्रमिकों को कार बनाने के लिए जगह और उपकरण (एक सॉफ्टवेयर ढांचा) की आवश्यकता होती है। एक पारंपरिक सॉफ्टवेयर फ्रेमवर्क कई उपकरणों के साथ गेराज की तरह होगा। इसलिए श्रमिकों को स्वयं एक योजना बनाने और कार बनाने के लिए उपकरणों का उपयोग करने की आवश्यकता है। एक कार बनाना एक आसान व्यवसाय नहीं है, श्रमिकों के लिए योजना बनाना और ठीक से सहयोग करना वास्तव में कठिन होगा। एक आधुनिकसॉफ्टवेयर ढांचा एक आधुनिक कार कारखाने की तरह होगा जिसमें सभी सुविधाएं और प्रबंधक होंगे। श्रमिकों को कोई योजना बनाने की ज़रूरत नहीं है, प्रबंधकों (ढांचे का हिस्सा, वे सबसे चतुर लोग हैं और सबसे परिष्कृत योजना बनाई गई है) समन्वय में मदद करेंगे ताकि श्रमिकों को पता चले कि उन्हें कब अपना काम करना है (फ्रेमवर्क आपके कोड को कॉल करता है)। मजदूरों को बस इतना लचीला होना चाहिए कि प्रबंधक उन्हें (डिपेंडेंसी इंजेक्शन का उपयोग करके) किसी भी उपकरण का उपयोग करें।
यद्यपि श्रमिक प्रबंधकों को शीर्ष स्तर पर परियोजना के प्रबंधन का नियंत्रण देते हैं (ढांचा)। लेकिन कुछ पेशेवरों की मदद करना अच्छा है। यह सही मायने में आईओसी की अवधारणा है।
MVC आर्किटेक्चर के साथ आधुनिक वेब एप्लिकेशन URL रूटिंग करने के लिए फ्रेमवर्क पर निर्भर करता है और कॉल करने के लिए फ्रेमवर्क के लिए नियंत्रकों को रखता है।
निर्भरता इंजेक्शन और नियंत्रण के व्युत्क्रम संबंधित हैं। डिपेंडेंसी इंजेक्शन माइक्रो लेवल पर है और कंट्रोल ऑफ इनवर्सन मैक्रो लेवल पर है। खाना खत्म करने के लिए आपको (खाने को लागू करने के लिए) डीआईई को लागू करना होगा।
नियंत्रण के व्युत्क्रम का उपयोग करने से पहले आपको इस तथ्य से अच्छी तरह से अवगत होना चाहिए कि इसके नियम और विपक्ष हैं और आपको पता होना चाहिए कि यदि आप ऐसा करते हैं तो आप इसका उपयोग क्यों करते हैं।
पेशेवरों:
विपक्ष:
व्यक्तिगत रूप से मैं आईओसी के मजबूत बिंदुओं को देखता हूं और मैं वास्तव में उन्हें पसंद करता हूं लेकिन मैं जब भी संभव हो तो आईओसी से बचता हूं क्योंकि यह आपके सॉफ़्टवेयर को उन कक्षाओं के संग्रह में बदल देता है जो अब "वास्तविक" कार्यक्रम नहीं बनाते हैं, लेकिन बस कुछ ऐसा करना चाहिए जिसे एक साथ रखना है XML कॉन्फ़िगरेशन या एनोटेशन मेटाडेटा और इसके बिना (और गिर जाएगा) इसके बिना।
विकिपीडिया लेख । मेरे लिए, नियंत्रण का व्युत्क्रम आपके क्रमिक रूप से लिखे गए कोड को बदलकर प्रतिनिधिमंडल संरचना में बदल रहा है। आपके कार्यक्रम के बजाय स्पष्ट रूप से सब कुछ नियंत्रित करने के लिए, आपका कार्यक्रम कुछ कार्यों के साथ एक वर्ग या पुस्तकालय स्थापित करता है, जब कुछ चीजें होती हैं।
यह कोड दोहराव को हल करता है। उदाहरण के लिए, पुराने दिनों में आप स्वयं अपने ईवेंट लूप को लिखेंगे, नई घटनाओं के लिए सिस्टम लाइब्रेरी को पोलिंग करेंगे। आजकल, अधिकांश आधुनिक एपीआई आप सिस्टम लाइब्रेरी को बताते हैं कि आप किन घटनाओं में रुचि रखते हैं, और यह आपको बताएंगे कि वे कब होते हैं।
नियंत्रण का उलटा कोड दोहराव को कम करने का एक व्यावहारिक तरीका है, और यदि आप अपने आप को एक पूरी विधि की नकल करते हुए पाते हैं और केवल कोड का एक छोटा सा टुकड़ा बदलते हैं, तो आप इसे नियंत्रण के व्युत्क्रम से निपटने पर विचार कर सकते हैं। प्रतिनिधियों, इंटरफेस, या यहां तक कि कच्चे फ़ंक्शन पॉइंटर्स की अवधारणा के माध्यम से कई भाषाओं में नियंत्रण का उलटा आसान बनाया जाता है।
यह सभी मामलों में उपयोग करने के लिए उपयुक्त नहीं है, क्योंकि इस तरह से लिखे जाने पर एक कार्यक्रम का प्रवाह कठिन हो सकता है। पुस्तकालय लिखते समय तरीकों को डिजाइन करने का यह एक उपयोगी तरीका है जिसका पुन: उपयोग किया जाएगा, लेकिन इसका उपयोग आपके स्वयं के कार्यक्रम के मूल में किया जाना चाहिए जब तक कि यह वास्तव में एक कोड दोहराव की समस्या का हल नहीं करता है।
लेकिन मुझे लगता है कि आपको इससे बहुत सावधान रहना होगा। यदि आप इस पैटर्न का उपयोग करेंगे, तो आप बहुत जटिल डिजाइन और यहां तक कि अधिक जटिल कोड बनाएंगे।
जैसे TextEditor के साथ इस उदाहरण में: यदि आपके पास केवल एक SpellChecker है तो शायद IoC का उपयोग करना आवश्यक नहीं है? जब तक आपको इकाई परीक्षण या कुछ लिखने की आवश्यकता न हो ...
वैसे भी: उचित हो। डिजाइन पैटर्न अच्छी प्रथाएं हैं लेकिन बाइबिल का प्रचार नहीं किया जाता है। इसे हर जगह चिपका न दें।
IoC / DI मुझे कॉलिंग ऑब्जेक्ट्स पर निर्भरता को बढ़ा रहा है। सुपर सिंपल है।
आपके द्वारा चालू करने से पहले गैर-तकनीकी उत्तर एक कार में एक इंजन को स्वैप करने में सक्षम हो रहा है। यदि सब कुछ सही (इंटरफ़ेस) हुक करता है, तो आप अच्छे हैं।
मान लीजिए कि आप एक वस्तु हैं। और आप एक रेस्तरां में जाते हैं:
आईओसी के बिना : आप "सेब" के लिए पूछते हैं, और जब आप अधिक पूछते हैं तो आपको हमेशा सेब परोसा जाता है।
IoC के साथ : आप "फल" के लिए पूछ सकते हैं। हर बार आपको परोसे जाने वाले अलग-अलग फल मिल सकते हैं। उदाहरण के लिए, सेब, नारंगी, या पानी तरबूज।
तो, जाहिर है, जब आप किस्में पसंद करते हैं तो IoC को प्राथमिकता दी जाती है।
नियंत्रण का उलटा एक पैटर्न है जिसका उपयोग सिस्टम में घटकों और परतों को डिकूप करने के लिए किया जाता है। जब यह निर्माण किया जाता है तो पैटर्न एक घटक में निर्भरता को इंजेक्शन के माध्यम से कार्यान्वित किया जाता है। ये निर्भरता आमतौर पर आगे के डिकॉउपिंग के लिए इंटरफेस के रूप में और परीक्षण क्षमता का समर्थन करने के लिए प्रदान की जाती हैं। आईओसी / डीआई कंटेनर जैसे कि कैसल विंडसर, यूनिटी उपकरण (पुस्तकालय) हैं जिनका उपयोग आईओसी प्रदान करने के लिए किया जा सकता है। ये उपकरण सरल निर्भरता प्रबंधन के ऊपर और परे विस्तारित सुविधाएँ प्रदान करते हैं, जिसमें जीवनकाल, AOP / अवरोधन, नीति, आदि शामिल हैं।
ए। यह निर्भरता के प्रबंधन के लिए जिम्मेदार होने से एक घटक को हटा देता है।
ख। विभिन्न वातावरणों में निर्भरता कार्यान्वयन को स्वैप करने की क्षमता प्रदान करता है।
सी। एक घटक को निर्भरता के मजाक के माध्यम से परीक्षण करने की अनुमति देता है।
घ। एक आवेदन भर में संसाधनों को साझा करने के लिए एक तंत्र प्रदान करता है।
ए। परीक्षण संचालित विकास करते समय गंभीर। आईओसी के बिना परीक्षण करना मुश्किल हो सकता है, क्योंकि परीक्षण के तहत घटकों को बाकी प्रणाली से बहुत अधिक जोड़ा जाता है।
ख। मॉड्यूलर सिस्टम विकसित करते समय महत्वपूर्ण। एक मॉड्यूलर प्रणाली एक ऐसी प्रणाली है जिसके घटकों को पुनर्संयोजन की आवश्यकता के बिना प्रतिस्थापित किया जा सकता है।
सी। महत्वपूर्ण है अगर कई क्रॉस-कटिंग चिंताएं हैं जिन्हें संबोधित करने की आवश्यकता है, एक उद्यम अनुप्रयोग में आंशिक रूप से।
केवल पहले भाग का उत्तर देना। यह क्या है?
इनवर्टर ऑफ कंट्रोल (IoC) का अर्थ है वर्ग के पहले और बाद के उदाहरणों की निर्भरता का निर्माण करना। इस प्रकार, नियंत्रण का व्युत्क्रम कार्यक्रम के नियंत्रण के प्रवाह को प्रभावित करता है । के बजाय कॉल प्राप्त करने वाला नियंत्रित नियंत्रण के प्रवाह (जबकि निर्भरता बनाने), फोन करने वाले कार्यक्रम के नियंत्रण के प्रवाह को नियंत्रित करता है ।
मैं इस दो शब्दों के बारे में अपनी सरल समझ लिखूंगा:
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
।
नियंत्रण के उलटा लागू करने से, एक सॉफ्टवेयर / वस्तु उपभोक्ता को नियंत्रित या कम विकल्प होने के बजाय सॉफ्टवेयर / वस्तुओं पर अधिक नियंत्रण / विकल्प मिलते हैं।
एक डिजाइन दिशानिर्देश के रूप में नियंत्रण का उलटा निम्नलिखित उद्देश्यों को पूरा करता है:
कार्यान्वयन से एक निश्चित कार्य के निष्पादन का डिकोडिंग होता है।
प्रत्येक मॉड्यूल इस बात पर ध्यान केंद्रित कर सकता है कि यह किसके लिए डिज़ाइन किया गया है।
मॉड्यूल अन्य प्रणालियों के बारे में कोई धारणा नहीं बनाते हैं लेकिन उनके अनुबंधों पर भरोसा करते हैं।
मॉड्यूल को बदलने से अन्य मॉड्यूल पर कोई दुष्प्रभाव नहीं पड़ता है,
मैं चीजों को यहां सार रखूंगा, आप विषय की विस्तार से समझ के लिए निम्नलिखित लिंक पर जा सकते हैं।
उदाहरण के साथ एक अच्छा पढ़ा
मैं NilObject से सहमत हूं , लेकिन मैं इसे जोड़ना चाहूंगा:
यदि आप अपने आप को एक पूरी विधि की नकल करते हुए पाते हैं और केवल एक छोटा सा कोड बदलते हैं, तो आप इसे नियंत्रण के उलट होने से निपटने पर विचार कर सकते हैं।
यदि आप अपने आप को कोड को कॉपी और पेस्ट करते हुए पाते हैं, तो आप लगभग हमेशा कुछ गलत कर रहे हैं। एक बार और केवल एक बार डिजाइन सिद्धांत के रूप में संहिताबद्ध ।
उदाहरण के लिए, कार्य # 1 ऑब्जेक्ट बनाना है। IOC अवधारणा के बिना, कार्य # 1 प्रोग्रामर द्वारा किया जाना चाहिए। लेकिन IOC अवधारणा के साथ, कार्य # 1 कंटेनर द्वारा किया जाएगा।
शॉर्ट कंट्रोल में प्रोग्रामर से कंटेनर तक उल्टा हो जाता है। तो, इसे नियंत्रण का व्युत्क्रम कहा जाता है।
मुझे यहां एक अच्छा उदाहरण मिला ।
बता दें कि हम किसी होटल में कुछ मीटिंग करते हैं।
बहुत से लोग, कई कारफ जल, कई प्लास्टिक के कप।
जब कोई पीना चाहता है, तो वह कप भरती है, पीती है और फर्श पर कप फेंकती है।
घंटे या कुछ के बाद हमारे पास प्लास्टिक के कप और पानी से ढका फर्श है।
नियंत्रण को उलटने दें।
एक ही जगह पर एक ही बैठक, लेकिन प्लास्टिक के कप के बजाय हमारे पास एक ग्लास कप (सिंगलटन) के साथ एक वेटर है
और वह हर समय मेहमानों को शराब पिलाती है
जब कोई पीना चाहता है, तो वह वेटर के गिलास से मिलता है, पीता है और वेटर को वापस लौटाता है।
स्वच्छता के सवाल को छोड़ दें, तो पीने के नियंत्रण का अंतिम रूप अधिक प्रभावी और आर्थिक है।
और यह वास्तव में वसंत (एक और 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
}
उपयोगी कड़ियाँ:-
ऐसा लगता है कि "IoC" के बारे में सबसे भ्रामक बात यह है कि संक्षिप्त नाम और जिसके लिए वह खड़ा है, यह एक नाम का ग्लैमरस है - लगभग एक शोर नाम है।
क्या हमें वास्तव में एक नाम की आवश्यकता है जिसके द्वारा प्रक्रियात्मक और घटना संचालित प्रोग्रामिंग के बीच अंतर का वर्णन किया जा सके? ठीक है, अगर हमें ज़रूरत है, लेकिन क्या हमें एक नया "जीवन से बड़ा" नाम लेने की ज़रूरत है जो इसे हल करता है?
नियंत्रण का उलटा का है जब आप किराने की दुकान पर जाते हैं और आपकी पत्नी आपको खरीदने के लिए उत्पादों की सूची देती है।
प्रोग्रामिंग शब्दों में, वह उस फ़ंक्शन getProductList()
को कॉलबैक फ़ंक्शन देती है जिसे आप निष्पादित कर रहे हैं -doShopping()
।
यह फ़ंक्शन के उपयोगकर्ता को इसके कुछ हिस्सों को परिभाषित करने की अनुमति देता है, जिससे यह अधिक लचीला हो जाता है।
getProductList()
आपको पैसे के लिए स्रोत ढूंढना है, तो इसका मतलब है कि नियंत्रण आपके पक्ष में है। उलटा के मामले में, वह नियंत्रित करेगा, इसका मतलब है कि वह पैसे भी खरीदेगा।
मुझे यहां एक बहुत स्पष्ट उदाहरण मिला, जो बताता है कि 'नियंत्रण उलटा' कैसे होता है।
क्लासिक कोड (निर्भरता इंजेक्शन के बिना)
यहाँ बताया गया है कि DI का उपयोग न करने वाला कोड मोटे तौर पर कैसे काम करेगा:
निर्भरता इंजेक्शन का उपयोग करना
यहां बताया गया है कि DI का उपयोग करने वाला कोड मोटे तौर पर कैसे काम करेगा:
आश्रितों का नियंत्रण एक कॉल करने के लिए एक से उलटा है।
यह किन समस्याओं का समाधान करता है?
निर्भरता इंजेक्शन इंजेक्शन वर्गों के विभिन्न कार्यान्वयन के साथ स्वैप करना आसान बनाता है। इकाई परीक्षण के दौरान आप एक डमी कार्यान्वयन को इंजेक्ट कर सकते हैं, जिससे परीक्षण बहुत आसान हो जाता है।
पूर्व: मान लीजिए कि आपका एप्लिकेशन 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 का उपयोग तब करते हैं जब आपको लगता है कि किसी वर्ग के वैकल्पिक कार्यान्वयन हैं (या हो सकते हैं)।
एक बहुत ही सरल लिखित स्पष्टीकरण यहाँ पाया जा सकता है
http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html
इसे कहते हैं -
"कोई भी अनौपचारिक आवेदन दो या दो से अधिक वर्गों से बना होता है जो कुछ व्यापारिक तर्क करने के लिए एक-दूसरे के साथ सहयोग करते हैं। परंपरागत रूप से, प्रत्येक वस्तु उन वस्तुओं के लिए अपने स्वयं के संदर्भ प्राप्त करने के लिए ज़िम्मेदार होती है जो उसके (उसके आश्रितों) के साथ सहयोग करती है। डीआई को लागू करते समय। वस्तुओं को कुछ बाहरी संस्था द्वारा निर्माण समय पर उनकी निर्भरता दी जाती है जो सिस्टम में प्रत्येक वस्तु का समन्वय करती है। दूसरे शब्दों में, निर्भरता वस्तुओं में इंजेक्ट की जाती है। "
नियंत्रण का व्युत्क्रम एक सामान्य सिद्धांत है, जबकि डिपेंडेंसी इंजेक्शन इस सिद्धांत को ऑब्जेक्ट ग्राफ निर्माण के लिए एक डिज़ाइन पैटर्न के रूप में महसूस करता है (अर्थात कॉन्फ़िगरेशन नियंत्रित करता है कि ऑब्जेक्ट एक-दूसरे को कैसे संदर्भित कर रहे हैं, बजाय ऑब्जेक्ट को नियंत्रित करने के कि कैसे किसी अन्य ऑब्जेक्ट का संदर्भ प्राप्त करें)।
नियंत्रण के व्युत्क्रम को एक डिजाइन पैटर्न के रूप में देखते हुए, हमें यह देखने की जरूरत है कि हम क्या कर रहे हैं। निर्भरता इंजेक्शन वस्तुओं के एक ग्राफ के निर्माण का नियंत्रण करता है। यदि आम आदमी के कार्यकाल में कहा जाए, तो नियंत्रण का उलटा मतलब कार्यक्रम में नियंत्रण के प्रवाह में परिवर्तन है। उदाहरण के लिए। पारंपरिक स्टैंडअलोन ऐप में, हमारे पास मुख्य विधि है, जहां से नियंत्रण अन्य तीसरे पक्ष के पुस्तकालयों को पास हो जाता है (मामले में, हमने तीसरे पक्ष के पुस्तकालय के कार्य का उपयोग किया है), लेकिन नियंत्रण के व्युत्क्रम के माध्यम से नियंत्रण तीसरे पक्ष के पुस्तकालय कोड से हमारे कोड में स्थानांतरित हो जाता है , जैसा कि हम तीसरे पक्ष के पुस्तकालय की सेवा ले रहे हैं। लेकिन ऐसे अन्य पहलू हैं जिन्हें एक कार्यक्रम के भीतर उलटा करने की आवश्यकता है - जैसे कोड को निष्पादित करने के तरीकों और थ्रेड्स का आह्वान।
कंट्रोल ऑफ इन्वॉर्शन पर अधिक गहराई में रुचि रखने वालों के लिए डिजाइन के पैटर्न के रूप में कंट्रोल ऑफ इन्वर्टेशन की एक और पूरी तस्वीर को प्रकाशित करते हुए प्रकाशित किया गया है (OfficeFloor: सॉफ्टवेयर डिजाइन में सुधार के लिए कार्यालय पैटर्न का उपयोग करना http://doi.acm.org/10.1145/ 2739011.2739013 http://www.officefloor.net/about.html से डाउनलोड करने के लिए नि: शुल्क कॉपी उपलब्ध है ) ।
क्या पहचाना जाता है निम्नलिखित संबंध:
नियंत्रण का उलटा (तरीकों के लिए) = निर्भरता (राज्य) इंजेक्शन + निरंतरता इंजेक्शन + थ्रेड इंजेक्शन
नियंत्रण के व्युत्क्रम के लिए उपरोक्त संबंध का सारांश उपलब्ध है - http://dzone.com/articles/inversion-of-coupling-control
IoC आपके कोड और थर्ड-पार्टी कोड (लाइब्रेरी / फ्रेमवर्क) के बीच संबंध स्थापित करने के बारे में है:
DI (निर्भरता इंजेक्शन) अनुप्रयोग में नियंत्रण कैसे बहता है, इसके बारे में है। पारंपरिक डेस्कटॉप एप्लिकेशन में आपके एप्लिकेशन (मुख्य () विधि) से अन्य लाइब्रेरी विधि कॉलों पर नियंत्रण प्रवाह था, लेकिन DI नियंत्रण प्रवाह के साथ उल्टा है कि फ्रेमवर्क आपके ऐप को शुरू करने, इसे शुरू करने और जब भी आवश्यक हो, अपने तरीकों को लागू करने का ख्याल रखता है।
अंत में आप हमेशा जीतते हैं :)
मुझे यह स्पष्टीकरण पसंद है: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/
यह सरल शुरू होता है और साथ ही कोड उदाहरण दिखाता है।
उपभोक्ता, एक्स, को कुछ हासिल करने के लिए उपभोग किए गए वर्ग, वाई की आवश्यकता होती है। यह सब अच्छा और स्वाभाविक है, लेकिन क्या एक्स को वास्तव में यह जानने की जरूरत है कि यह वाई का उपयोग करता है?
क्या यह पर्याप्त नहीं है कि एक्स जानता है कि यह कुछ ऐसा उपयोग करता है जिसमें वाई के व्यवहार, तरीके, गुण आदि होते हैं, यह जानने के बिना कि वास्तव में व्यवहार को कौन लागू करता है?
एक्स द्वारा वाई में उपयोग किए जाने वाले व्यवहार की एक सार परिभाषा निकालने से, जैसा कि मैंने नीचे वर्णित किया है, और उपभोक्ता एक्स को वाई के बजाय एक उदाहरण का उपयोग करने देता है, यह वाई के बारे में बारीकियों को जानने के बिना ऐसा करना जारी रख सकता है।
Y के ऊपर के चित्रण में I और X, I के उदाहरण का उपयोग करता है। जबकि यह काफी संभव है कि X अभी भी Y का उपयोग करता है, दिलचस्प यह है कि X को यह पता नहीं है। यह सिर्फ इतना जानता है कि यह कुछ ऐसी चीज़ों का उपयोग करता है जो मैं लागू करता है।
अधिक जानकारी और लाभ के विवरण के लिए लेख पढ़ें:
...
मैं समझता हूं कि इसका उत्तर पहले ही दिया जा चुका है। लेकिन मुझे अभी भी लगता है, नियंत्रण के व्युत्क्रम के बारे में कुछ मूल बातें भविष्य के पाठकों के लिए यहां चर्चा की जानी चाहिए।
इनवर्टर ऑफ कंट्रोल (IoC) हॉलीवुड सिद्धांत नामक एक बहुत ही सरल सिद्धांत पर बनाया गया है । और यह कहता है कि,
हमें कॉल न करें, हम आपको कॉल करेंगे
इसका मतलब यह है कि अपने सपने को पूरा करने के लिए हॉलीवुड न जाएं, बल्कि यदि आप योग्य हैं तो हॉलीवुड आपको खोज लेगा और आपका सपना सच हो जाएगा। बहुत ज्यादा उलटा, हुह?
अब जब हम IoC के सिद्धांत के बारे में चर्चा करते हैं, तो हम हॉलीवुड के बारे में भूल जाते हैं। IoC के लिए, तीन तत्व होने चाहिए, एक हॉलीवुड, आप और आपके सपने को पूरा करने के लिए एक कार्य।
हमारे प्रोग्रामिंग दुनिया में, हॉलीवुड एक सामान्य रूपरेखा का प्रतिनिधित्व करता है (आपके द्वारा या किसी और के द्वारा लिखा जा सकता है), आप अपने द्वारा लिखे गए उपयोगकर्ता कोड का प्रतिनिधित्व करते हैं और कार्य उस चीज का प्रतिनिधित्व करता है जिसे आप अपने कोड के साथ पूरा करना चाहते हैं। अब आप कभी भी अपने काम को ट्रिगर करने के लिए नहीं जाते, आईओसी में नहीं! बल्कि आपने सब कुछ इस तरह से डिज़ाइन किया है कि आपका ढांचा आपके लिए आपके काम को ट्रिगर करेगा। इस प्रकार आपने एक पुन: प्रयोज्य ढांचा बनाया है जो किसी को नायक या दूसरे को खलनायक बना सकता है। लेकिन यह ढांचा हमेशा प्रभारी होता है, यह जानता है कि किसी को कब चुनना है और किसी को केवल यह पता है कि वह क्या बनना चाहता है।
एक वास्तविक जीवन उदाहरण यहाँ दिया जाएगा। मान लीजिए, आप एक वेब एप्लिकेशन विकसित करना चाहते हैं। तो, आप एक ऐसा ढांचा तैयार करते हैं जो एक वेब एप्लिकेशन को सभी सामान्य चीजों को संभालना चाहिए जैसे http अनुरोध को संभालना, एप्लिकेशन मेनू बनाना, पेजों की सेवा करना, कुकीज़ का प्रबंधन करना, घटनाओं को ट्रिगर करना आदि।
और फिर आप अपने ढांचे में कुछ हुक छोड़ते हैं जहां आप कस्टम मेनू, पेज, कुकीज़ या कुछ उपयोगकर्ता घटनाओं को लॉग इन करने आदि के लिए आगे कोड डाल सकते हैं। प्रत्येक ब्राउज़र अनुरोध पर, आपका फ्रेमवर्क चलेगा और आपके कस्टम कोड निष्पादित करेगा यदि हुक किया गया तो इसे वापस सेवा दें ब्राउज़र को।
तो, विचार बहुत सरल है। एक उपयोगकर्ता एप्लिकेशन बनाने के बजाय जो सब कुछ नियंत्रित करेगा, पहले आप एक पुन: प्रयोज्य ढांचा बनाएं जो सब कुछ नियंत्रित करेगा फिर अपने कस्टम कोड लिखें और समय पर उन पर अमल करने के लिए इसे फ्रेमवर्क में हुक करें।
लारवेल और ईजेबी ऐसे ढांचे के उदाहरण हैं।
संदर्भ:
प्रोग्रामिंग बोल रहा हूँ
आईओसी आसान शब्दों में: यह इंटरफेस का उपयोग विशिष्ट चीज़ों (जैसे कि एक क्षेत्र या एक पैरामीटर) के रूप में एक वाइल्डकार्ड के रूप में किया जाता है जिसका उपयोग कुछ वर्गों द्वारा किया जा सकता है। यह कोड की पुन: प्रयोज्य की अनुमति देता है।
उदाहरण के लिए, मान लें कि हमारे पास दो वर्ग हैं: डॉग और कैट । दोनों समान गुण / अवस्थाएं साझा करते हैं: आयु, आकार, वजन। इसलिए मैं DogService और CatService नामक सेवा की एक क्लास बनाने के बजाय , मैं AnimalService नामक एक एकल बना सकता हूं जो केवल कुत्ते और बिल्ली का उपयोग करने की अनुमति देता है यदि वे इंटरफ़ेस IAnimal का उपयोग करते हैं ।
हालाँकि, व्यावहारिक रूप से, यह कुछ पीछे की ओर है।
क) अधिकांश डेवलपर्स यह नहीं जानते कि इसका उपयोग कैसे किया जाए । उदाहरण के लिए, मैं ग्राहक नामक एक वर्ग बना सकता हूं और मैं स्वतः ही बना सकता हूं (आईडीई के औजारों का उपयोग करके) एक इंटरफ़ेस जिसे ICustomer कहा जाता है । इसलिए, वर्गों और इंटरफेस से भरा एक फ़ोल्डर ढूंढना दुर्लभ नहीं है, भले ही इंटरफेस का पुन: उपयोग किया जाएगा या नहीं। इसे BLOATED कहा जाता है। कुछ लोग तर्क दे सकते हैं कि "भविष्य में हम इसका उपयोग कर सकते हैं"। : - |
b) इसकी कुछ सीमाएँ हैं। उदाहरण के लिए, चलो कुत्ते और बिल्ली के मामले के बारे में बात करते हैं और मैं केवल कुत्तों के लिए एक नई सेवा (कार्यक्षमता) जोड़ना चाहता हूं। मान लीजिए कि मैं उन दिनों की संख्या की गणना करना चाहता हूं जो मुझे एक कुत्ते को प्रशिक्षित करने की आवश्यकता है ( trainDays()
), बिल्ली के लिए यह बेकार है, बिल्लियों को प्रशिक्षित नहीं किया जा सकता है (मैं मजाक कर रहा हूं)।
b.1) अगर मैं trainDays()
सेवा AnimalService में जोड़ता हूं तो यह बिल्लियों के साथ भी काम करता है और यह बिल्कुल भी मान्य नहीं है।
b.2) मैं एक शर्त जोड़ सकता हूं trainDays()
कि यह कहां मूल्यांकन करता है कि किस वर्ग का उपयोग किया जाता है। लेकिन यह पूरी तरह से आईओसी को तोड़ देगा।
b.3) मैं नई कार्यक्षमता के लिए केवल DogService नामक सेवा का एक नया वर्ग बना सकता हूं । लेकिन, यह कोड की स्थिरता को बढ़ाएगा क्योंकि डॉग के लिए हमारे पास दो वर्गों की सेवा (समान कार्यक्षमता के साथ) होगी और यह खराब है।
मैंने इसके लिए बहुत से उत्तर पढ़े हैं, लेकिन अगर कोई अभी भी भ्रमित है और IoC को समझाने के लिए एक प्लस अल्ट्रा "लैमैन्स टर्म" की आवश्यकता है, तो यह है:
एक माता-पिता और बच्चे को एक दूसरे से बात करने की कल्पना करें।
बिना आईओसी:
* जनक : आप केवल तभी बोल सकते हैं जब मैं आपसे प्रश्न पूछूं और आप केवल तभी कार्य कर सकते हैं जब मैं आपको अनुमति दूंगा।
जनक : इसका मतलब है, आप मुझसे यह नहीं पूछ सकते हैं कि क्या आप खा सकते हैं, खेल सकते हैं, बाथरूम जा सकते हैं या सो भी सकते हैं अगर मैं आपसे नहीं पूछता।
जनक : क्या आप खाना चाहते हैं?
बच्चा : नहीं।
जनक : ठीक है, मैं वापस आ जाऊंगा। मेरा इंतजार करना।
बच्चा : (खेलना चाहता है लेकिन चूंकि माता-पिता से कोई सवाल नहीं है, बच्चा कुछ नहीं कर सकता)।
1 घंटे के बाद...
जनक : मैं वापस आ गया हूं। क्या आप खेलना चाहते हैं?
बच्चा : हाँ।
जनक : अनुमति दी गई।
बच्चा : (आखिरकार खेलने में सक्षम है)।
यह सरल परिदृश्य बताता है कि नियंत्रण माता-पिता पर केंद्रित है। बच्चे की स्वतंत्रता प्रतिबंधित है और माता-पिता के सवाल पर अत्यधिक निर्भर करती है। बच्चे को केवल बोलने के लिए कहा जा सकता है, और अनुमति मिलने पर केवल कार्य कर सकते हैं ।
आईओसी के साथ:
बच्चे के पास अब सवाल पूछने की क्षमता है और अभिभावक जवाब और अनुमति दे सकते हैं। बस इसका मतलब है कि नियंत्रण उल्टा है! बच्चा अब किसी भी समय प्रश्न पूछने के लिए स्वतंत्र है और यद्यपि अनुमतियों के संबंध में माता-पिता के साथ अभी भी निर्भरता है, वह प्रश्नों को बोलने / पूछने के साधनों में निर्भर नहीं है।
समझाने के तकनीकी तरीके से, यह कंसोल / शेल / सेमी / बनाम जीयूआई बातचीत के समान है। (जो मार्क हैरिसन का उत्तर नंबर 2 से ऊपर का उत्तर है)। कंसोल में, आप उस चीज़ पर निर्भर होते हैं जो आपसे पूछा जा रहा है / प्रदर्शित किया जाता है और आप पहले सवाल के जवाब के बिना अन्य मेनू और सुविधाओं पर नहीं जा सकते हैं; एक सख्त अनुक्रमिक प्रवाह के बाद। (प्रोग्रामेटिकली यह एक मेथड / फंक्शन लूप जैसा है)। हालांकि, GUI के साथ, मेनू और फीचर्स को निर्धारित किया गया है और उपयोगकर्ता जो कुछ भी इसकी आवश्यकता है उसका चयन कर सकता है और इस प्रकार अधिक नियंत्रण और कम प्रतिबंधित है। (प्रोग्रामेटिक रूप से, मेन्यू में कॉलबैक होता है जब सिलेक्ट किया जाता है और एक्शन होता है)।
नियंत्रण से उलट पुस्तकालय से ग्राहक को नियंत्रण स्थानांतरित करने के बारे में है। यह अधिक समझ में आता है जब हम एक क्लाइंट के बारे में बात करते हैं जो एक फ़ंक्शन मान (लैम्ब्डा एक्सप्रेशन) को एक उच्च क्रम फ़ंक्शन (लाइब्रेरी फ़ंक्शन) में इंजेक्ट करता है (लाइब्रेरी फ़ंक्शन) जो लाइब्रेरी फ़ंक्शन के व्यवहार को नियंत्रित (परिवर्तन) करता है। एक ग्राहक या ढांचा जो लाइब्रेरी में निर्भरता (जो व्यवहार को वहन करता है) को पुस्तकालयों में इंजेक्ट करता है, उसे भी आईओसी माना जा सकता है
चूंकि पहले से ही प्रश्न के कई उत्तर हैं, लेकिन उनमें से कोई भी व्युत्क्रम नियंत्रण शब्द के टूटने को नहीं दिखाता है मुझे एक अधिक संक्षिप्त और उपयोगी उत्तर देने का अवसर दिखाई देता है।
नियंत्रण का व्युत्क्रम एक पैटर्न है जो डिपेंडेंसी इनवर्जन सिद्धांत (डीआईपी) को लागू करता है। डीआईपी निम्नलिखित बताता है: 1. उच्च-स्तरीय मॉड्यूल को निम्न-स्तर के मॉड्यूल पर निर्भर नहीं होना चाहिए। दोनों को सार (जैसे इंटरफेस) पर निर्भर होना चाहिए। 2. सार विवरण पर निर्भर नहीं होना चाहिए। विवरण (ठोस कार्यान्वयन) अमूर्तता पर निर्भर होना चाहिए।
नियंत्रण के व्युत्क्रम के तीन प्रकार हैं:
इंटरफ़ेस उलटा प्रदाता एक इंटरफ़ेस को परिभाषित नहीं करना चाहिए। इसके बजाय, उपभोक्ता को इंटरफ़ेस को परिभाषित करना चाहिए और प्रदाताओं को इसे लागू करना चाहिए। इंटरफ़ेस उलटा एक नया प्रदाता जोड़ा जब उपभोक्ता को हर बार संशोधित करने की आवश्यकता को समाप्त करने की अनुमति देता है।
फ्लो उलटा परिवर्तन प्रवाह का नियंत्रण। उदाहरण के लिए, आपके पास एक कंसोल एप्लिकेशन है जहां आपने कई मापदंडों को दर्ज करने के लिए कहा है और प्रत्येक दर्ज किए गए पैरामीटर के बाद आपको एंटर दबाने के लिए मजबूर किया जाता है। आप यहां फ्लो उलटा लागू कर सकते हैं और एक डेस्कटॉप एप्लिकेशन को लागू कर सकते हैं जहां उपयोगकर्ता मापदंडों के प्रवेश का क्रम चुन सकता है, उपयोगकर्ता मापदंडों को संपादित कर सकता है, और अंतिम चरण में, उपयोगकर्ता को केवल एक बार दर्ज करने की आवश्यकता है।
क्रिएशन इनवर्जन यह निम्नलिखित पैटर्न द्वारा लागू किया जा सकता है: फ़ैक्टरी पैटर्न, सर्विस लोकेटर, और डिपेंडेंसी इंजेक्शन। क्रिएशन इनवर्जन उन प्रकारों के बाहर निर्भरता को खत्म करने में मदद करता है जो इन निर्भरता ऑब्जेक्ट्स का उपयोग करने वाले प्रकार के बाहर निर्भरता ऑब्जेक्ट निर्माण की प्रक्रिया को आगे बढ़ाते हैं। निर्भरताएं खराब क्यों हैं? यहां कुछ उदाहरण दिए गए हैं: आपके कोड में एक नई वस्तु का प्रत्यक्ष निर्माण परीक्षण को कठिन बनाता है; पुनर्संयोजन (OCP सिद्धांत उल्लंघन) के बिना असेंबली में संदर्भ बदलना असंभव है; आप आसानी से डेस्कटॉप-यूआई को वेब-यूआई द्वारा प्रतिस्थापित नहीं कर सकते।
तो नंबर 1 ऊपर । नियंत्रण का व्युत्क्रम क्या है?
रखरखाव वह नंबर एक चीज है जो वह मेरे लिए हल करता है। यह गारंटी देता है कि मैं इंटरफेस का उपयोग कर रहा हूं ताकि दो कक्षाएं एक-दूसरे के साथ अंतरंग न हों।
कैसल विंडसर जैसे कंटेनर का उपयोग करने में, यह रखरखाव के मुद्दों को और भी बेहतर बनाता है। एक घटक को स्वैप करने में सक्षम होना जो एक डेटाबेस के लिए जाता है जो कोड की एक पंक्ति को बदलने के बिना फ़ाइल आधारित दृढ़ता का उपयोग करता है वह कमाल है (कॉन्फ़िगरेशन परिवर्तन, आप कर रहे हैं)।
और एक बार जब आप जेनरिक में आते हैं, तो यह और भी बेहतर हो जाता है। एक संदेश प्रकाशक होने की कल्पना करें जो रिकॉर्ड प्राप्त करता है और संदेश प्रकाशित करता है। यह परवाह नहीं करता है कि यह क्या प्रकाशित करता है, लेकिन इसे एक रिकॉर्ड से संदेश तक ले जाने के लिए मैपर की आवश्यकता होती है।
public class MessagePublisher<RECORD,MESSAGE>
{
public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
{
//setup
}
}
मैंने इसे एक बार लिखा था, लेकिन अब मैं कोड के इस सेट में कई प्रकार के इंजेक्शन लगा सकता हूं यदि मैं विभिन्न प्रकार के संदेश प्रकाशित करता हूं। मैं मैपर्स भी लिख सकता हूं जो एक ही प्रकार का रिकॉर्ड लेते हैं और उन्हें विभिन्न संदेशों में मैप करते हैं। डीआई विद जेनेरिक का उपयोग करने से मुझे कई कार्यों को पूरा करने के लिए बहुत कम कोड लिखने की क्षमता मिली है।
अरे हाँ, परीक्षण की चिंताएँ हैं, लेकिन वे IoC / DI के लाभों के लिए गौण हैं।
मैं निश्चित रूप से IoC / DI से प्यार कर रहा हूं।
३। यह उस समय अधिक उपयुक्त हो जाता है जब आपके पास कुछ अधिक जटिलता का मध्यम आकार का प्रोजेक्ट होता है। मैं कहूंगा कि यह उचित मिनट है जब आप दर्द महसूस करना शुरू करते हैं।
कक्षा के भीतर एक वस्तु का निर्माण तंग युग्मन कहलाता है, स्प्रिंग एक डिजाइन पैटर्न (DI / IOC) का पालन करके इस निर्भरता को दूर करता है। वर्ग में निर्माण करने के बजाय निर्माणकर्ता में उत्तीर्ण वर्ग की वस्तु। अधिक से अधिक हम सामान्य संरचना को परिभाषित करने के लिए कंस्ट्रक्टर में सुपर क्लास संदर्भ चर देते हैं।