क्या हाथ से निर्भरता इंजेक्शन रचना और बहुरूपता का बेहतर विकल्प है?


13

सबसे पहले, मैं एक एंट्री लेवल प्रोग्रामर हूं; वास्तव में, मैं गर्मियों में एक अंतिम कैपस्टोन परियोजना के साथ एक एएस डिग्री पूरा कर रहा हूं। मेरी नई नौकरी में, जब मेरे लिए कुछ प्रोजेक्ट नहीं है (वे टीम को और नए कामों से भरने के लिए इंतजार कर रहे हैं), मुझे किताबें पढ़ने और सीखने के लिए दी गई हैं जबकि मैं प्रतीक्षा करता हूं - कुछ पाठ्यपुस्तकें, अन्य इतना नहीं (जैसे कोड पूरा)। इन पुस्तकों के माध्यम से जाने के बाद, मैंने जितना संभव हो उतना सीखने के लिए इंटरनेट की ओर रुख किया है, और SOLID और DI के बारे में सीखना शुरू कर दिया है (हमने Liskov के प्रतिस्थापन सिद्धांत के बारे में कुछ बात की, लेकिन बहुत ज्यादा SOLID विचारों के बारे में नहीं)। इसलिए जैसा कि मैंने सीखा है, मैं बेहतर सीखने के लिए करने के लिए बैठ गया, और हाथ से DI का उपयोग करने के लिए कुछ कोड लिखना शुरू कर दिया (विकास कंप्यूटर पर कोई DI फ्रेम नहीं हैं)।

बात यह है, जैसा कि मैं करता हूं, मुझे लगता है कि यह परिचित लगता है ... और ऐसा लगता है कि यह बहुत काम की तरह है जो मैंने अतीत में पॉलीमॉर्फिज़्म का उपयोग करके अमूर्त वर्गों की रचना का उपयोग किया है। क्या मुझे यहाँ एक बड़ी तस्वीर याद आ रही है? क्या डीआई (कम से कम हाथ से) के बारे में कुछ ऐसा है जो इससे परे है? मैं कुछ डीआई फ्रेमवर्क के कोड में कॉन्फ़िगरेशन को नहीं होने की संभावना समझता हूं, जहां तक ​​कुछ चीजों को बदलने के बिना कुछ महान लाभ हैं, लेकिन जब यह हाथ से कर रहा है, तो मुझे यकीन नहीं है कि यह ऊपर बताए गए से अलग है ... इस में कुछ अंतर्दृष्टि बहुत मददगार होगा!

जवाबों:


21

DI में मौलिक विचार केवल वस्तुओं को बाहर से निर्भरता खींचने देने के बजाय वस्तुओं में निर्भरता को आगे बढ़ाने के लिए है। इसे पहले "नियंत्रण का व्युत्क्रम" भी कहा जाता था। यह एक निर्भरता को बहुत बेहतर नियंत्रित करने की अनुमति देता है, और - अंतिम लेकिन कम से कम - कोड लिखने के लिए जो इकाई परीक्षण के लिए आसान है।

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

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

अपने शीर्षक प्रश्न पर लौटने के लिए, DI रचना का विकल्प नहीं है और न ही बहुरूपता; आखिरकार, यह इन दोनों द्वारा ही संभव है।


1
डिपेंडेंसी इंजेक्शन (DI), इनवर्सन ऑफ कंट्रोल (IoC) का एक रूप है।
मैथ्यू फ्लिन

@MatthewFlynn, वास्तव में। संदर्भ के लिए: martinfowler.com/articles/injection.html
Péter Török

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

उफ़ - मुझे "वास्तव में" याद आया। मुझे लगा कि आप मेरा विरोध कर रहे हैं ... क्षमा करें।
मैथ्यू फ्लिन

आपका अंतिम पैराग्राफ मुझे थोड़ा बेहतर महसूस कराता है; पूरे समय मैं अपने छोटे से सीखने के प्रोजेक्ट पर काम कर रहा था, मैं खुद से कहता रहा, "यह बहुरूपता जैसा लगता है .."। दुर्भाग्य से, .Net और c # मेरी नौकरी से बहुत बुरी तरह से बाहर है, लेकिन इस पर गौर करने से, एकता C # फ्रेमवर्क में निर्मित है जिसके बारे में आप बात कर रहे हैं?
ड्रेक क्लेरिस

