IOC कंटेनर OOP सिद्धांत तोड़ते हैं


51

आईओसी कंटेनरों का उद्देश्य क्या है? इसके लिए संयुक्त कारणों को निम्नलिखित में सरल बनाया जा सकता है:

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

ऐसा करने का कोई OOP / SOLID तरीका नहीं है और इसमें सुपर सुंदर कोड है।

यदि वह पिछला कथन सत्य है, तो IOC कंटेनर इसे कैसे करते हैं? जहां तक ​​मुझे पता है, वे कुछ अज्ञात तकनीक को नियोजित नहीं कर रहे हैं जो मैनुअल DI के साथ नहीं किया जा सकता है। इसलिए एकमात्र अन्वेषण यह है कि IOC कंटेनर स्थैतिक वस्तुओं के निजी एक्सेसरों का उपयोग करके OOP / SOLID सिद्धांतों को तोड़ते हैं।

क्या IOC कंटेनर पर्दे के पीछे निम्नलिखित सिद्धांतों को तोड़ते हैं? यह वास्तविक प्रश्न है क्योंकि मुझे अच्छी समझ है, लेकिन यह महसूस करें कि किसी और की बेहतर समझ है:

  1. स्कोप नियंत्रण । स्कोप लगभग हर फैसले का कारण है जो मैं अपने कोड डिजाइन पर करता हूं। ब्लॉक, स्थानीय, मॉड्यूल, स्टेटिक / ग्लोबल। स्कोप बहुत स्पष्ट होना चाहिए, जितना ब्लॉक-स्तर पर और जितना संभव हो उतना कम स्टैटिक। आपको घोषणाएँ, तात्कालिकता और जीवनचक्र को देखना चाहिए। जब तक मैं इसके साथ स्पष्ट हूं, तब तक मुझे भाषा और GC पर गुंजाइश रखने का भरोसा है। अपने शोध में मैंने पाया है कि आईओसी कंटेनरों ने स्टैटिक के रूप में अधिकांश या सभी निर्भरताएं निर्धारित की हैं और पर्दे के पीछे कुछ एओपी कार्यान्वयन के माध्यम से उन्हें नियंत्रित करते हैं। इसलिए कुछ भी पारदर्शी नहीं है।
  2. एनकैप्सुलेशन । इनकैप्सुलेशन का उद्देश्य क्या है? हमें निजी सदस्यों को क्यों रखना चाहिए? व्यावहारिक कारणों से यह इतना है कि हमारे एपीआई के कार्यान्वयनकर्ता राज्य को बदलकर (जिसे मालिक वर्ग द्वारा प्रबंधित किया जाना चाहिए) कार्यान्वयन को नहीं तोड़ सकते। लेकिन सुरक्षा कारणों से भी, यह इतना इंजेक्शन हो सकता है कि हमारे सदस्य राज्यों से आगे निकल जाए और सत्यापन और वर्ग नियंत्रण को दरकिनार कर दे। तो कुछ भी (मॉकिंग फ्रेमवर्क या आईओसी फ्रेमवर्क) जो किसी भी तरह से निजी सदस्यों को बाहरी उपयोग की अनुमति देने के लिए संकलन समय से पहले कोड इंजेक्ट करता है, बहुत बड़ा है।
  3. एकल जिम्मेदारी सिद्धांत । सतह पर, IOC कंटेनर चीजों को साफ करने वाले लगते हैं। लेकिन कल्पना कीजिए कि आप सहायक ढांचे के बिना एक ही चीज को कैसे पूरा करेंगे। आपके पास एक दर्जन या तो आश्रितों के साथ कंस्ट्रक्टर होंगे, इसका मतलब यह नहीं है कि यह आईओसी कंटेनरों के साथ कवर करता है, यह एक अच्छी बात है! यह आपके कोड को फिर से फैक्टर करने और एसआरपी का पालन करने के लिए एक संकेत है।
  4. खुला / बंद । जैसे SRP क्लास-ओनली नहीं है (मैं SRP को सिंगल-जिम्मेदारी लाइन्स में लागू करता हूं, अकेले मेथड्स)। ओपन / क्लोज्ड केवल एक उच्च स्तरीय सिद्धांत नहीं है जो किसी वर्ग के कोड को बदल नहीं सकता है। यह आपके कार्यक्रम के विन्यास को समझने और क्या बदल जाता है और क्या बढ़ जाता है पर नियंत्रण रखने का अभ्यास है। IOC कंटेनर आपकी कक्षाओं के काम करने के तरीके को पूरी तरह से आंशिक रूप से बदल सकते हैं क्योंकि:

    • ए। मुख्य कोड निर्भरता स्विचन का निर्धारण नहीं कर रहा है, फ्रेमवर्क कॉन्फ़िगरेशन है।

    • ख। स्कोप को ऐसे समय में बदला जा सकता है जिसे कॉलिंग सदस्यों द्वारा नियंत्रित नहीं किया जाता है, यह इसके बजाय एक स्थिर रूपरेखा द्वारा बाहरी रूप से निर्धारित किया जाता है।

