क्या DI / IoC के उपयोग से "नए" कीवर्ड की सभी घटनाएं दूर हो सकती हैं?


21

क्या डिपेंडेंसी इंजेक्शन का उपयोग और नियंत्रण कंटेनर का एक व्युत्क्रम आपके कोड से " " कीवर्ड की सभी घटनाओं को हटा सकता है new?

दूसरे शब्दों में, क्या प्रत्येक वस्तु / निर्भरता, चाहे वह कितनी भी सरल या अल्पकालिक क्यों न हो, आपके IoC कंटेनर के भीतर "पंजीकृत" हो और उस विधि / वर्ग में इंजेक्ट किया जाए जिसे उनका उपयोग करने की आवश्यकता है?

यदि नहीं, तो आप उस रेखा को कहां से खींचते हैं जिसके बीच निर्भरता / वस्तुएं आईओसी कंटेनर में पंजीकृत हो जाती हैं, बनाम क्या "इन-लाइन" एक ठोस संदर्भ के रूप में newकीवर्ड के माध्यम से बनता है?


मैंने एक ही सोचा था, "नई 'एक 4-अक्षर शब्द है?"
माइकल ईस्टर

जवाबों:


27

हठधर्मिता से बचें। जो सही लगे उसे करो।

मैं डेटा संरचनाओं के लिए "नया" का उपयोग करना पसंद करता हूं जिनका कोई व्यवहार नहीं है।

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


15
"हठधर्मिता से बचें" के लिए +1। जिस तरह से हो रहा है या जहां यह ठीक से इस्तेमाल किया जाना चाहिए, यह समझे बिना कि गतियों का अनुसरण करते हुए गिरना आसान है।
वेन मोलिना

@ मुझे यह पसंद है। एक बहुत ही व्यावहारिक दृष्टिकोण। मजेदार रूप से, मैं अपने प्रश्न में कुछ कोड जोड़ने जा रहा था, newजिसमें मेरे अपने कोड में '' एड डिपेंडेंसी '' दिखाया गया था, जिससे मुझे अपना प्रश्न पता चल गया। यह बिना किसी कार्यक्षमता या "व्यवहार" के प्रति एक साधारण वर्ग था, केवल सरल गुण।
क्रेगटीपी

11

में मेरी किताब , मैं स्थिर और के बीच अंतर प्रदान वाष्पशील निर्भरता । DI का उपयोग वाष्पशील निर्भरताओं के साथ करना सबसे महत्वपूर्ण है, लेकिन अक्सर आप स्थिर निर्भरता को भी अमूर्त और इंजेक्शन देकर शिथिल युग्मन प्राप्त कर सकते हैं।

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

कुछ लोग वास्तव में गरीब आदमी के DI DI कंटेनर से अधिक पसंद करते हैं। रखरखाव की लागत अधिक हो सकती है, लेकिन आपको बदले में संकलन-समय सुरक्षा मिलती है। जैसा कि मैंने हाल ही में डैन नॉर्थ को यह कहते हुए सुना है: " newनया है new" :)

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


मार्क, मेरी ट्विटर टिप्पणी पर थोड़ा विस्तार करने के लिए , प्रोग्रामर वैचारिक, व्हाइटबोर्ड-वाई प्रश्नों के लिए सही जगह है जो एक कार्यान्वयन में एक विशिष्ट त्रुटि से नहीं निपट रहे हैं।
एडम लेअर

3
स्टैक ओवरफ्लो में निर्भरता-इंजेक्शन टैग में 2000+ प्रश्न हैं, और उनमें से बहुत कुछ इस तरह हैं। प्रोग्रामर के एक ही टैग में 23 प्रश्न हैं। इन नंबरों के आधार पर, एक डेवलपर को इस तरह के प्रश्न का उत्तर पाने का सबसे बड़ा मौका कहां जाना चाहिए?
मार्क सेमैन

1
उन सवालों का एक बहुत पूरी तरह से प्रोग्रामर पूर्वसूचक। यह साइट एसओ से वैचारिक प्रश्नों को लेने और उन्हें एक समर्पित घर देने के लिए बनाई गई थी। और हम अभी भी बढ़ रहे हैं। यह प्रगति पर काम है, लेकिन आदर्श रूप से ऐसे प्रश्न जो विशिष्ट कार्यान्वयन समस्याओं को शामिल नहीं करते हैं, वे यहां माइग्रेट हो जाएंगे। इस बीच हम जो कर सकते हैं वह करते हैं।
एडम लेअर

3

