208

dependency injection को समझाने का एक अच्छा तरीका क्या है?5 साल के लिए निर्भरता इंजेक्शन की व्याख्या कैसे करें?

मुझे Google पर कई ट्यूटोरियल मिले, लेकिन उनमें से कोई भी जो पाठक को मानता है वह केवल एक जावा शुरुआतकर्ता नहीं है। आप नौसिखिए को यह कैसे समझाएंगे?

+72

उस बच्चे की तरह कठिन जीवन के लिए लगता है ... –

+24

"एक बार एक समय ....." के साथ शुरू करें – Martin

+8

उसे निर्भरता इंजेक्शन या प्रोग्रामिंग से संबंधित कुछ भी नहीं सिखाएं ...... उसे आनंद लें जीवन – Xinus

उत्तर

790

मैं आपको पांच साल के बच्चों के लिए निर्भरता इंजेक्शन देता हूं।

जब आप जाते हैं और अपने लिए रेफ्रिजरेटर से चीजें निकालते हैं, तो आप समस्याएं पैदा कर सकते हैं। आप दरवाजा खोल सकते हैं, आपको कुछ माँ या डैडी मिल सकती है जो आपको नहीं चाहिए। हो सकता है कि आप ऐसी किसी चीज़ की तलाश भी कर रहे हों जो हमारे पास नहीं है या जो समाप्त हो गया है।

आपको क्या करना चाहिए, "मुझे दोपहर के भोजन के साथ पीने के लिए कुछ चाहिए" और फिर हम यह सुनिश्चित करेंगे कि आप खाने के लिए बैठे समय कुछ लेंगे।

+47

+1 - बहुत अच्छा – Bob

+33

यह उत्तर स्थान जा रहा है। –

+3

बिल्कुल शानदार। +1 –

10

मैं किसी भी सरलीकृत ट्यूटोरियल का पता नहीं है, लेकिन मैं आपको एक लगभग 250 शब्दों या कम संस्करण दे सकते हैं:

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

यह परीक्षण के लिए बेहतर है, यह बेहतर है जब एप्लिकेशन को संशोधित करने का समय आता है। एक सामान्य कार्यान्वयन एक्सएमएल में कॉन्फ़िगरेशन डालता है और गतिशील रूप से कक्षाओं को लोड करने के लिए एक ढांचे का उपयोग करता है।

93

इसके बारे में क्या?

class Employee { 
    private Address address; 

    // constructor 
    public Employee(Address newAddress) { 
     this.address = newAddress; 
    } 

    public Address getAddress() { 
    return this.address; 
    } 
    public void setAddress(Address newAddress) { 
     this.address = newAddress; 
    } 
} 

सब कुछ अब तक ठीक लग रहा है:

आप एक वर्ग Employee है और इस कर्मचारी एक Address है तो वह Employee वर्ग इस प्रकार के रूप में परिभाषित कर सकते हैं।

यह कोड एचएएस-ए कर्मचारी और उसके पते के बीच संबंध दिखाता है, यह ठीक है।

अब, यह HAS-A संबंधों के बीच एक निर्भरता पैदा हुई। समस्या कन्स्ट्रक्टर के भीतर आता है।

Address someAddress = .... 
Employee oscar = new Employee(someAddress); 

इस तरह से काम कर रहे समस्याग्रस्त हो जाता है विशेष रूप से आप इकाई परीक्षण प्रदर्शन करने के लिए चाहते हैं जब:

हर बार जब आप एक Employee उदाहरण बनाना चाहते हैं तो आप एक Address उदाहरण की जरूरत है।

मुख्य समस्या तब होती है जब आपको किसी विशेष वस्तु का परीक्षण करने की आवश्यकता होती है, आपको अन्य ऑब्जेक्ट का एक उदाहरण बनाने की आवश्यकता होती है, और संभवत: आपको ऐसा करने के लिए अन्य ऑब्जेक्ट बनाने की आवश्यकता है। श्रृंखला अप्रबंधनीय हो सकती है।एक नहीं args निर्माता का उपयोग करना