इसलिए क्लास का कॉन्फ़िगरेशन वास्तव में बंद नहीं है, यह तीसरे पक्ष के टूल के कॉन्फ़िगरेशन के आधार पर खुद को बदल देता है।

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

मैं C # और .NET GC पर भरोसा कर सकता हूं कि मुझे उससे क्या उम्मीद है। लेकिन मैं उसी विश्वास को तीसरे पक्ष के उपकरण में नहीं डाल सकता जो कि मेरे द्वारा मैन्युअल रूप से करने में सक्षम नहीं होने वाली चीजों के लिए कार्य करने के लिए मेरे संकलित कोड को बदल रहा है।

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


13
+1 के बीच सहसंबंध IOCऔर Explicitness of codeबिल्कुल वही चीज है जिसके साथ मुझे समस्या है। मैनुअल डीआई आसानी से एक घर का काम बन सकता है, लेकिन यह कम से कम एक स्थान पर स्वनिर्धारित स्पष्ट कार्यक्रम प्रवाह डालता है - "आप जो देखते हैं, आप देखते हैं कि आपको क्या मिलता है"। जबकि आईओसी के कंटेनरों की बाइंडिंग और घोषणाएं आसानी से अपने आप में एक छिपी हुई समानांतर कार्यक्रम बन सकती हैं।
यूजीन पोडस्कल 19

6
यह कैसे भी एक सवाल है?
स्टीफन

8
यह एक प्रश्न की तुलना में ब्लॉग पोस्ट की तरह अधिक लगता है।
बार्ट वैन इनगेन शेनौ

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

3
@BenAaronson धन्यवाद बेन। मैं यह जानने की कोशिश कर रहा हूं कि मैंने अपने शोध के माध्यम से क्या सीखा है और IOC कंटेनरों की प्रकृति के बारे में उत्तर प्राप्त कर रहा हूं। मेरे शोध के परिणामस्वरूप मैंने इन सिद्धांतों को तोड़ा है। मेरे प्रश्न का सबसे अच्छा उत्तर इस बात की पुष्टि या खंडन करेगा कि IOC कंटेनर किसी तरह का काम कर सकते हैं जो हम OOP / SOLIN सिद्धांतों को तोड़ने के बिना मैन्युअल रूप से नहीं कर सकते। आपकी महान टिप्पणियों के कारण, मैंने अपने प्रश्न को और अधिक उदाहरणों के साथ दर्शाया है।
सुमेरे

जवाबों:


35

मैं आपके अंकों के माध्यम से संख्यात्मक रूप से जाऊंगा, लेकिन सबसे पहले, कुछ ऐसा है, जिस पर आपको बहुत सावधान रहना चाहिए: इस बात की पुष्टि न करें कि एक पुस्तकालय का उपयोग कैसे किया जाता है, इसके साथ एक उपभोक्ता कैसे पुस्तकालय का उपयोग करता है । इसके अच्छे उदाहरण हैं Entity Framework (जिसे आप स्वयं एक अच्छी लाइब्रेरी के रूप में उद्धृत करते हैं) और ASP.NET के MVC हैं। ये दोनों हुड के नीचे एक भयानक बहुत कुछ करते हैं, उदाहरण के लिए, प्रतिबिंब, जो बिल्कुल अच्छा डिजाइन नहीं माना जाएगा यदि आप इसे दिन-प्रतिदिन के कोड के माध्यम से फैलाते हैं।

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