"नया" एक निषिद्ध कीवर्ड नहीं है। मेरे व्यक्तिगत नियम:

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

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


2

मैं केवल उन मौजूदा उत्तरों को जोड़ना चाहूंगा जिन्हें इयरलर लाया गया था, newउन वस्तुओं को बनाने के लिए पूरी तरह से ठीक है जो शुद्ध मूल्य की वस्तुएं हैं (अर्थात केवल गुण / गेटर्स / सेटर हैं)। अधिक विवरण के लिए Google परीक्षण ब्लॉग देखें ।


लिंक के लिए +1। बिंदु 9 उस ब्लॉग में पोस्टिंग प्रश्न का उत्तर देता है और new
क्रेगटीपी

1

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

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

इसलिए संक्षेप में: केवल ऐसी कक्षाओं को सीधे वस्तुओं को तुरंत भेजना चाहिए, यह जिम्मेदारी किसकी है कि कौन सी कक्षाओं को तुरंत चुनें।
आपको ये मानदंड मददगार लग सकते हैं: http://en.wikipedia.org/wiki/GRASP_(object-oriented_design)#Creator


1

एक शब्द: नहीं।

अधिक शब्द: निर्भरता इंजेक्शन वास्तव में यही है। यह एक ऐसा साधन है जिसके द्वारा आप उन संसाधनों को पेश करते हैं जो किसी अन्य ऑब्जेक्ट पर निर्भर करते हैं, लेकिन किसी अन्य स्रोत से जटिल विवरणों को नहीं जानना चाहिए। DI का उपयोग करने का मतलब यह नहीं है कि आपके कार्यक्रम में कुछ भी नहीं पता होना चाहिए कि किसी अन्य वस्तु को कैसे बनाया जाए; वास्तव में, मेरा मानना ​​है कि पूरी तरह से "नए" कीवर्ड (या प्रतिबिंब-आधारित विकल्प) से बचने के लिए एक गैर-तुच्छ कार्यक्रम के लिए यह बहुत अधिक संभव है। हालाँकि, DI का मतलब यह है कि जिन वस्तुओं को यह जानने की जरूरत नहीं है कि उन जटिल वस्तुओं का निर्माण कैसे किया जाना चाहिए, जिनके लिए बहुत अधिक निर्भरता की आवश्यकता होती है, जो इस वस्तु को दूसरे के साथ जोड़ेगी, इस सभी को कसकर युग्मन ज्ञान नहीं होना चाहिए।

मैं O / O सॉफ्टवेयर डिज़ाइन, GRASP और SOLID के दो प्रमुख सिद्धांतों का अध्ययन करूंगा। जीआरएएसपी आपको ऑब्जेक्ट के उद्देश्य का अध्ययन करने के लिए कहेगा, और खुद से पूछेगा, "क्या इस ऑब्जेक्ट को इस अन्य प्रकार की नई वस्तुओं को बनाने के लिए जिम्मेदार होना चाहिए? क्या इस ऑब्जेक्ट के 'नौकरी विवरण' का हिस्सा है?" SOLID एक कदम आगे जाता है: "S" का अर्थ "सिंगल रिस्पॉन्सिबिलिटी प्रिंसिपल" है, जो स्पष्ट रूप से बताता है कि एक ऑब्जेक्ट में एक काम होना चाहिए, और यह प्रोग्राम में एकमात्र ऑब्जेक्ट होना चाहिए जो उस विशिष्ट कार्य को करता है।

इसलिए, जीआरएएसपी आम तौर पर आपको अपनी मौजूदा कक्षाओं के माध्यम से देखने के लिए प्रोत्साहित करेगा, जिसके लिए इन नई वस्तुओं का निर्माण किया जाता है, और एक ऐसी वस्तु खोजने का काम किया जाता है, जो आपके इच्छित स्तर "सामंजस्य" को बनाए रखते हुए, इस वस्तु को बनाने का कार्य फिट बैठता है। SOLID आपको बताएगा कि सामंजस्य कुंजी है; इन वस्तुओं को बनाने का कार्य कुछ कारखाने को दिया जाना चाहिए जिन्हें आपकी कक्षा में इंजेक्ट किया जाना चाहिए। मुझे लगता है कि आप पाएंगे कि जैसे-जैसे आपके कार्यक्रम की जटिलता बढ़ती जा रही है, कि इन तरीकों में से किसी का भी पालन, रिफैक्टर की इच्छा के साथ होता है, इसके परिणामस्वरूप बहुत ही समान आर्किटेक्चर होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.