निर्भरता इंजेक्शन की व्याख्या करने का एक अच्छा तरीका क्या है ?
मुझे Google पर कई ट्यूटोरियल मिले, लेकिन उनमें से कोई भी ऐसा नहीं था जो यह मान ले कि पाठक सिर्फ एक जावा शुरुआत है। आप इसे नौसिखिए को कैसे समझाएंगे?
निर्भरता इंजेक्शन की व्याख्या करने का एक अच्छा तरीका क्या है ?
मुझे Google पर कई ट्यूटोरियल मिले, लेकिन उनमें से कोई भी ऐसा नहीं था जो यह मान ले कि पाठक सिर्फ एक जावा शुरुआत है। आप इसे नौसिखिए को कैसे समझाएंगे?
जवाबों:
मैं आपको पांच साल के बच्चों के लिए निर्भरता इंजेक्शन देता हूं।
जब आप अपने लिए रेफ्रिजरेटर से बाहर जाते हैं और चीजें प्राप्त करते हैं, तो आप समस्याएं पैदा कर सकते हैं। आप दरवाजा खुला छोड़ सकते हैं, आपको कुछ मिल सकता है मम्मी या डैडी आपको नहीं चाहते हैं। तुम भी हम कुछ भी नहीं है या जो समाप्त हो गया है के लिए देख रहे हो सकता है।
आप जो कर रहे हैं वह एक ज़रूरत है, "मुझे दोपहर के भोजन के साथ पीने के लिए कुछ चाहिए", और फिर हम यह सुनिश्चित करेंगे कि आपके पास खाने के लिए कुछ हो।
इस बारे में क्या?
यदि आपके पास एक वर्ग है 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 वर्ष पुराना है।
मुझे आशा है कि आप अभी भी इसे उपयोगी पाएंगे।
कक्षा लिखते समय, अन्य वस्तुओं का उपयोग करना स्वाभाविक है। आपके पास एक डेटाबेस कनेक्शन हो सकता है, उदाहरण के लिए, या कुछ अन्य सेवा जो आप उपयोग करते हैं। ये अन्य वस्तुएँ (या सेवाएँ) निर्भरताएँ हैं। कोड लिखने का सबसे सरल तरीका केवल उन अन्य वस्तुओं को बनाना और उनका उपयोग करना है। लेकिन इसका मतलब यह है कि आपकी वस्तु का उन निर्भरताओं के साथ एक अनम्य रिश्ता है: कोई फर्क नहीं पड़ता कि आप अपनी वस्तु को क्यों लागू कर रहे हैं, यह उसी निर्भरता का उपयोग करता है।
एक अधिक शक्तिशाली तकनीक अपनी वस्तु बनाने में सक्षम है और इसे उपयोग करने के लिए निर्भरता प्रदान करती है। तो आप उपयोग करने के लिए एक डेटाबेस कनेक्शन बना सकते हैं, फिर उसे अपनी वस्तु को सौंप दें। इस तरह, आप अलग-अलग समय पर अलग-अलग निर्भरता के साथ अपनी वस्तु बना सकते हैं, जिससे आपकी वस्तु अधिक लचीली हो जाएगी। यह निर्भरता इंजेक्शन है, जहां आप ऑब्जेक्ट में निर्भरता को "इंजेक्ट" करते हैं।
BTW: अवधारणाओं को चित्रित करने के लिए फ़्लिकर फ़ोटो का उपयोग करने की आधुनिक प्रस्तुति शैली में, ड्रग्स के साथ खुद को एक व्यसनी शूटिंग के साथ चित्रित किया जा सकता है। ओह, रुको, वह इंजेक्शन निर्भरता है ... ठीक है, माफ करना, बुरा मजाक।
मुझे किसी भी सरलीकृत ट्यूटोरियल के बारे में पता नहीं है, लेकिन मैं आपको लगभग 25 250 शब्द या कम संस्करण दे सकता हूं :
निर्भरता इंजेक्शन के साथ एक वस्तु अपने स्वयं के घटकों को उन चीजों के आधार पर कॉन्फ़िगर नहीं करती है जो पहले से ही जानती है, बल्कि वस्तु को उच्च स्तर के तर्क द्वारा कॉन्फ़िगर किया गया है, और फिर यह उन घटकों को कॉल करता है जिनमें यह अंतर्निहित नहीं था। विचार एक घटक के अधिक और एक आवेदन के कम करने के लिए है, उच्च स्तर पर कॉन्फ़िगरेशन कार्यों को स्थानांतरित करना। इससे ऑब्जेक्ट भविष्य में या एक अलग कॉन्फ़िगरेशन के साथ उपयोगी होने की अधिक संभावना है।
यह परीक्षण के लिए बेहतर है, जब आवेदन को संशोधित करने का समय आता है तो यह बेहतर होता है। एक विशिष्ट कार्यान्वयन XML में कॉन्फ़िगरेशन डालता है और गतिशील रूप से लोड कक्षाओं के लिए एक फ्रेमवर्क का उपयोग करता है।
जब आपको नया निन्टेंडो दिया जाता है, तो आप गेम खेलने के लिए सिर्फ बटन और टच स्क्रीन का उपयोग कर सकते हैं।
लेकिन निंटेंडो फैक्ट्री में, उन्हें यह जानना आवश्यक है कि एक साथ कैसे रखा जाए।
जब कारखाने के स्मार्ट लोग एक निंटेंडो डीएस को बाहर लाते हैं, तो यह अंदर से अलग होगा, लेकिन आपको अभी भी पता होगा कि इसका उपयोग कैसे करना है।