तो, बिंदु से गुजरने के लिए:

  1. तुरंत हम उस तक पहुंचते हैं जो मैं केवल मान सकता हूं कि ऊपर का एक उदाहरण है। आप कहते हैं कि आईओसी कंटेनर स्थैतिक के रूप में सबसे अधिक निर्भरता स्थापित करते हैं। खैर, शायद वे कैसे काम करते हैं, इसके कुछ कार्यान्वयन विवरण में स्थिर भंडारण शामिल है (हालांकि यह देखते हुए कि वे एक वस्तु का एक उदाहरण है जैसे कि निनजे का IKernelउनके मुख्य भंडारण के रूप में, मुझे संदेह है कि)। लेकिन यह आपकी चिंता नहीं है!

    वास्तव में, IoC कंटेनर गरीब आदमी की निर्भरता इंजेक्शन के रूप में गुंजाइश के साथ स्पष्ट है। (मैं IoC कंटेनरों की तुलना गरीब आदमी के DI से करने जा रहा हूं क्योंकि उनकी तुलना किसी भी DI से नहीं करना अनुचित और भ्रमित करने वाला होगा। और, स्पष्ट होने के लिए, मैं "गरीब आदमी का DI" एक सहकर्मी के रूप में उपयोग नहीं कर रहा हूं।)

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

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

  2. मुझे अभी भी नहीं पता कि आप यहाँ क्या बात कर रहे हैं। क्या आईओसी कंटेनर अपने आंतरिक कार्यान्वयन के हिस्से के रूप में निजी गुणों को देखते हैं? मुझे नहीं पता कि वे क्यों करेंगे, लेकिन फिर से, अगर वे करते हैं, तो यह आपकी चिंता नहीं है कि आप जिस लाइब्रेरी का उपयोग कर रहे हैं वह कैसे लागू किया जाता है।

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

  3. यहाँ अंतिम बिंदु 2 के समान है। अधिकांश समय, IoC कंटेनर कंस्ट्रक्टर का उपयोग करते हैं! सेटर इंजेक्शन बहुत विशिष्ट परिस्थितियों के लिए पेश किया जाता है, जहां विशेष कारणों से, कंस्ट्रक्टर इंजेक्शन का उपयोग नहीं किया जा सकता है। कोई भी व्यक्ति जो इस बात को कवर करने के लिए हर समय सेटर इंजेक्शन का उपयोग करता है कि कितनी निर्भरताएं बीत रही हैं, बड़े पैमाने पर उपकरण को समाप्त कर रहा है। यह उपकरण की गलती नहीं है, यह उनका है।

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

    यह विशेष रूप से सच है क्योंकि यह कुछ ऐसा है जिसे आप गरीब आदमी के डीआई के साथ आसानी से कर सकते हैं:

    var myObject 
       = new MyTerriblyLargeObject { DependencyA = new Thing(), DependencyB = new Widget(), Dependency C = new Repository(), ... };
    

    तो वास्तव में, यह चिंता पूरी तरह से orthogonal लगती है कि क्या IoC कंटेनर का उपयोग किया जाता है या नहीं।

  4. यह बदलना कि आपकी कक्षाएं एक साथ कैसे काम करती हैं, ओसीपी का उल्लंघन नहीं है। यदि ऐसा होता है, तो सभी निर्भरता उलटा ओसीपी के उल्लंघन को प्रोत्साहित करेंगे। अगर ऐसा होता, तो वे दोनों एक ही SOLID में नहीं होते!

    इसके अलावा, न तो अंक a) और न ही b) OCP के साथ कुछ भी करने के करीब आते हैं। मैं यह भी नहीं जानता कि OCP के संबंध में इनका कैसे उत्तर दिया जाए।

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

और एक अंतिम बात जो आप कहते हैं:

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

हाँ, आप कर सकते हैं । आपके पास यह सोचने का कोई कारण नहीं है कि ये उपकरण- बड़ी संख्या में परियोजनाओं पर निर्भर हैं- किसी भी अन्य तृतीय-पक्ष पुस्तकालय की तुलना में किसी भी अधिक छोटी गाड़ी या अप्रत्याशित व्यवहार की संभावना है।

परिशिष्ट

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

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

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

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

void Bind(Type interfaceType, Type concreteType, bool singleton);
T Resolve<T>();

Bindकहते हैं, "जहां आपको एक प्रकार का एक निर्माता तर्क दिखाई देता है interfaceType, एक उदाहरण में पास करें concreteType"। अतिरिक्त singletonपैरामीटर कहता है कि क्या concreteTypeहर बार एक ही उदाहरण का उपयोग करना है , या हमेशा एक नया बनाना है।