public Employee(){ 
    } 

:

इससे बचने के लिए आप इस तरह निर्माता बदल सकता है।

तो फिर तुम पता सेट कर सकते हैं जब कभी आप चाहते हैं:

Address someAddress = .... 
Employee oscar = new Employee(); 
oscar.setAddress(someAddress); 

अब, यह एक खींचें हो सकता है, अगर आपके पास कई गुण या वस्तुओं को बनाने के लिए कड़ी मेहनत कर रहे हैं।

फिर भी, इस बारे में सोचते, मान लें, तो आप Department विशेषता जोड़ें: आप 300 कर्मचारी हैं, तो और उन सभी ही विभाग की आवश्यकता है, और अधिक है कि एक ही विभाग

class Employee { 
     private Address address; 
     private Department department; 

    .... 

कुछ अन्य वस्तुओं (जैसे विभागों की कंपनी सूची, या प्रत्येक विभाग की भूमिका आदि) के बीच साझा किया जाना है, तो आपको Department ऑब्जेक्ट की दृश्यता के साथ कठिन समय होगा और वस्तुओं के सभी नेटवर्क के माध्यम से इसे साझा करना होगा।

क्या निर्भरता इंजेक्शन सब के बारे में यह मदद करने के लिए आप के लिए, ठीक है, अपने कोड में ये निर्भरता "इंजेक्षन" है। अधिकांश ढांचे आपको बाहरी फाइल में निर्दिष्ट करके ऐसा करने की अनुमति देते हैं, किस वस्तु को इंजेक्शन दिया जाना है।

मान लें एक गुण एक काल्पनिक निर्भरता इंजेक्टर के लिए फ़ाइल:

#mock employee 
    employee.address = MockAddress.class 
    employee.department = MockDepartment.class 

    #production setup 
    employee.address = RealAddress.class 
    employee.department = RealDepartment.class 

आप क्या किसी दिए गए परिदृश्य के लिए सुई को परिभाषित करेंगे।

निर्भरता इंजेक्टर फ्रेमवर्क आपके लिए सही ऑब्जेक्ट्स सेट करने के लिए क्या करेगा, इसलिए आपको setAddress या setDepartment कोड कोड करने की आवश्यकता नहीं है। यह प्रतिबिंब या कोड पीढ़ी या अन्य तकनीकों द्वारा किया जाएगा।

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

यह इसके बारे में काफी कुछ है।

फिर भी मुझे नहीं लगता कि यह स्पष्टीकरण आपके अनुरोध के अनुसार 5 वर्ष पुराने के लिए उपयुक्त है।

मुझे आशा है कि आपको अभी भी यह उपयोगी लगेगा।

+3

या: निर्भरता इंजेक्शन तब होता है जब आपके पास * कुछ * निर्भरता निर्धारित करता है। यह आमतौर पर एक ढांचा है। :) – OscarRyz

+2

वास्तव में एक बहुत ही स्मार्ट एक है। – OscarRyz

24

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

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

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

+5

यह एक बुरा मजाक नहीं है: डी –

7

जब आप एक नया Nintendo के आधार पर प्राप्त, तो आप सिर्फ बटन और टच स्क्रीन गेम खेलने के लिए उपयोग कर सकते हैं।

लेकिन Nintendo कारखाने में, वे जानते हैं कि कैसे एक साथ रखा करने की जरूरत है।

जब कारखाने में स्मार्ट लोगों को एक Nintendo DS बाहर लाने, इसके अंदर अलग होगा, लेकिन आप अभी भी यह कैसे उपयोग करने के लिए पता चल जाएगा।

+5

यह इंटरफेस या बहुरूपता के वर्णन की तरह लगता है, लेकिन मैं आपको 5 साल के लिए * वास्तव में * समझने के लिए क्रेडिट देता हूं। – Natix

संबंधित मुद्दे