निर्भरता इंजेक्शन करने के सर्वोत्तम तरीके के बारे में एक पुरानी, पुरानी चल रही बहस है।
वसंत की मूल कटौती ने एक सादे वस्तु को बदल दिया, और फिर सेटर विधियों के बावजूद निर्भरता को इंजेक्ट किया।
लेकिन तब लोगों की एक बड़ी आकस्मिकता ने जोर देकर कहा कि कंस्ट्रक्टर मापदंडों के माध्यम से निर्भरता को इंजेक्शन करना सही तरीका था।
फिर, हाल ही में, जैसा कि प्रतिबिंब का उपयोग करना अधिक सामान्य हो गया, निजी सदस्यों के मूल्यों को सीधे स्थापित करना, बिना बसने या निर्माण करने वाले आर्ग के बिना, क्रोध बन गया।
तो आपका पहला कंस्ट्रक्टर निर्भरता इंजेक्शन के दूसरे दृष्टिकोण के अनुरूप है। यह आपको परीक्षण के लिए इंजेक्शन मॉक जैसी अच्छी चीजें करने की अनुमति देता है।
लेकिन नो-लॉजिक कंस्ट्रक्टर को यह समस्या है। चूंकि यह कार्यान्वयन कक्षाओं के लिए तात्कालिक है PaypalCreditCardProcessor
और DatabaseTransactionLog
, यह पेपाल और डेटाबेस पर एक कठिन, संकलन-समय निर्भरता बनाता है। यह उस संपूर्ण निर्भरता के पेड़ को सही ढंग से बनाने और कॉन्फ़िगर करने की जिम्मेदारी लेता है।
कल्पना करें कि PayPay प्रोसेसर वास्तव में एक जटिल सबसिस्टम है, और अतिरिक्त रूप से बहुत सारे लाइब्रेरियों में खींचता है। उस कार्यान्वयन वर्ग पर एक संकलन-समय निर्भरता बनाकर, आप उस संपूर्ण निर्भरता ट्री के लिए एक अटूट लिंक बना रहे हैं। आपके ऑब्जेक्ट ग्राफ की जटिलता केवल परिमाण के एक क्रम से कूद गई है, शायद दो।
निर्भरता के पेड़ में उन वस्तुओं का एक बहुत कुछ पारदर्शी होगा, लेकिन उनमें से बहुत से को तत्काल करने की आवश्यकता होगी। ऑड्स हैं, आप सिर्फ एक पल के लिए सक्षम नहीं होंगे PaypalCreditCardProcessor
।
तात्कालिकता के अलावा, प्रत्येक ऑब्जेक्ट को कॉन्फ़िगरेशन से लागू किए गए गुणों की आवश्यकता होगी।
यदि आपके पास केवल इंटरफ़ेस पर निर्भरता है, और एक बाहरी कारखाने को निर्भरता बनाने और इंजेक्ट करने की अनुमति है, तो आप पूरे पेपल निर्भरता पेड़ को काट देते हैं, और आपके कोड की जटिलता इंटरफ़ेस पर रुक जाती है।
अन्य लाभ हैं, जैसा कि कॉन्फ़िगरेशन में कार्यान्वयन कक्षाएं निर्दिष्ट करने के लिए किया जा रहा है (यानी संकलन समय के बजाय रनटाइम पर), या अधिक गतिशील निर्भरता विनिर्देश है जो पर्यावरण, परीक्षण, एकीकरण, उत्पादन द्वारा भिन्न होता है।
उदाहरण के लिए, मान लें कि पेपालप्रोसेसर में 3 आश्रित वस्तुएं थीं, और उनमें से प्रत्येक पर निर्भरता के दो और अधिक थे। और उन सभी वस्तुओं को विन्यास से गुणों में खींचना है। के रूप में कोड सब बाहर निर्माण की जिम्मेदारी ग्रहण करेगा, कॉन्फ़िगरेशन से गुण सेट करना, इत्यादि - सभी चिंताएं जिन्हें डीआई फ्रेमवर्क ध्यान रखेगा।
यह पहली बार में स्पष्ट नहीं हो सकता है कि आप डीआई फ्रेमवर्क का उपयोग करके खुद को ढाल रहे हैं, लेकिन यह समय के साथ और स्पष्ट रूप से स्पष्ट हो जाता है। (योग्य मैं इसे कठिन तरीके से करने की कोशिश के अनुभव से बोलता हूं)
...
व्यवहार में, यहां तक कि वास्तव में एक छोटे से कार्यक्रम के लिए, मुझे लगता है कि मैं एक डीआई शैली में लेखन को समाप्त करता हूं, और कार्यान्वयन / कारखाने जोड़े में कक्षाओं को तोड़ता हूं। यही है, अगर मैं वसंत की तरह एक डीआई फ्रेमवर्क का उपयोग नहीं कर रहा हूं, तो मैं बस कुछ सरल कारखाने वर्गों को एक साथ फेंक देता हूं।
यह चिंता का अलगाव प्रदान करता है ताकि मेरी कक्षा बस यह काम कर सके, और फ़ैक्टरी वर्ग सामान बनाने और कॉन्फ़िगर करने की ज़िम्मेदारी लेता है।
आवश्यक दृष्टिकोण नहीं, लेकिन एफडब्ल्यूआईडब्ल्यू
...
आम तौर पर, डीआई / इंटरफ़ेस पैटर्न दो चीजों को करके आपके कोड की जटिलता को कम करता है:
उस के शीर्ष पर, चूंकि ऑब्जेक्ट इंस्टेंटेशन और कॉन्फ़िगरेशन एक बहुत ही परिचित कार्य है, इसलिए डीआई फ्रेमवर्क मानकीकृत अंकन और प्रतिबिंब जैसी चाल का उपयोग करके पैमाने की बहुत सारी अर्थव्यवस्थाओं को प्राप्त कर सकता है। वर्गों के चारों ओर उन्हीं चिंताओं को फैलाने से एक बहुत अधिक अव्यवस्था बढ़ जाती है जो एक से अधिक होती है।