वही मूल समस्या जो आपको अक्सर ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग, स्टाइल नियमों और बस बाकी सब चीजों के साथ मिलती है। यह संभव है - बहुत आम है, वास्तव में - बहुत अधिक अमूर्त करना, और बहुत अधिक अप्रत्यक्ष जोड़ना, और आम तौर पर अच्छी तकनीकों को अत्यधिक और गलत स्थानों पर लागू करना।
आपके द्वारा लागू किया गया प्रत्येक पैटर्न या अन्य निर्माण जटिलता लाता है। चारों ओर अमूर्तता और अप्रत्यक्ष रूप से बिखरी हुई जानकारी, कभी-कभी अप्रासंगिक विस्तार को रास्ते से हटाती है, लेकिन कभी-कभी यह वास्तव में समझना मुश्किल बना देती है कि वास्तव में क्या हो रहा है। आपके द्वारा लागू किया गया प्रत्येक नियम अनम्यता लाता है, विकल्पों को सत्तारूढ़ करता है जो सिर्फ सबसे अच्छा तरीका हो सकता है।
बिंदु कोड लिखना है जो काम करता है और मजबूत, पठनीय और बनाए रखने योग्य है। आप एक सॉफ़्टवेयर डेवलपर हैं - हाथी दांत टॉवर बिल्डर नहीं।
प्रासंगिक लिंक
http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx
http://www.joelonsoftware.com/articles/fog0000000018.html
संभवतः निर्भरता इंजेक्शन का सबसे सरल रूप (हंसो मत) एक पैरामीटर है। निर्भर कोड डेटा पर निर्भर है, और उस डेटा को पैरामीटर पास करने के माध्यम से इंजेक्ट किया जाता है।
हां, यह मूर्खतापूर्ण है और यह निर्भरता इंजेक्शन के ऑब्जेक्ट-ओरिएंटेड बिंदु को संबोधित नहीं करता है, लेकिन एक कार्यात्मक प्रोग्रामर आपको बताएगा कि (यदि आपके पास प्रथम श्रेणी के कार्य हैं) तो यह एकमात्र प्रकार की निर्भरता इंजेक्शन है जिसकी आपको आवश्यकता है। यहां बिंदु एक तुच्छ उदाहरण लेना है, और संभावित समस्याओं को दिखाना है।
इस सरल पारंपरिक फ़ंक्शन को लेने दें - C ++ सिंटैक्स यहां महत्वपूर्ण नहीं है, लेकिन मुझे इसे किसी भी तरह से वर्तनी करना है ...
void Say_Hello_World ()
{
std::cout << "Hello World" << std::endl;
}
मेरे पास एक निर्भरता है जिसे मैं बाहर निकालना और इंजेक्ट करना चाहता हूं - पाठ "हैलो वर्ल्ड"। काफी आसान...
void Say_Something (const char *p_text)
{
std::cout << p_text << std::endl;
}
यह मूल से अधिक अनम्य कैसे है? खैर, क्या होगा अगर मैं तय करता हूं कि आउटपुट यूनिकोड होना चाहिए। मैं शायद std :: cout से std :: wcout में स्विच करना चाहता हूँ। लेकिन इसका मतलब है कि मेरे तार तो wchar_t के हैं, चार के नहीं। या तो हर कॉलर को बदलना होगा, या (अधिक तर्कसंगत रूप से), पुराने कार्यान्वयन को एक एडेप्टर से बदल दिया जाता है जो स्ट्रिंग का अनुवाद करता है और नए कार्यान्वयन को कॉल करता है।
यह रखरखाव का काम है कि अगर हम मूल रखा होगा की जरूरत नहीं है।
और अगर यह तुच्छ लगता है, तो Win32 एपीआई से इस वास्तविक दुनिया समारोह पर एक नज़र डालें ...
http://msdn.microsoft.com/en-us/library/ms632680%28v=vs.85%29.aspx
इससे निपटने के लिए 12 "निर्भरताएं" हैं। उदाहरण के लिए, यदि स्क्रीन रिज़ॉल्यूशन वास्तव में बहुत बड़ा हो जाता है, तो शायद हमें 64-बिट समन्वय मूल्यों की आवश्यकता होगी - और CreateWindowEx का एक और संस्करण। और हाँ, पहले से ही एक पुराना संस्करण अभी भी चारों ओर लटका हुआ है, जो संभवतः पर्दे के पीछे के नए संस्करण में मैप हो जाता है ...
http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx
उन "निर्भरताएं" मूल डेवलपर के लिए केवल एक समस्या नहीं हैं - हर कोई जो उस इंटरफ़ेस का उपयोग करता है उसे यह देखना होगा कि निर्भरताएं क्या हैं, वे कैसे निर्दिष्ट हैं, और उनका क्या मतलब है, और उनके आवेदन के लिए क्या करना है। यह वह जगह है जहाँ शब्द "समझदार चूक" जीवन को बहुत सरल बना सकते हैं।
ऑब्जेक्ट-ओरिएंटेड निर्भरता इंजेक्शन सिद्धांत में अलग नहीं है। स्रोत-कोड पाठ और डेवलपर समय दोनों में, एक वर्ग लिखना एक ओवरहेड है, और यदि उस वर्ग को कुछ आश्रित वस्तुओं के विनिर्देशों के अनुसार निर्भरता की आपूर्ति करने के लिए लिखा जाता है, तो आश्रित वस्तु उस इंटरफ़ेस का समर्थन करने में बंद है, भले ही आवश्यकता हो उस वस्तु के कार्यान्वयन को बदलने के लिए।
इसमें से किसी को भी यह दावा करते हुए नहीं पढ़ा जाना चाहिए कि निर्भरता इंजेक्शन खराब है - इससे दूर। लेकिन किसी भी अच्छी तकनीक को अत्यधिक और गलत जगह पर लगाया जा सकता है। जिस तरह हर तार को निकालने की जरूरत नहीं होती और उसे एक पैरामीटर में बदल दिया जाता है, न कि हर निम्न-स्तरीय व्यवहार को उच्च-स्तरीय वस्तुओं से बाहर निकालने और एक इंजेक्शन निर्भरता में बदलने की आवश्यकता होती है।