Resolveबस Tकिसी भी निर्माता के साथ निर्माण करने की कोशिश करेंगे यह पा सकते हैं जिनके तर्क सभी प्रकार के हैं जो पहले से बाध्य हैं। यह सभी तरह से निर्भरता को हल करने के लिए खुद को पुनरावर्ती भी कह सकता है। यदि यह एक उदाहरण को हल नहीं कर सकता है क्योंकि सब कुछ बाध्य नहीं है, यह एक अपवाद फेंकता है।

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


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

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

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

2
4 के संबंध में, डिपेंडेंसी इंजेक्शन SOLID में नहीं है । 'डी' = 'डिपेंडेंसी इनवर्सन प्रिंसिपल', जो पूरी तरह से असंबंधित अवधारणा है।
astreltsov

@astr अच्छा बिंदु। मैंने "इंजेक्शन" को "उलटा" के साथ बदल दिया है क्योंकि मुझे लगता है कि मुझे पहली जगह में लिखने का मतलब है। यह अभी भी अति-सरलीकरण का एक सा है क्योंकि निर्भरता उलटा जरूरी कई ठोस कार्यान्वयन नहीं करता है , लेकिन मुझे लगता है कि अर्थ पर्याप्त रूप से स्पष्ट है। यह एक बहुरूपिक अमूर्तता पर निर्भर करने के लिए खतरनाक होगा यदि कार्यान्वयन को स्विच करना एक OCP उल्लंघन था।
बेन आरोनसन

27

IOC के कंटेनर इन सिद्धांतों को नहीं तोड़ते हैं?

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

प्रयोग में? पूर्ण रूप से।

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

आइए इसे अलग तरीके से देखें। आइए एक बहुत ही बुनियादी वर्ग पर विचार करें जिसमें एक एकल, बुनियादी निर्भरता है। यह एक Action, एक प्रतिनिधि या फ़नकार पर निर्भर करता है जो कोई पैरामीटर नहीं लेता है और रिटर्न करता है void। यह वर्ग की जिम्मेदारी क्या है? आप नहीं बता सकते। मैं उस निर्भरता को कुछ स्पष्ट कर सकता हूं जैसे CleanUpActionकि आपको लगता है कि यह वही करता है जो आप चाहते हैं। जैसे ही IoC खेल में आता है यह कुछ भी हो जाता है । कोई भी कॉन्फ़िगरेशन में जा सकता है और अपने सॉफ़्टवेयर को संशोधित करके बहुत अधिक मनमानी कर सकता है।

"वह कैसे Actionनिर्माणकर्ता में पास होने से अलग है ?" तुम पूछो। यह अलग है क्योंकि आप सॉफ़्टवेयर (या रनटाइम पर) तैनात होने के बाद कंस्ट्रक्टर में बदल नहीं सकते। यह अलग है क्योंकि आपकी इकाई परीक्षण (या आपके उपभोक्ताओं की इकाई परीक्षण) ने उन परिदृश्यों को कवर किया है जहां प्रतिनिधि को कंस्ट्रक्टर में पारित किया गया है।

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

"यह कैसे है कि पटकथा का उपयोग करने से लेकर चीजों को चलाने तक कोई भी अलग है? यह पूरी तरह से ठीक है।" आप में से कुछ पूछते हैं। यह अलग नहीं है। एक कार्यक्रम के डिजाइन के नजरिए से, कोई अंतर नहीं है। आप अपने प्रोग्राम से मनमाना कोड चलाने के लिए कह रहे हैं। और यकीन है, कि उम्र के लिए खेल में किया गया है। यह सिस्टम प्रशासन उपकरण के टन में किया जाता है। क्या यह OOP है? ज़रुरी नहीं।

उनकी वर्तमान सर्वव्यापकता के लिए कोई बहाना नहीं है। IoC कंटेनरों का एक ठोस उद्देश्य होता है - अपनी निर्भरता को एक साथ मिलाने के लिए जब आपके पास उनमें से बहुत सारे संयोजन होते हैं, या वे इतनी तेजी से शिफ्ट होते हैं कि उन निर्भरताओं को स्पष्ट करना अव्यावहारिक होता है। हालांकि बहुत कम व्यवसाय वास्तव में उस परिदृश्य को फिट करते हैं।


3
सही। और बहुत सारी दुकानों का दावा होगा कि उनका उत्पाद इतना जटिल है कि वे उस श्रेणी में आते हैं, जब वे वास्तव में नहीं करते हैं। जैसा कि कई परिदृश्यों के साथ सत्य है।
सुमेरे

