रेस ट्रैक पर बैठे कार के पुर्जों का एक गुच्छा किसी को क्या अच्छा लगता है?
यदि आपकी सभी कार क्लास कार भागों को रखती है तो यह भागों के गीले बैग की तरह उपयोगी है।
प्रयोग
ड्राइवर के रूप में, मैं जो चाहता हूं वह कुछ है जिसे मैं नियंत्रित कर सकता हूं। जब मैं गति के लिए कहता हूं तो यह प्रतिक्रिया करता है कि रेल पर इसकी तरह संभालती है। जो एक समय पर रुक सकता है।
मैं जो चाहता हूं वह एक कार क्लास है जो प्रयोग करने योग्य है। कि मैं कार्बोरेटर कैसे काम करता है, इसके बारे में सोचने के बिना चीजों को करने के लिए कह सकता हूं। मैं सिर्फ गैस पेडल के बारे में सोचता हूं। वे कैसे जुड़े हुए हैं मुझे कुछ चिंता नहीं है। वह अमूर्तन है।
निर्भरता अन्तःक्षेपण
निर्भरता इंजेक्शन का इससे कोई लेना-देना नहीं है। जब मैं कार चला रहा हूं तो मैं यह नहीं सोच रहा हूं कि यह कैसे बनाया गया था। जब तक यह काम करता है, मुझे परवाह नहीं है कि वे इसे एक साथ कैसे डालते हैं।
नहीं, DI वह है जो ट्रैक पर बारिश शुरू होने पर मेरे गड्ढे के चालक दल को अपने टायर को बेहतर तरीके से बदलने की जल्दी देता है। यह एक पूरी तरह से अलग कार में हॉप के बिना ऐसा करने में सक्षम होने के लिए अच्छा है।
DI वास्तव में एक सिद्धांत का पालन करने के बारे में है: निर्माण से अलग उपयोग।
एक कार जो 90 मील प्रति घंटे पर नए टायर स्थापित कर सकती है वह शांत लग सकती है, लेकिन मुझे नहीं लगता कि यह टायर के साथ किसी भी दौड़ को जीतने जा रही है, क्योंकि इस पर गर्भपात हो रहा है।
DI अपने भागों को इस तरह से स्थापित करने के बारे में है कि चलो अपने गड्ढे के चालक दल को उनके पास ले जाएं। जब आप new
उसी जगह का उपयोग करते हैं , तो आप व्यवहार को प्रोग्राम करते हैं, जैसे कि आप कार्बोरेटर को जगह में वेल्डिंग कर रहे हैं। एक एसिटिलीन मशाल इसे हटा सकती है, लेकिन कृपया पहले नट और बोल्ट का उपयोग करने पर विचार करें।
यही डीआई है। यकीन है कि यह आसान नहीं है new
कुछ के रूप में जल्द ही के रूप में आप एहसास आप इसे चाहते हैं। इसके बजाय आपको अलग कोड लिखना होगा जो जानता है कि आपकी कार का निर्माण कैसे करें। लेकिन यह सुनिश्चित करता है कि बाद में चीजों को बदलना आसान हो जाए। और इसका मतलब है कि आपको अपने साथ ट्रैक के आसपास कार असेंबली प्लांट को खींचने की जरूरत नहीं है।
निर्माण
कहीं न कहीं, यह जानना होगा कि क्या टायर गुडइयर हैं। फिर कार निर्माण कोड कहां रखें? अगर कार नहीं तो गड्ढे चालक दल? नहीं। ट्रैक? नहीं। उन सभी का व्यवहार कोड है। कोड है कि दौड़ के दौरान प्रदर्शन करना चाहिए। कार का निर्माण व्यवहार कोड से हटाए गए स्थान पर दौड़ से पहले होना चाहिए। मार्क सीमन्स ने इस जगह को कंपोजीशन रूट कहा । ज्यादातर लोग इसे मुख्य कहते हैं।
यह एक साधारण पैटर्न है। मुख्य रूप से, वस्तु ग्राफ का निर्माण करें तो ऑब्जेक्ट ग्राफ में एक वस्तु पर एक व्यवहार पद्धति को कॉल करें। बस। यह केवल जगह का निर्माण है और व्यवहार को एक साथ होना है।
इसका मतलब यह नहीं है कि निर्माण को मुख्य रूप से क्रमिक रूप से निर्धारित प्रक्रियात्मक कोड का ढेर होना चाहिए। आप निर्माण करने के लिए भाषा के हर उपकरण का उपयोग करने के लिए स्वतंत्र हैं। बस इसे व्यवहार के साथ न मिलाएं।
भाषा में ऐसा करना और कुछ DI ढांचे या IoC कंटेनर का उपयोग न करना शुद्ध DI कहलाता है । ये अच्छी तरह काम करता है। लंबे समय से है। हम इसे सिर्फ संदर्भ पासिंग कहते थे ।
DI उपकरण
DI टूल क्या खरीदता है, यह एक अलग भाषा (xml, json, जो भी हो) में लिया गया निर्माण विवरण है जो निर्माण और व्यवहार के बीच अलगाव को लागू करता है। यदि आप अपने साथी प्रोग्रामर पर भरोसा नहीं करते हैं, new
तो उन्हें इसका उपयोग नहीं करना चाहिए जब वे अपील नहीं कर सकते।
ड्रा बैक यह है कि यह DI टूल विवरण को कोड बेस में फैलने देने के लिए लुभाता है। कभी-कभी स्वामित्व एनोटेशन के साथ कोड आधार को संक्रमित करना। वे जो उदाहरण देते हैं, वे निश्चित रूप से इसे प्रोत्साहित करते हैं। जब तक आप सिर्फ जावा प्रोग्रामिंग जॉब के रूप में नहीं, बल्कि जावा / स्प्रिंग प्रोग्रामिंग जॉब के रूप में जॉब का विज्ञापन नहीं कर सकते, तब तक टूल लैंग्वेज स्पेस में चला जाता है।
डिज़ाइन सिद्धांत
उम्र के लिए मैं कार की कक्षाओं की प्रोग्रामिंग कर रहा था क्योंकि मेरे लिए यह स्पष्ट था कि मुझे कार तर्क की आवश्यकता है अगर मुझे कार तर्क की आवश्यकता है। लेकिन DI के साथ यह मेरे लिए इतना स्पष्ट नहीं है। फिर भी सोच रहा था कि अगर यह मेरे लिए कोई परिभाषित भूमिका नहीं है तो DI के लिए कार क्लास नहीं बनाना एक मुहावरा है?
मुझे लगता है कि आप अमूर्तता के बारे में सीख रहे हैं और बदल रहे हैं कि आप कैसे तय करते हैं कि कक्षा की आवश्यकता है। अच्छी बात है। लेकिन यह डीआई के बारे में नहीं है। अगर आपको कार क्लास की जरूरत है तो डि तय करने में आपकी मदद नहीं करता है। DI आपको टायर से गुडइयर टायर होने पर कार को जानने में मदद करता है और देखभाल करता है। DI आपको यह जानने में मदद करता है कि जापान में कारें बनी हैं या नहीं।
सॉफ्टवेयर डिजाइन में सबसे बुनियादी सवालों में से एक "क्या है?" यह मुख्य बात है कि एक यूएमएल आरेख आपको दिखाता है। जब आप कुछ नया करते हैं तो आप अतीत में पहुंच जाते हैं यह उस ठोस चीज़ के लिए इंटरफ़ेस होता है जिसे आप अब बांध चुके हैं। कार को अब यह जानना होगा कि टायर गुडइयर हैं। कौन सा थोथा बेकार है अगर मिशेलिन आप को प्रायोजित करना चाहते हैं।
निर्भरता उलटा सिद्धांत का पालन करने से बचने को कहा जाता है । औपचारिक रूप से, एक उच्च स्तरीय मॉड्यूल (कार वर्ग की तरह) सीधे निम्न स्तर के मॉड्यूल (गुडइयरटायर वर्ग की तरह) पर निर्भर नहीं होना चाहिए। यह एक अमूर्त (एक टायर इंटरफ़ेस की तरह) पर निर्भर होना चाहिए।
ऐसा करने से बचने का एक तरीका जिसे नियंत्रण का व्युत्क्रम कहा जाता है । यहां नियंत्रण के प्रवाह को बदलने पर जोर दिया गया है। क्या टायर कार को हिलाते हैं या कार टायर को हिलाती है? इस बारे में सही तरीके से सोचने से हम कार और टायर को एक साथ नहीं लगा सकते हैं। DI नियंत्रण का उलटा पालन करने का एक विशेष तरीका है।
इसमें से कोई भी आपको कार वर्ग की आवश्यकता होने पर नहीं बताता है। यदि आप "कार लॉजिक" की प्रोग्रामिंग कर रहे हैं तो यह अच्छा है अगर इसे रखने के लिए एक जगह है तो इसे हर जगह बिखेर दें। बस कार निर्माण तर्क को सोचकर मूर्ख मत बनो कार व्यवहार तर्क के समान है इसलिए इसे सभी को एक ही स्थान पर रहना होगा। लेकिन अगर आपके पास कार के लिए कोई परिभाषित रोल नहीं है, तो आपको जरूरत नहीं है। यदि आप चाहें तो ट्रैक के आसपास रेस मोटरसाइकिलें।
मेरा मतलब है कि ड्राइविंग के लिए स्टीयरिंगव्हेल होना ठीक है, गड्ढे के चालक दल के लिए पहियों पर बोल्ट्सएंड नट्स और अन्य मज़ेदार इंटरफेस के बिना सभी तरह के उदाहरण हैं जो एक कार के रूप में एक पूरे का प्रतिनिधित्व करता है?
DI या कोई DI नहीं, यह एक उदाहरण के लिए ठीक है जो एक कार को एक पूरे के रूप में प्रस्तुत करता है, लेकिन यह उदाहरण ऐसा कुछ नहीं है जिसे मैं सीधे जानना चाहता हूं अगर मुझे नहीं करना है। जब मैं गैस, डीजल, या बिजली का उपयोग करता हूं, तो इसका उपयोग करने के लिए मुझे कोई कार नहीं देनी चाहिए। यह केवल एक चीज है जिसकी मुझे परवाह करनी चाहिए जब मैं इसे बना रहा हूं या इसे बनाए रख रहा हूं। यह अच्छा है अगर कोड जो कार का उपयोग करता है उसे यह जानने या देखभाल करने की आवश्यकता नहीं है कि यह कैसे काम करता है। "मैं नहीं जानता। मैं जानना नहीं चाहता।"