2011-01-20 8 views
5

मैं निर्भरता इंजेक्शन, नियंत्रण में उलझन, और आईओसी कंटेनर पर बहुत कुछ पढ़ रहा हूं। मैं मुख्य रूप से गतिशील भाषाओं में प्रोग्राम (काम पर PHP, घर पर पायथन) भी प्रोग्राम करता हूं। यहाँ सब मैं कर रहा हूँ खोजने कर रहे हैं, लेकिन जैसा कि मैंने यह सब एक साथ टुकड़ा मुझे भरने के लिए इस अंतराल का एक बहुत छोड़ देता है:आईओसी कंटेनर और गतिशील भाषाएं (2 ले लो)

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

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

क्या मैं समय के लिए "हैंड-स्ट्रिंग" निर्भरताओं को एक साथ बेहतर करता हूं, और सिद्धांतों पर बेहतर संभाल पाने के बाद, बाद में एक कंटेनर में इसे स्वचालित करने की चिंता करता हूं? क्या यह मेरे अपने साधारण आईओसी कंटेनर को लागू करने लायक है? या क्या लाभ अंततः PHP में लागत के लायक नहीं है?

+1

क्या आपने http://components.symfony-project.org/dependency-injection/ कंटेनर का प्रयास किया था? – Mchl

+0

@mchl: वह वास्तव में बहुत अच्छा दिखता है। धन्यवाद! (उल्लेख नहीं है, यह दस्तावेज एक आईओसी कंटेनर के बेहतर विवरणों में से एक है जिसे मैंने अभी तक देखा है ... जब मैं इन सभी चीजों को समझ रहा था तो उपयोगी होता) – keithjgrant

+0

@mchl: आपका लिंक सबसे उपयोगी बात है I अभी तक देखा है। इसे एक उत्तर में ले जाएं, और यदि कोई बेहतर सतह नहीं है तो बक्षीस तुम्हारा है। – keithjgrant

उत्तर

0

मार्टिन फाउलर ने इस लेख को लिखा है जो नियंत्रण और निर्भरता इंजेक्शन के विचलन के लिए काफी बाइबल है। वह बताता है कि आईओसी कंटेनर को कैसे कार्यान्वित किया जाए और विभिन्न इंजेक्शन तंत्र की योग्यता पर चर्चा की जाए। http://martinfowler.com/articles/injection.html

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

दूसरी तरफ, ऐसा लगता है कि आपके हाथों पर एक बहुत बड़ा कामकाजी अनुप्रयोग है - और जब तक आपके पास टूटा नहीं जाता है, तो इसे ठीक करने के लिए आवश्यक नहीं हो सकता है।

3

PHP के लिए Symfony Dependency Injection आज़माएं। जावा स्प्रिंग कैसे काम करता है, लेकिन बहुत सारे PHP 'जादू' का उपयोग करके यह माना जाता है कि (माना जाता है - मुझे यह सत्यापित करने के लिए बहुत कम अनुभव है)। नतीजतन यह काफी हल्का और उपयोग करने में आसान है, जबकि काफी कुछ करने में सक्षम है।

0

यदि आप डीआईसी को अधिक डिज़ाइन नहीं करना चाहते हैं, लेकिन एक ऐसा जो आपको बहुत कॉम्पैक्ट तरीके से जरूरी बनाता है, तो इसे आजमाएं: बाल्टी (https://github.com/troelskn/bucket)। एक डी कंटेनर को और अधिक की आवश्यकता नहीं है। सिम्फनी के बगल में अक्सर एक बहुत ही खतरनाक तरीके से उपयोग किया जाता है, एक सेवा लोकेटर (निसार उर्फ ​​वैश्विक राज्य) के रूप में।

0

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

आईओसी समय के साथ लचीलापन प्रदान करने के लिए महत्वपूर्ण है लेकिन कितनी लचीलापन है? क्या आप कई बाहरी घटकों के साथ काम करते हैं? क्या आप मानक प्लगइन्स और ऑब्जेक्ट्स के साथ काम करते हैं? PHP जावा नहीं है, आपके पास जार और पुस्तकालयों की बोरी नहीं है जो इसे लोड करके और इसे एक्सएमएल में निर्देश देने के लिए किसी भी समय लागू करने के लिए तैयार है, इसके बारे में सोचें।

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

यदि आप एक लक्षित मॉडल विकसित कर रहे हैं, जिसका मतलब एक व्यावसायिक मॉडल और कुछ ग्राहकों की सेवा के लिए है, तो आईओसी खिलना में गिरने से चीजों को सरल बना दिया जाएगा।

आइंस्टीन ने कहा कि चीजें सरल होनी चाहिए, लेकिन वे जितनी सरल नहीं हैं।

1

सबसे पहले अपने निर्भरता मुद्दों को ठीक करें। यदि आप एक आईओसी कंटेनर का उपयोग बैग के रूप में करते हैं जो आपके लिए निर्भरता से संबंधित है तो यह आपको लाइन के नीचे बहुत मुश्किल से काट देगा।

आईओसी कंटेनर आपको सिस्टम आर्किटेक्चर के बारे में बात करने के लिए एक एपीआई/शब्दावली देना चाहिए।

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

आईओसी कंटेनर आपको इन बिल्डिंग ब्लॉक की संरचना को स्पष्ट रूप से व्यक्त करने का एक तरीका देना चाहिए। (एक साथ घटकों को जोड़ने वाला वायरिंग आरेख)

यह अलगाव होने से आपको अपने उपप्रणाली के जीवनकाल के बारे में सोचने की सुविधा मिलती है .. कारखानों, रजिस्ट्रीज़ का उपयोग करने के लिए, युग्मन शुरू किए बिना सिस्टम के आसपास संदेशों को कैसे पास किया जाए .. आदि।

आईओसी का बिंदु यह आपको इस तर्क को स्पष्ट रूप से बताए जाने के लिए एक जगह देने के लिए, आपको जादुई रूप से इसे हल करने के लिए नहीं देता है।

मुझे आशा है कि इस मदद करता है।

संबंधित मुद्दे