5 साल की उम्र के लिए निर्भरता इंजेक्शन की व्याख्या कैसे करें? [बन्द है]


208

निर्भरता इंजेक्शन की व्याख्या करने का एक अच्छा तरीका क्या है ?

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


72
ऐसा लगता है कि बच्चे एक कठिन जीवन के लिए ...
ire_and_curses

24
"वन्स अपॉन अ टाइम ....." से शुरू करें
मार्टिन

1
क्या हम जावा शुरुआत करने वाले या पांच साल के शाब्दिक के बारे में बात कर रहे हैं?
ड्रू

2
# निर्भरता इंजेक्शन # डॉन 'सीखने वाले की उम्र पर निर्भर करता है, यह हर एक के लिए समान है
राकेश जुयाल

2
राकेश: जावाऑन 2009 परिचयात्मक वीडियो इस आधार पर बनाया गया है कि एक 13 साल का भी जावा डेवलपर हो सकता है क्योंकि जावा "हर जगह" और "आसान" है।
Esko

जवाबों:


789

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

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

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


93

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

यदि आपके पास एक वर्ग है Employeeऔर इस कर्मचारी के पास Address आपके पास Employeeनिम्नानुसार परिभाषित वर्ग हो सकता है:

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:

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

इस तरह से काम करना समस्याग्रस्त हो जाता है, खासकर जब आप यूनिट परीक्षण करना चाहते हैं।

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

इससे बचने के लिए, आप कंस्ट्रक्टर को इस तरह बदल सकते हैं:

  public Employee(){
  }

एक बिना आर्गन कंस्ट्रक्टर का उपयोग करना।

फिर आप जब चाहें तब पता सेट कर सकते हैं:

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

अब, यह एक ड्रैग हो सकता है, यदि आपके पास कई विशेषताएँ हैं या यदि ऑब्जेक्ट बनाना मुश्किल है।

फिर भी, इस बारे में सोचें, चलो कहते हैं, आप Departmentविशेषता जोड़ें :

  class Employee {
      private Address address;
      private Department department;

  ....

यदि आपके पास 300 कर्मचारी हैं, और उन सभी के पास एक ही विभाग होने की आवश्यकता है , और इसके अलावा उसी विभाग को कुछ अन्य वस्तुओं (जैसे विभागों की कंपनी की सूची, या प्रत्येक विभाग की भूमिकाएं आदि) के बीच साझा करना होगा, तो आप 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
या: निर्भरता इंजेक्शन तब होता है जब आपके पास कुछ निर्भरताएं होती हैं। यह आमतौर पर एक रूपरेखा है। :)
ऑस्कररेज़

2
वास्तव में एक बहुत ही स्मार्ट।
ऑस्कररेज़

24

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

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

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


10

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

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

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


7

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

लेकिन निंटेंडो फैक्ट्री में, उन्हें यह जानना आवश्यक है कि एक साथ कैसे रखा जाए।

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


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