12
लेकिन IoC आपके कहे के विपरीत है। यह कार्यक्रम के ओपन / क्लोजनेस को नियुक्त करता है। यदि आप स्वयं कोड को बदले बिना पूरे कार्यक्रम के व्यवहार को बदल सकते हैं।
व्यंग्यात्मक

6
@ सुंदर - विस्तार के लिए खुला, संशोधन के लिए बंद। यदि आप पूरे कार्यक्रम के व्यवहार को बदल सकते हैं, तो यह संशोधन के लिए बंद नहीं है, क्या यह है? IoC कॉन्फ़िगरेशन अभी भी आपका सॉफ्टवेयर है, यह अभी भी काम करने के लिए आपकी कक्षाओं द्वारा उपयोग किया जाने वाला कोड है - भले ही यह जावा या सी # के बजाय XML में हो या जो भी हो।
तेलेस्टिन

4
@Telastyn "संशोधन के लिए बंद" का मतलब है कि कोड को बदलने (संशोधित) करने के लिए, पूरे के व्यवहार को बदलने के लिए आवश्यक नहीं होना चाहिए। किसी भी बाहरी कॉन्फ़िगरेशन के साथ, आप इसे एक नए dll पर इंगित कर सकते हैं और एक संपूर्ण परिवर्तन का व्यवहार कर सकते हैं।
व्योम

12
@ टेलस्टीन ऐसा नहीं है जो खुले / बंद सिद्धांत कहता है। अन्यथा एक विधि जो पैरामीटर लेती है वह ओसीपी का उल्लंघन करती है क्योंकि मैं इसे अलग-अलग मापदंडों को पारित करके इसके व्यवहार को "संशोधित" कर सकता हूं। इसी तरह OCP के अपने संस्करण के तहत, यह DI के साथ सीधे संघर्ष में होगा, जो इसे विचित्र रूप से अजीब बना देगा, जो दोनों SOLE के संक्षिप्त रूप में दिखाई देंगे।
बेन आरोनसन

14

क्या IoC कंटेनर का उपयोग करना OOP / SOLID सिद्धांतों का अनिवार्य रूप से उल्लंघन करता है? नहीं

क्या आप IoC कंटेनरों का उपयोग इस तरह से कर सकते हैं कि वे OOP / SOLID सिद्धांतों का उल्लंघन करते हैं? जी हां

आईओसी कंटेनर आपके आवेदन में निर्भरता के प्रबंधन के लिए सिर्फ रूपरेखा हैं।

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

उदाहरण के लिए, ASP.NET WebForms, आपको प्रॉपर्टी इंजेक्शन का उपयोग करने की आवश्यकता है क्योंकि यह संभव नहीं है Page। यह समझ में आता है क्योंकि WebForms को कभी भी सख्त OOP प्रतिमानों को ध्यान में रखकर नहीं बनाया गया था।

दूसरी ओर ASP.NET MVC, बहुत ही OOP / SOLID अनुकूल कंस्ट्रक्टर इंजेक्शन का उपयोग करके IoC कंटेनर का उपयोग करना पूरी तरह से संभव है।

इस परिदृश्य में (कंस्ट्रक्टर इंजेक्शन का उपयोग करके), मेरा मानना ​​है कि यह निम्न कारणों के लिए ठोस सिद्धांतों को बढ़ावा देता है:

  • सिंगल रिस्पांसिबिलिटी प्रिंसिपल - कई छोटी कक्षाओं के होने से ये कक्षाएं बहुत विशिष्ट हो सकती हैं और इनमें मौजूदा का एक कारण है। एक IoC कंटेनर का उपयोग करना उन्हें व्यवस्थित करना बहुत आसान बनाता है।

  • ओपन / क्लोज्ड - यह वह जगह है जहां एक आईओसी कंटेनर का उपयोग वास्तव में चमकता है, आप अन्य निर्भरता को इंजेक्ट करके एक वर्ग की कार्यक्षमता का विस्तार कर सकते हैं। आपके द्वारा इंजेक्ट की जाने वाली निर्भरताएँ आपको उस वर्ग के व्यवहार को संशोधित करने देती हैं। एक अच्छा उदाहरण वर्ग को बदल रहा है जिसे आप कैशिंग या लॉगिंग कहने के लिए डेकोरेटर लिखकर इंजेक्ट कर रहे हैं। यदि आप उचित स्तर के अमूर्त में लिखे गए हैं, तो आप अपनी निर्भरता के कार्यान्वयन को पूरी तरह से बदल सकते हैं।

  • लिसकोव प्रतिस्थापन सिद्धांत - वास्तव में प्रासंगिक नहीं है

  • इंटरफ़ेस पृथक्करण सिद्धांत - यदि आप चाहें तो एक ही ठोस समय में कई इंटरफेस प्रदान कर सकते हैं, नमक के एक अनाज के लायक कोई भी आईओसी कंटेनर आसानी से ऐसा करेगा।

  • निर्भरता उलटा - IoC कंटेनरों आप आसानी से निर्भरता उलटा करते हैं।

