निर्भरता इंजेक्शन: क्या मुझे इसके सभी हिस्सों को पकड़ने के लिए एक कार वर्ग बनाना चाहिए?


10

मेरे पास मेरे C ++ एप्लिकेशन में कई कारें हैं जिनमें एक रेसट्रैक है।

प्रत्येक कार में सैकड़ों भाग होते हैं। प्रत्येक भाग किसी न किसी भाग या दो पर निर्भर करता है।

मैंने DI और मार्क सीमन की किताब पर बहुत सारे SO प्रश्न पढ़े हैं और ऐसा लग रहा है कि मुझे कार के पुर्ज़ों को रखने के लिए कार क्लास को परिभाषित नहीं करना चाहिए क्योंकि सभी कार पार्ट्स एक दूसरे पर निर्भर होंगे और भागों का यह सूप एक कार है। क्या मैं सही हू?

इसलिए जब मैं अपनी सभी रेसिंग कारों को रेसट्रैक में रखता हूं तो ट्रैक पर एक-दूसरे के रेसिंग के आधार पर कार की कार नहीं बल्कि बहुत सारे कार पार्ट्स होंगे ?? क्या मैं सही हू?

संपादित करें:

उम्र के लिए मैं कार की कक्षाओं की प्रोग्रामिंग कर रहा था क्योंकि मेरे लिए यह स्पष्ट था कि मुझे कार तर्क की आवश्यकता है अगर मुझे कार तर्क की आवश्यकता है। लेकिन DI के साथ यह मेरे लिए इतना स्पष्ट नहीं है। फिर भी सोच रहा था कि अगर यह मेरे लिए कोई परिभाषित भूमिका नहीं है तो DI के लिए कार क्लास नहीं बनाना एक मुहावरा है?

मेरा मतलब है कि ड्राइविंग के लिए स्टीयरिंगव्हेल होना ठीक है, गड्ढे के चालक दल के लिए पहियों पर बोल्ट्सएंड नट्स और अन्य मज़ेदार इंटरफेस के बिना सभी तरह के उदाहरण हैं जो एक कार के रूप में एक पूरे का प्रतिनिधित्व करता है?

जवाबों:


24

रेस ट्रैक पर बैठे कार के पुर्जों का एक गुच्छा किसी को क्या अच्छा लगता है?

यदि आपकी सभी कार क्लास कार भागों को रखती है तो यह भागों के गीले बैग की तरह उपयोगी है।

प्रयोग

ड्राइवर के रूप में, मैं जो चाहता हूं वह कुछ है जिसे मैं नियंत्रित कर सकता हूं। जब मैं गति के लिए कहता हूं तो यह प्रतिक्रिया करता है कि रेल पर इसकी तरह संभालती है। जो एक समय पर रुक सकता है।

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

निर्भरता अन्तःक्षेपण

निर्भरता इंजेक्शन का इससे कोई लेना-देना नहीं है। जब मैं कार चला रहा हूं तो मैं यह नहीं सोच रहा हूं कि यह कैसे बनाया गया था। जब तक यह काम करता है, मुझे परवाह नहीं है कि वे इसे एक साथ कैसे डालते हैं।

नहीं, DI वह है जो ट्रैक पर बारिश शुरू होने पर मेरे गड्ढे के चालक दल को अपने टायर को बेहतर तरीके से बदलने की जल्दी देता है। यह एक पूरी तरह से अलग कार में हॉप के बिना ऐसा करने में सक्षम होने के लिए अच्छा है।

DI वास्तव में एक सिद्धांत का पालन करने के बारे में है: निर्माण से अलग उपयोग।

एक कार जो 90 मील प्रति घंटे पर नए टायर स्थापित कर सकती है वह शांत लग सकती है, लेकिन मुझे नहीं लगता कि यह टायर के साथ किसी भी दौड़ को जीतने जा रही है, क्योंकि इस पर गर्भपात हो रहा है।

DI अपने भागों को इस तरह से स्थापित करने के बारे में है कि चलो अपने गड्ढे के चालक दल को उनके पास ले जाएं। जब आप newउसी जगह का उपयोग करते हैं , तो आप व्यवहार को प्रोग्राम करते हैं, जैसे कि आप कार्बोरेटर को जगह में वेल्डिंग कर रहे हैं। एक एसिटिलीन मशाल इसे हटा सकती है, लेकिन कृपया पहले नट और बोल्ट का उपयोग करने पर विचार करें।

