DI कंटेनरों की कुंजी अमूर्तता है । DI कंटेनर आपके लिए इस डिज़ाइन चिंता को अमूर्त करते हैं। जैसा कि आप अनुमान लगा सकते हैं, इसका कोड पर ध्यान देने योग्य प्रभाव है, जिसे अक्सर कम संख्या में निर्माणकर्ताओं, बसने वालों, कारखानों और बिल्डरों में अनुवादित किया जाता है। परिणाम में, वे आपके कोड को अधिक शिथिल (अंतर्निहित IoC के कारण ), क्लीनर और सरल बनाते हैं । हालांकि बिना लागत के नहीं।
पृष्ठभूमि
वर्षों पहले, ऐसी अमूर्तता के लिए हमें विभिन्न कॉन्फिग फाइल ( डिक्लेक्टिव प्रोग्रामिंग ) लिखने की आवश्यकता थी । यह LOC की संख्या को काफी हद तक कम होते देखना शानदार था, लेकिन जब LOCS में कमी हुई, तो कॉन्फिग फाइलों की संख्या थोड़ी बढ़ गई। मध्यम या छोटी परियोजनाओं के लिए यह एक समस्या नहीं थी, लेकिन बड़ी परियोजनाओं के लिए, कोड की "असेंबली" होने के लिए कोड और XML विवरणकों के बीच 50% बिखरे हुए थे ... फिर भी, मुख्य समस्या सबसे बड़ी थी प्रतिमान। यह काफी अनम्य था क्योंकि विवरणकर्ताओं ने अनुकूलन के लिए बहुत कम जगह छोड़ी थी।
प्रतिमान उत्तरोत्तर विन्यास पर अधिवेशन की ओर स्थानांतरित हो गया , जो एनोटेशन या विशेषताओं के लिए फ़ाइलों को कॉन्फ़िगर करता है। यह हमारे कोड को क्लीनर और सरल रखता है जबकि हमें वह लचीलापन प्रदान करता है जो XML नहीं कर सकता था।
शायद, यह इस बात का सबसे महत्वपूर्ण अंतर है कि आप अब तक कैसे काम कर रहे थे। कम कोड और अधिक जादू।
नीचे की ओर...
कॉन्फ़िगरेशन पर कन्वेंशन अमूर्तता को इतना भारी बना देता है कि आप मुश्किल से जानते हैं कि यह कैसे काम करता है। कभी-कभी जादू लगता है और यहां एक और कमी आती है। एक बार काम करने के बाद, कई डेवलपर्स इस बात की परवाह नहीं करते हैं कि यह कैसे काम करता है।
यह उन लोगों के लिए एक बाधा है जिन्होंने DI कंटेनरों के साथ DI सीखा। वे पूरी तरह से डिजाइन पैटर्न, अच्छी प्रथाओं और कंटेनर द्वारा अमूर्त सिद्धांतों की प्रासंगिकता को नहीं समझते हैं। मैंने डेवलपर्स से पूछा है कि क्या वे डीआई और उसके फायदों से परिचित थे और उन्होंने उत्तर दिया: - हां, मैंने स्प्रिंग आईओसी का उपयोग किया है । (इसका क्या मतलब है?)
इनमें से प्रत्येक "कमियां" से सहमत या नहीं हो सकता है। मेरी विनम्र राय में, यह जानना आवश्यक है कि आपके प्रोजेक्ट में क्या हो रहा है। अन्यथा, हमें इसकी पूरी समझ नहीं है। यह भी जानना है कि DI क्या है और इसे कैसे लागू किया जाए, इस पर विचार करने के लिए एक विचार है।
सकारात्मक स्थिति की ओर...
एक शब्द उत्पादकता । फ्रेमवर्क हमें इस बात पर ध्यान केंद्रित करते हैं कि वास्तव में क्या मायने रखता है। अनुप्रयोग का व्यवसाय।
कमियों के बावजूद, हम में से कई के लिए (जो काम समय सीमा और लागत से वातानुकूलित है), ये उपकरण एक अमूल्य संसाधन हैं। मेरी राय में, डि कंटेनर को लागू करने के पक्ष में यह हमारा मुख्य तर्क होना चाहिए। उत्पादकता ।
परिक्षण
चाहे हम शुद्ध डीआई या कंटेनरों को लागू करें, परीक्षण एक समस्या नहीं है। काफी विपरीत। एक ही कंटेनर अक्सर हमें बॉक्स के बाहर इकाई परीक्षण के लिए मोक्स प्रदान करते हैं। वर्षों के दौरान मैंने थर्मामीटर के रूप में अपने परीक्षणों का उपयोग किया है। वे मुझे बताते हैं कि क्या मैंने कंटेनरों की सुविधाओं पर बहुत भरोसा किया है। मैं यह कहता हूं क्योंकि ये कंटेनर बसने वाले या निर्माणकर्ताओं के बिना निजी विशेषताओं को शुरू कर सकते हैं। वे किसी भी स्थान पर लगभग घटकों को इंजेक्ट कर सकते हैं!
सही लुभावना लगता है? सावधान रहे! जाल में मत पड़ो !!
सुझाव
यदि आप कंटेनर को लागू करने का निर्णय लेते हैं, तो मैं दृढ़ता से सुझाव देता हूं कि अच्छी प्रथाओं के साथ चिपके रहें। कंस्ट्रक्टर, सेटर और इंटरफेस को लागू करना जारी रखें। उनका उपयोग करने के लिए फ्रेमवर्क / कंटेनर को लागू करें । यह दूसरे ढांचे के लिए संभावित पलायन को आसान बना देगा या वास्तविक को हटा देगा। यह कंटेनर पर निर्भरता को काफी कम कर सकता है।
इस प्रथा के बारे में:
DI कंटेनरों का उपयोग कब करें
मेरा जवाब खुद के अनुभव से पक्षपाती होने वाला है जो मुख्य रूप से DI कंटेनरों के पक्ष में है (जैसा कि मैंने टिप्पणी की, मैं उत्पादकता पर बहुत अधिक ध्यान केंद्रित कर रहा हूं, इसलिए मुझे शुद्ध DI की आवश्यकता कभी नहीं हुई। इसके विपरीत)।
मुझे लगता है कि आपको इस विषय के बारे में दिलचस्प मार्क सीमेन का लेख मिलेगा , जो इस सवाल का भी जवाब देता है कि शुद्ध डीआई को कैसे लागू किया जाए ।
अंत में, अगर हम जावा की बात कर रहे हैं, तो मैं सबसे पहले JSR330 - डिपेंडेंसी इंजेक्शन पर एक नज़र डालूंगा ।
सारांश
लाभ :
- लागत में कटौती और समय की बचत। उत्पादकता।
- घटकों की एक छोटी संख्या।
- कोड सरल और साफ हो जाता है।
कमियां :
- DI को तीसरे पक्ष के परिवादों में सौंपा गया है। हमें उनके व्यापार, ताकत और कमजोरी के बारे में पता होना चाहिए।
- सीखने की अवस्था।
- वे जल्दी से आपको कुछ अच्छी आदतें भूल जाते हैं।
- परियोजना की निर्भरता में वृद्धि (अधिक ब्याज)
- प्रतिबिंब पर आधारित कंटेनरों में अधिक संसाधनों (मेमोरी) की आवश्यकता होती है। यह महत्वपूर्ण है अगर हम संसाधनों से विवश हैं।
शुद्ध डि के साथ अंतर :
- कम कोड और अधिक विन्यास फाइल या एनोटेशन।