आप निर्भरता का एक गुच्छा परिभाषित करते हैं और रिश्तों और scopes की घोषणा करते हैं, और बैंग बैंग बूम: आप जादुई रूप से कुछ addon हैं जो आपके कोड या IL को कुछ बिंदु पर बदल देता है और चीजों को काम करता है। यह स्पष्ट या पारदर्शी नहीं है।

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

मैं सहमत हूं कि जब मैं आईओसी कंटेनरों का उपयोग करके कोड लिखता हूं या पढ़ता हूं, तो यह थोड़ा असंगत कोड से छुटकारा दिलाता है।

यह OOP / SOLID का पूरा कारण है, सिस्टम को प्रबंधनीय बनाता है। उस लक्ष्य के साथ एक आईओसी कंटेनर का उपयोग करना इनलाइन है।

उस वर्ग के लेखक कहते हैं, "अगर हमने IOC कंटेनर का उपयोग नहीं किया, तो कंस्ट्रक्टर के पास एक दर्जन पैरामीटर होंगे! यह भयानक है!"

12 निर्भरता वाला एक वर्ग शायद एसआरपी उल्लंघन है चाहे आप इसे किस संदर्भ में उपयोग कर रहे हों।


2
बहुत बढ़िया जवाब। इसके अतिरिक्त, मुझे लगता है कि सभी प्रमुख आईओसी कंटेनर भी एओपी का समर्थन करते हैं, जो ओसीपी के साथ बहुत मदद कर सकते हैं। क्रॉस-कटिंग चिंताओं के लिए, AOP आमतौर पर एक डेकोरेटर की तुलना में अधिक OCP- अनुकूल मार्ग है।
बेन आरोनसन

2
@BenAaronson को देखते हुए कि AOP एक वर्ग में कोड इंजेक्ट करता है, मैं इसे और अधिक OCP- अनुकूल नहीं कहूंगा। आप जबरदस्ती कंपाइल / रनटाइम पर क्लास खोल रहे हैं और बदल रहे हैं।
डोभाल

1
@ डोवल मैं यह नहीं देखता कि यह एक कक्षा में कोड को कैसे इंजेक्ट कर रहा है। नोट मैं कैसल डायनेमिक प्रॉक्सि स्टाइल के बारे में बात कर रहा हूं, जहां आपके पास आईएल-बुनाई शैली के बजाय एक इंटरसेप्टर है। लेकिन एक इंटरसेप्टर अनिवार्य रूप से सिर्फ एक डेकोरेटर है जो कुछ प्रतिबिंब का उपयोग करता है ताकि उसे किसी विशेष इंटरफ़ेस से खुद को जोड़े नहीं।
बेन आरोनसन

"निर्भरता उलटा - IoC कंटेनरों आप आसानी से निर्भरता उलटा करते हैं" - वे नहीं है, वे बस कुछ है कि क्या आप IoC है या नहीं फायदेमंद है लाभ उठा रहे हैं। अन्य सिद्धांतों के साथ भी।
डेन

मुझे वास्तव में स्पष्टीकरण का तर्क नहीं मिलता है कि कुछ इस तथ्य पर आधारित नहीं है, कि यह एक रूपरेखा है। ServiceLocators को चौखटे के रूप में भी बनाया जाता है और उन्हें बुरा माना जाता है :)।
ipavlu

5

आईओसी के कंटेनर दोनों को नहीं तोड़ते हैं, और कोडर को बहुत सारे ओओपी / सोलिड सिद्धांतों को तोड़ने की अनुमति देते हैं?