यही डीआई है। यकीन है कि यह आसान नहीं है newकुछ के रूप में जल्द ही के रूप में आप एहसास आप इसे चाहते हैं। इसके बजाय आपको अलग कोड लिखना होगा जो जानता है कि आपकी कार का निर्माण कैसे करें। लेकिन यह सुनिश्चित करता है कि बाद में चीजों को बदलना आसान हो जाए। और इसका मतलब है कि आपको अपने साथ ट्रैक के आसपास कार असेंबली प्लांट को खींचने की जरूरत नहीं है।

निर्माण

कहीं न कहीं, यह जानना होगा कि क्या टायर गुडइयर हैं। फिर कार निर्माण कोड कहां रखें? अगर कार नहीं तो गड्ढे चालक दल? नहीं। ट्रैक? नहीं। उन सभी का व्यवहार कोड है। कोड है कि दौड़ के दौरान प्रदर्शन करना चाहिए। कार का निर्माण व्यवहार कोड से हटाए गए स्थान पर दौड़ से पहले होना चाहिए। मार्क सीमन्स ने इस जगह को कंपोजीशन रूट कहा । ज्यादातर लोग इसे मुख्य कहते हैं।

यह एक साधारण पैटर्न है। मुख्य रूप से, वस्तु ग्राफ का निर्माण करें तो ऑब्जेक्ट ग्राफ में एक वस्तु पर एक व्यवहार पद्धति को कॉल करें। बस। यह केवल जगह का निर्माण है और व्यवहार को एक साथ होना है।

इसका मतलब यह नहीं है कि निर्माण को मुख्य रूप से क्रमिक रूप से निर्धारित प्रक्रियात्मक कोड का ढेर होना चाहिए। आप निर्माण करने के लिए भाषा के हर उपकरण का उपयोग करने के लिए स्वतंत्र हैं। बस इसे व्यवहार के साथ न मिलाएं।

भाषा में ऐसा करना और कुछ DI ढांचे या IoC कंटेनर का उपयोग न करना शुद्ध DI कहलाता है । ये अच्छी तरह काम करता है। लंबे समय से है। हम इसे सिर्फ संदर्भ पासिंग कहते थे

DI उपकरण

DI टूल क्या खरीदता है, यह एक अलग भाषा (xml, json, जो भी हो) में लिया गया निर्माण विवरण है जो निर्माण और व्यवहार के बीच अलगाव को लागू करता है। यदि आप अपने साथी प्रोग्रामर पर भरोसा नहीं करते हैं, newतो उन्हें इसका उपयोग नहीं करना चाहिए जब वे अपील नहीं कर सकते।

ड्रा बैक यह है कि यह DI टूल विवरण को कोड बेस में फैलने देने के लिए लुभाता है। कभी-कभी स्वामित्व एनोटेशन के साथ कोड आधार को संक्रमित करना। वे जो उदाहरण देते हैं, वे निश्चित रूप से इसे प्रोत्साहित करते हैं। जब तक आप सिर्फ जावा प्रोग्रामिंग जॉब के रूप में नहीं, बल्कि जावा / स्प्रिंग प्रोग्रामिंग जॉब के रूप में जॉब का विज्ञापन नहीं कर सकते, तब तक टूल लैंग्वेज स्पेस में चला जाता है।

डिज़ाइन सिद्धांत

उम्र के लिए मैं कार की कक्षाओं की प्रोग्रामिंग कर रहा था क्योंकि मेरे लिए यह स्पष्ट था कि मुझे कार तर्क की आवश्यकता है अगर मुझे कार तर्क की आवश्यकता है। लेकिन DI के साथ यह मेरे लिए इतना स्पष्ट नहीं है। फिर भी सोच रहा था कि अगर यह मेरे लिए कोई परिभाषित भूमिका नहीं है तो DI के लिए कार क्लास नहीं बनाना एक मुहावरा है?

मुझे लगता है कि आप अमूर्तता के बारे में सीख रहे हैं और बदल रहे हैं कि आप कैसे तय करते हैं कि कक्षा की आवश्यकता है। अच्छी बात है। लेकिन यह डीआई के बारे में नहीं है। अगर आपको कार क्लास की जरूरत है तो डि तय करने में आपकी मदद नहीं करता है। DI आपको टायर से गुडइयर टायर होने पर कार को जानने में मदद करता है और देखभाल करता है। DI आपको यह जानने में मदद करता है कि जापान में कारें बनी हैं या नहीं।