22

इस विषय पर मैंने जो सबसे अच्छा लेख पढ़ा है वह जेम्स शोर का था । मैं अमूर्त और बहुरूपता के हिस्से के रूप में, उम्र के लिए " DI बाय हैंड " कर रहा हूं । इसलिए जब मैं पेशेवर दुनिया में आया और मैंने यह सुनना जारी रखा कि मेरे चारों ओर फेंका जाने वाला शब्द मेरे बीच एक बड़ा डिस्कनेक्ट था जो मुझे लगा कि शब्द का अर्थ होना चाहिए और वास्तव में इसका क्या अर्थ है:

"निर्भरता इंजेक्शन" 5-प्रतिशत अवधारणा के लिए 25-डॉलर का शब्द है।

यह शोर के पद से है, जिसने मेरे लिए सब कुछ साफ कर दिया। उदाहरण के लिए:

दिया हुआ

class Engine {public abstract void start()}
class V8 extends Engine {...}
class V6 extends Engine {...}

लिखने के बजाय:

class Car
{
    private Engine engine;
    public Car()
    {
        this.engine = new V6();
    }

    public void start()
    {
        this.engine.start();
    }
}

आपका लेखन कुछ इस तरह है:

class Car
{
    private Engine engine;
    public Car(Engine a)
    {
        this.engine = a;
    }

    public void start()
    {
        this.engine.start();
    }
}

...

Car F = new Car(new V8());

और यह Carउदाहरण को विशिष्ट Engineविवरणों को संभालने से रोकता है । एक कार को बस एक इंजन की आवश्यकता होती है, यह परवाह नहीं करता है कि जब तक यह बुनियादी इंजन की कार्यक्षमता को लागू करता है। यही है, आपकी Carकक्षा विशिष्ट कार्यान्वयन निर्भरता से जुड़ी नहीं है; यह कहीं और, संभवत: रनटाइम पर "इंजेक्ट" है।

यह विशिष्ट कार उदाहरण "कन्स्ट्रक्टर इंजेक्शन" नामक DI के उप-प्रकार का उपयोग करता है, जिसका अर्थ है कि निर्भरता को एक निर्माता तर्क के रूप में सौंप दिया गया था। आप setEngine(Engine a)"सेटर इंजेक्शन" के लिए एक विधि का उपयोग कर सकते हैं , और इसी तरह, लेकिन ये उप-प्रकार मुझे पांडित्यपूर्ण लगते हैं।

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

बस।


0

मैं कोई विशेषज्ञ नहीं हूं क्योंकि मैंने केवल पिछले कुछ वर्षों में DI का उपयोग करना शुरू किया था, लेकिन मेरे द्वारा देखे गए डि कंटेनर के कुछ उपयोगी विषय / कार्यात्मकताएं हैं (जो कि मैं रचना / बहुरूपता के उत्पादों के रूप में नहीं सोचता हूं) (लेकिन मैं उस पर सही होने के लिए खड़ा हो सकता हूं):

  • वस्तु निर्माण का केंद्रीय केंद्र
  • प्रति थ्रेड के आधार पर सिंगलटन प्रदान करते हैं
  • अंतर उन्मुख तकनीक जैसे कि अवरोधन

0

DI के अलावा, रूट एप्लिकेशन (xml का उपयोग करके कॉन्फ़िगर करने के बजाय) पर एक क्लास कंपोज़िशन कॉन्फ़िगरेशन है। किसी भी DI या IoC ढांचे की कोई आवश्यकता नहीं है, भले ही वे विशेष रूप से बड़ी परियोजनाओं के लिए वर्ग संरचना विन्यास को साफ कर सकते हैं। इसका कारण यह है कि डीआई फ्रेमवर्क सामान्य रूप से कंटेनर के साथ आते हैं जो अतिरिक्त सुविधाओं को लागू करते हैं, जैसे ऑटो-वायरिंग, जो वर्ग रचना को कॉन्फ़िगर करने में मदद करता है। इस विषय पर मेरी समझ निकालने के लिए आप मेरे ब्लॉग प्रविष्टि को पढ़ सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.