staticसी # में कीवर्ड डेवलपर्स OOP / ठोस सिद्धांतों का एक बहुत तोड़ने के लिए अनुमति देता है लेकिन यह अभी भी सही परिस्थितियों में एक वैध उपकरण है।

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

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


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

2
@Samamere - मुझे लगता है कि आप IOC की परिभाषा का बहुत व्यापक उपयोग कर सकते हैं। मैं जो उपयोग करता हूं वह संकलित कोड को संशोधित नहीं करता है। बहुत सारे अन्य गैर-आईओसी उपकरण हैं जो संकलित कोड को भी संशोधित करते हैं। शायद आपका शीर्षक अधिक होना चाहिए: "क्या संकलित कोड ब्रेक को संशोधित करता है ..."।
सेराड

@Samamere मैं IoC के साथ अनुभवी नहीं हूँ, लेकिन मैंने IoC को संकलित कोड को बदलते हुए कभी नहीं सुना। क्या आप कृपया इस बारे में जानकारी प्रदान करेंगे कि आप किन प्लेटफार्मों / भाषाओं / रूपरेखाओं के बारे में बात कर रहे हैं।
व्यंग्यात्मक

1
"एक आईओसी कंटेनर का उपयोग एसओएलआईडी सिद्धांतों को बहुत आसान बनाने के लिए किया जा सकता है।" - क्या आप कृपया विस्तार से बता सकते हैं? यह बताना कि प्रत्येक सिद्धांत के साथ यह विशेष रूप से कैसे मदद करता है। और निश्चित रूप से कुछ का लाभ उठाने के रूप में कुछ होने में मदद नहीं करता है (जैसे DI)।
डेन

1
@Euphoric मैं .net चौखटे के बारे में नहीं जानता कि सरामेरे के बारे में बात कर रहा था, लेकिन स्प्रिंग निश्चित रूप से हुड कोड संशोधन करता है। सबसे स्पष्ट उदाहरण विधि-आधारित इंजेक्शन के लिए इसका समर्थन है (जिससे यह आपकी कक्षा में एक सार विधि को ओवरराइड करता है जो एक निर्भरता का प्रबंधन करता है)। यह अतिरिक्त व्यवहार (जैसे स्वचालित रूप से लेनदेन के प्रबंधन के लिए) प्रदान करने के लिए अपने कोड को लपेटने के लिए ऑटो-जेनरेट किए गए परदे के पीछे का व्यापक उपयोग करता है। हालांकि, यह वास्तव में DI फ्रेम के रूप में अपनी भूमिका से संबंधित नहीं है।
जूल्स

3

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

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

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

तो, आपके प्रश्न का उत्तर नहीं है। IoC कंटेनर OOP डिज़ाइन सिद्धांतों को नहीं तोड़ते हैं। इसके विपरीत, वे SOLID सिद्धांतों (विशेष रूप से निर्भरता-उलटा सिद्धांत) के कारण होने वाली समस्याओं को हल करते हैं।


हाल ही में एक गैर-तुच्छ परियोजना के लिए IoC (ऑटोफेक) लगाने की कोशिश की। एहसास हुआ कि मुझे गैर-भाषा निर्माण (नई () बनाम एपीआई) के साथ एक समान काम करना था: निर्दिष्ट करना कि इंटरफेस के लिए क्या हल किया जाना चाहिए और कंक्रीट कक्षाओं में क्या हल किया जाना चाहिए, यह निर्दिष्ट करते हुए कि क्या एक उदाहरण होना चाहिए और एक सिंगलटन क्या होना चाहिए, सुनिश्चित करें कि संपत्ति इंजेक्शन एक परिपत्र निर्भरता को कम करने के लिए सही काम करता है। त्यागने का निर्णय लिया। हालांकि एएसपी MVC में नियंत्रकों के साथ अच्छी तरह से काम करता है।
डेन

@ अपने प्रोजेक्ट को स्पष्ट रूप से निर्भरता को ध्यान में रखते हुए नहीं बनाया गया था। और कहीं नहीं मैंने कहा कि IoC का उपयोग तुच्छ है।
व्यंग्यात्मक

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

@ आप तकनीकी रूप से इंटरफेस का उपयोग करने के लिए "की जरूरत नहीं है"। इकाई परीक्षण के लिए मॉकिंग में इंटरफेस मदद करता है। आप उन चीज़ों को भी चिन्हित कर सकते हैं जिन्हें आपको वर्चुअल मॉक करने की आवश्यकता है।
फ्रेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.