सॉफ्टवेयर डिजाइन में सबसे बुनियादी सवालों में से एक "क्या है?" यह मुख्य बात है कि एक यूएमएल आरेख आपको दिखाता है। जब आप कुछ नया करते हैं तो आप अतीत में पहुंच जाते हैं यह उस ठोस चीज़ के लिए इंटरफ़ेस होता है जिसे आप अब बांध चुके हैं। कार को अब यह जानना होगा कि टायर गुडइयर हैं। कौन सा थोथा बेकार है अगर मिशेलिन आप को प्रायोजित करना चाहते हैं।

निर्भरता उलटा सिद्धांत का पालन ​​करने से बचने को कहा जाता है । औपचारिक रूप से, एक उच्च स्तरीय मॉड्यूल (कार वर्ग की तरह) सीधे निम्न स्तर के मॉड्यूल (गुडइयरटायर वर्ग की तरह) पर निर्भर नहीं होना चाहिए। यह एक अमूर्त (एक टायर इंटरफ़ेस की तरह) पर निर्भर होना चाहिए।

ऐसा करने से बचने का एक तरीका जिसे नियंत्रण का व्युत्क्रम कहा जाता है । यहां नियंत्रण के प्रवाह को बदलने पर जोर दिया गया है। क्या टायर कार को हिलाते हैं या कार टायर को हिलाती है? इस बारे में सही तरीके से सोचने से हम कार और टायर को एक साथ नहीं लगा सकते हैं। DI नियंत्रण का उलटा पालन करने का एक विशेष तरीका है।

इसमें से कोई भी आपको कार वर्ग की आवश्यकता होने पर नहीं बताता है। यदि आप "कार लॉजिक" की प्रोग्रामिंग कर रहे हैं तो यह अच्छा है अगर इसे रखने के लिए एक जगह है तो इसे हर जगह बिखेर दें। बस कार निर्माण तर्क को सोचकर मूर्ख मत बनो कार व्यवहार तर्क के समान है इसलिए इसे सभी को एक ही स्थान पर रहना होगा। लेकिन अगर आपके पास कार के लिए कोई परिभाषित रोल नहीं है, तो आपको जरूरत नहीं है। यदि आप चाहें तो ट्रैक के आसपास रेस मोटरसाइकिलें।

मेरा मतलब है कि ड्राइविंग के लिए स्टीयरिंगव्हेल होना ठीक है, गड्ढे के चालक दल के लिए पहियों पर बोल्ट्सएंड नट्स और अन्य मज़ेदार इंटरफेस के बिना सभी तरह के उदाहरण हैं जो एक कार के रूप में एक पूरे का प्रतिनिधित्व करता है?

DI या कोई DI नहीं, यह एक उदाहरण के लिए ठीक है जो एक कार को एक पूरे के रूप में प्रस्तुत करता है, लेकिन यह उदाहरण ऐसा कुछ नहीं है जिसे मैं सीधे जानना चाहता हूं अगर मुझे नहीं करना है। जब मैं गैस, डीजल, या बिजली का उपयोग करता हूं, तो इसका उपयोग करने के लिए मुझे कोई कार नहीं देनी चाहिए। यह केवल एक चीज है जिसकी मुझे परवाह करनी चाहिए जब मैं इसे बना रहा हूं या इसे बनाए रख रहा हूं। यह अच्छा है अगर कोड जो कार का उपयोग करता है उसे यह जानने या देखभाल करने की आवश्यकता नहीं है कि यह कैसे काम करता है। "मैं नहीं जानता। मैं जानना नहीं चाहता।"


यह अच्छा होगा यदि आप एक प्रश्न के लिए कार और पिट क्रू रूपक का उपयोग नहीं करते हैं जो कोड का प्रतिनिधित्व करने के लिए उनका उपयोग करता है। लेकिन फिर भी, एक अच्छा जवाब।
एस। तारिक inetin

6
और मैंने हमेशा सोचा था कि नियंत्रण का उलटा जब आप छोड़ दिया गया था, लेकिन कार दाएं मुड़ती है ...
mkrieger1

यदि कोई सार्थक इंटरफ़ेस और अच्छी तरह से परिभाषित जिम्मेदारी है तो CandiedOrange, इसलिए कोई कार वर्ग नहीं? और मेरे प्रोजेक्ट में कोई Car.h। और सहकर्मी मेरे कोड को देख रहा है और सोच रहा है कि क्या यह कार पार्ट्स ई-शॉप या गैराज मैनेजिंग एप्लीकेशन है? :)
एंटोन पेट्रोव

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

15

ऐसा लगता है कि मुझे कार के पुर्ज़ों को रखने के लिए कार क्लास को परिभाषित नहीं करना चाहिए क्योंकि सभी कार पार्ट्स एक-दूसरे पर निर्भर होंगे और भागों का यह सूप कार है। क्या मैं सही हू?

नहीं।

निर्भरता इंजेक्शन की बात निर्भरता को हतोत्साहित करने के लिए बिल्कुल भी नहीं है । काफी विपरीत।

निर्भरता इंजेक्शन सवाल के बारे में है: कार को अपने हिस्से कहाँ से मिलते हैं ? वे कहाँ और कैसे बनाए गए हैं, और कार को उनके संदर्भ कैसे मिलते हैं?

स्वाभाविक रूप से, कार कॉल करके अपने हिस्से खुद बनाएगी new। यह आसान और सीधा है, लेकिन यह बहुत ही अनम्य है। कार को उन सभी चीजों को जानना होगा जो भागों को बनाने के लिए आवश्यक हैं, और यदि आप कभी भी दो कारों को अलग-अलग हिस्सों में रखना चाहते हैं, तो उस तर्क को कार में भी जाना होगा।

निर्भरता इंजेक्शन के साथ, उस तर्क को कार से बाहर ले जाया जाता है और एक कॉन्फ़िगरेशन घटक में डाल दिया जाता है, जो सभी भागों और तारों को संदर्भ बनाता है। पूरी तरह से कॉन्फ़िगर की गई निर्भरता को कार में इंजेक्ट किया जाता है - और एक दूसरे को।


1
अंत में, dependency injectionअवधारणा की एक समझदार व्याख्या ।
अनातोली टेकटोनिक

1
मैं कहता हूं कि "भोली" दृष्टिकोण के लिए अधिक सामान्य प्रणाली यह नहीं है कि कार नया कहेगी, लेकिन यह कि कार वर्ग का उपयोगकर्ता इसके गुणों को अपने हिस्से सौंप देगा, और इस बीच कार वर्ग में होगा एक अनिश्चित स्थिति। DI यांत्रिक रूप से वर्ग वैधता का आश्वासन देने का साधन प्रदान करता है।
whatsisname

2
@whatsisname मैं अमान्य और आधी आरंभिक वस्तुओं को बनाने के लिए आसानी से DI का उपयोग कर सकता हूं। सत्यापन एक DI जिम्मेदारी नहीं है। और न ही अपरिवर्तनीय है। DI मान्य और अपरिवर्तनीय वस्तुओं के निर्माण का काम कर सकता है। DI के पास यह लागू करने का कोई तरीका नहीं है कि वे एकमात्र तरीके हैं जो उन वस्तुओं का निर्माण और उपयोग किया जाता है। वस्तुओं को इसे लागू करना चाहिए।
candied_orange

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

0

इसलिए जब मैं अपनी सभी रेसिंग कारों को रेसट्रैक में रखता हूं तो ट्रैक पर एक-दूसरे के रेसिंग के आधार पर कार की कार नहीं बल्कि बहुत सारे कार पार्ट्स होंगे ?? क्या मैं सही हू?

कुंआ। हां और ना। एक कार इकाई अभी भी मान्य है। और एक कार उसके भागों के योग से अधिक है। आपको ड्राइवर की भी आवश्यकता है (समय के लिए)। कई बार रेस कारों में नाम और साथ ही कार के मेक और मॉडल का उल्लेख नहीं होता है।

हां कारें मूल रूप से भागों का एक कंटेनर हैं, लेकिन यह भागों की पैकेजिंग और सहयोग है जो कुछ बड़ा करता है: एक कार।

तो वास्तव में, नहीं। एक कार धातु और प्लास्टिक का एक यादृच्छिक बैग नहीं है। यह एक मशीन है।

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


2
आप कारखानों या बिल्डर वस्तुओं के बिना DI कर सकते हैं। सरल कंस्ट्रक्टर पैरामीटर एक वैध विधि है जो कई परिस्थितियों के लिए काम करती है।
whatsisname
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.