निर्भरता इंजेक्शन कंटेनरों के क्या लाभ हैं?


104

मैं निर्भरता इंजेक्शन के लाभों को स्वयं समझता हूं। उदाहरण के लिए स्प्रिंग लेते हैं। मैं अन्य स्प्रिंग फीचर्स AOP के फायदे, विभिन्न प्रकार के मददगार आदि को भी समझता हूं, मैं सोच रहा हूं कि XML के क्या फायदे हैं जैसे:

<bean id="Mary" class="foo.bar.Female">
  <property name="age" value="23"/>
</bean>
<bean id="John" class="foo.bar.Male">
  <property name="girlfriend" ref="Mary"/>
</bean>

सादे पुराने जावा कोड की तुलना में जैसे:

Female mary = new Female();
mary.setAge(23);
Male john = new Male();
john.setGirlfriend(mary);

जो आसान डिबग किया गया है, संकलन समय की जाँच की और केवल जावा जानता है जो किसी के द्वारा समझा जा सकता है। तो एक निर्भरता इंजेक्शन ढांचे का मुख्य उद्देश्य क्या है? (या कोड का एक टुकड़ा जो इसके लाभ दिखाता है।)


अद्यतन: के
मामले में

IService myService;// ...
public void doSomething() {  
  myService.fetchData();
}

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

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


अद्यतन 2:
मुझे एहसास है कि IoC कॉन्फ़िगरेशन को बिना बदले में बदला जा सकता है। क्या यह वास्तव में इतना अच्छा विचार है? मैं समझ सकता हूं कि जब कोई डीबी क्रेडेंशियल्स को फिर से शुरू किए बिना बदलना चाहता है - वह डेवलपर नहीं हो सकता है। आपके व्यवहार में, डेवलपर के अलावा किसी अन्य व्यक्ति ने कितनी बार IoC कॉन्फ़िगरेशन में बदलाव किया है? मुझे लगता है कि डेवलपर्स के लिए कॉन्फ़िगरेशन बदलने के बजाय उस विशेष वर्ग को फिर से जोड़ने का कोई प्रयास नहीं है। और गैर-डेवलपर के लिए आप शायद अपने जीवन को आसान बनाना चाहते हैं और कुछ सरल कॉन्फ़िगरेशन फ़ाइल प्रदान करेंगे।


अद्यतन 3:

इंटरफेस और उनके ठोस कार्यान्वयन के बीच मानचित्रण का बाहरी विन्यास

इसे व्यापक बनाने में क्या अच्छा है? आप अपने सभी कोड को बाहरी नहीं बनाते हैं, जबकि आप निश्चित रूप से - बस इसे ClassName.java.txt फ़ाइल में रख सकते हैं, पढ़ सकते हैं और मैन्युअल रूप से मक्खी - वाह पर संकलित कर सकते हैं, आपने recompiling से परहेज किया। क्यों संकलन से बचा जाना चाहिए ?!

आप कोडिंग का समय बचाते हैं क्योंकि आप प्रक्रियात्मक रूप से मैपिंग प्रदान करते हैं, प्रक्रियात्मक कोड में नहीं

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

नियंत्रण सिद्धांत का उलटा आसान इकाई परीक्षण की अनुमति देता है क्योंकि आप वास्तविक कार्यान्वयन को नकली लोगों के साथ बदल सकते हैं (जैसे कि SQL डेटाबेस को इन-मेमोरी के साथ बदलना)

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

mary = new FakeFemale();

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

जब मैं हाइबरनेट मैपिंग की घोषणा करता हूं, मैं सिर्फ हाइबरनेट को कुछ जानकारी देता हूं, और यह इसके आधार पर काम करता है - मैं यह नहीं बताता कि क्या करना है। वसंत के मामले में, मेरी घोषणा वसंत को ठीक वैसा ही करने के लिए कहती है - तो क्यों घोषित करें, क्यों न करें?


पिछले अद्यतन:
दोस्तों, बहुत सारे उत्तर मुझे निर्भरता इंजेक्शन के बारे में बता रहे हैं, जो मुझे पता है कि यह अच्छा है। प्रश्न कोड को आरंभ करने के बजाय DI कॉन्फ़िगरेशन के उद्देश्य के बारे में है - मुझे लगता है कि कोड को छोटा और स्पष्ट करना प्रारंभिक है। मेरे प्रश्न का अब तक का एकमात्र उत्तर, यह है कि यह विन्यास को बदलने से बचता है। मुझे लगता है कि मुझे एक और प्रश्न पोस्ट करना चाहिए, क्योंकि यह मेरे लिए एक बड़ा रहस्य है, इस मामले में संकलन से क्यों बचा जाना चाहिए।


21
अंत में किसी में यह सवाल पूछने की हिम्मत थी। जब वास्तव में आपके बलिदान (या कम से कम अपमानजनक) उपकरण / आईडीई समर्थन की लागत में परिवर्तन होता है तो आप पुनर्मूल्यांकन से क्यों बचना चाहेंगे?
ईसाई क्लाऊसर

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

@ ओरियन उदाहरण मैंने दिए (पुरुष और महिला के साथ) किसी भी आईओसी कंटेनर की आवश्यकता नहीं है। मैं IOC के साथ ठीक हूँ; कंटेनर का उपयोग करके यह XML का उपयोग करके कॉन्फ़िगर किया गया है या नहीं, अभी भी मेरे लिए एक खुला प्रश्न है।
पावेल फेल्डमैन

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

मैं नमूने के साथ परेशानी देख रहा हूं। सिद्धांतों पर, इंजेक्ट सेवाएँ हैं, डेटा नहीं
Jacek Cz

जवाबों:


40

अपने लिए एक आईओसी का उपयोग करने के मुख्य कारणों में से एक (और बाहरी विन्यास का उपयोग करना) दो क्षेत्रों के आसपास है:

  • परिक्षण
  • उत्पादन रखरखाव

परिक्षण

यदि आप अपने परीक्षण को 3 परिदृश्यों में विभाजित करते हैं (जो बड़े पैमाने पर विकास में काफी सामान्य है):

  1. इकाई का परीक्षण
  2. एकीकरण जांच
  3. ब्लैक बॉक्स परीक्षण

आप पिछले दो परीक्षण परिदृश्यों (एकता और ब्लैक बॉक्स) के लिए क्या करना चाहते हैं, आवेदन के किसी भी हिस्से को फिर से नहीं जोड़ रहा है।

यदि आपके किसी भी परिक्षण परिदृश्य में आपको कॉन्फ़िगरेशन बदलने की आवश्यकता है (यानी: बैंकिंग एकीकरण की नकल करने के लिए किसी अन्य घटक का उपयोग करें, या एक प्रदर्शन लोड करें), तो इसे आसानी से नियंत्रित किया जा सकता है (यह DI के विन्यास के लाभ के अंतर्गत आता है a) आईओसी हालांकि।

इसके अतिरिक्त यदि आपका ऐप या तो कई साइटों (विभिन्न सर्वर और घटक कॉन्फ़िगरेशन के साथ) में उपयोग किया जाता है या लाइव वातावरण पर एक बदलते कॉन्फ़िगरेशन का उपयोग करता है तो आप परीक्षण के बाद के चरणों का उपयोग करके यह सत्यापित कर सकते हैं कि ऐप उन परिवर्तनों को संभाल लेगा।

उत्पादन

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

सारांश

एक आईओसी का बाहरी विन्यास दूसरों को (गैर-डेवलपर्स) आपके एप्लिकेशन को कॉन्फ़िगर करने की शक्ति देने से आता है, मेरे अनुभव में यह केवल परिस्थितियों के सीमित सेट के तहत उपयोगी है:

  • आवेदन कई साइटों / ग्राहकों को वितरित किया जाता है जहां वातावरण अलग होगा।
  • उत्पादन वातावरण और सेटअप पर सीमित विकास नियंत्रण / इनपुट।
  • परीक्षण परिदृश्य।

व्यवहार में मैंने पाया है कि कुछ ऐसा विकसित करने पर भी जब आपका पर्यावरण पर नियंत्रण होता है, तो इसे चलाया जाएगा, समय के साथ किसी और को कॉन्फ़िगरेशन बदलने की क्षमता देना बेहतर होगा:

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

नोट: अनुप्रयोग पूर्ण समाधान (केवल निष्पादन योग्य नहीं) को संदर्भित करता है, इसलिए एप्लिकेशन को चलाने के लिए सभी फ़ाइलों की आवश्यकता होती है


14

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

एक भाषा को सामान्य ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग तकनीकों के साथ-साथ ऑब्जेक्ट इंटरफेस और ऑब्जेक्ट प्रतिबिंब (उदाहरण के लिए जावा और सी #) के लिए समर्थन प्रदान करना चाहिए। जब आप C ++ सिस्टम में DI पैटर्न का उपयोग करके प्रोग्राम बना सकते हैं, तो भाषा के भीतर प्रतिबिंब समर्थन की कमी से इसे एप्लिकेशन सर्वर और अन्य DI प्लेटफ़ॉर्म का समर्थन करने से रोकता है और इसलिए DI पैटर्न की अभिव्यक्तता को सीमित करता है।

डि पैटर्न का उपयोग करके निर्मित प्रणाली की ताकत:

  1. डीआई कोड का पुन: उपयोग करना बहुत आसान है क्योंकि 'डिपेंडेड' कार्यक्षमता को अच्छी तरह से परिभाषित इंटरफेस में एक्सट्रपलेशन किया जाता है, जिससे अलग-अलग ऑब्जेक्ट्स की अनुमति मिलती है, जिनके कॉन्फ़िगरेशन को एक उपयुक्त एप्लिकेशन प्लेटफॉर्म द्वारा अन्य वस्तुओं में प्लग किए जाने के लिए नियंत्रित किया जाता है।
  2. DI कोड का परीक्षण करना बहुत आसान है। ऑब्जेक्ट द्वारा व्यक्त की गई कार्यक्षमता को आपके एप्लिकेशन लॉजिक द्वारा अपेक्षित इंटरफेस को लागू करने वाली 'नकली' वस्तुओं का निर्माण करके एक ब्लैक बॉक्स में परीक्षण किया जा सकता है।
  3. DI कोड अधिक लचीला है। यह सहज रूप से शिथिल युग्मित कोड है - एक चरम तक। यह प्रोग्रामर को चुनने और चुनने की अनुमति देता है कि कैसे ऑब्जेक्ट्स एक छोर पर उनके आवश्यक इंटरफेस के आधार पर विशेष रूप से जुड़े होते हैं और दूसरे पर उनके व्यक्त किए गए इंटरफेस।
  4. डि ऑब्जेक्ट्स के बाहरी (Xml) कॉन्फ़िगरेशन का अर्थ है कि अन्य आपके कोड को अप्रत्याशित दिशाओं में अनुकूलित कर सकते हैं।
  5. बाहरी कॉन्फ़िगरेशन भी चिंता का एक अलग पैटर्न है जिसमें ऑब्जेक्ट इनिशियलाइज़ेशन और ऑब्जेक्ट इंटरडिपेंडेंसी मैनेजमेंट की सभी समस्याओं को एप्लिकेशन सर्वर द्वारा नियंत्रित किया जा सकता है।
  6. ध्यान दें कि डीआई पैटर्न का उपयोग करने के लिए बाहरी कॉन्फ़िगरेशन की आवश्यकता नहीं है, साधारण इंटरकनेक्ट के लिए एक छोटा बिल्डर ऑब्जेक्ट अक्सर पर्याप्त होता है। दोनों के बीच लचीलेपन का एक व्यापार है। एक बिल्डर ऑब्जेक्ट बाहरी रूप से दिखाई देने वाली कॉन्फ़िगरेशन फ़ाइल के रूप में लचीला विकल्प नहीं है। डि सिस्टम के डेवलपर को सुविधा पर लचीलेपन के फायदों को तौलना चाहिए, इस बात का ख्याल रखते हुए कि छोटे पैमाने पर, वस्तु निर्माण पर बारीक दाने का नियंत्रण जैसा कि एक विन्यास फाइल में व्यक्त किया गया है, इससे भ्रम की स्थिति बढ़ सकती है और रखरखाव लागत में कमी आ सकती है।

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

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

आप सही हैं कि कोड की मात्र 10s की एक पंक्ति में कई वस्तुओं की तुलना में समझना आसान है, साथ ही XML कॉन्फ़िगरेशन फ़ाइलों की एक श्रृंखला। हालाँकि, अधिकांश शक्तिशाली डिज़ाइन पैटर्न के साथ, लाभ प्राप्त होता है क्योंकि आप सिस्टम में नई सुविधाएँ जोड़ना जारी रखते हैं।

संक्षेप में, बड़े पैमाने पर DI आधारित अनुप्रयोग दोनों डिबग करने के लिए आसान और समझने में आसान हैं। हालांकि Xml कॉन्फ़िगरेशन 'कंपाइल टाइम चेक इन' सभी एप्लिकेशन सेवाओं के बारे में नहीं है जो इस लेखक को पता है कि अगर वे किसी ऑब्जेक्ट को असंगत इंटरफ़ेस वाले ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट में इंजेक्ट करने का प्रयास करते हैं, तो वह डेवलपर को त्रुटि संदेश प्रदान करेगा। और अधिकांश एक 'चेक' सुविधा प्रदान करते हैं जो सभी ज्ञात ऑब्जेक्ट कॉन्फ़िगरेशन को कवर करता है। यह आसानी से और जल्दी से जाँच किया जाता है कि टू-इन-इंजेक्शन ऑब्जेक्ट ए सभी कॉन्फ़िगर किए गए इंजेक्शन के लिए ऑब्जेक्ट बी द्वारा आवश्यक इंटरफ़ेस को लागू करता है।


4
DI के लाभों को समझें। मुझे समझ में नहीं आता है कि बाहरी XML कॉन्फ़िगरेशन द्वारा समान कोड को कॉन्फ़िगर करने की तुलना में क्या लाभ हैं। आपके द्वारा उल्लिखित लाभ डि डिजाइन पैटर्न द्वारा प्रदान किए गए हैं। प्रश्न सादा प्रारंभिक कोड की तुलना में DI कॉन्फ़िगरेशन के लाभों के बारे में था।
पावेल फेल्डमैन

> बाहरी कॉन्फ़िगरेशन भी एक पृथक्करण है ... कॉन्फ़िगरेशन का पृथक्करण DI का दिल है जो अच्छा है। और यह शुरुआती कोड का उपयोग करके गुंबद कर सकता है। कोड को इनिशियलाइज़ करने की तुलना में cfg क्या जोड़ता है? मेरे लिए ऐसा लगता है कि cfg की प्रत्येक लाइन में कोड को इनिशियलाइज़ करने की एक ही लाइन होती है।
पावेल फेल्डमैन

7

यह थोड़ा भरा हुआ सवाल है, लेकिन मैं इस बात से सहमत हूं कि बड़ी मात्रा में xml कॉन्फ़िगरेशन वास्तव में बहुत लाभ के लिए नहीं है। मुझे लगता है कि मेरे आवेदन संभवता पर निर्भरता के साथ प्रकाश के रूप में हो सकते हैं, जिसमें भारी रूपरेखा भी शामिल है।

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

मुझे लगता है कि यह शैली पर थोड़ा निर्भर करता है, और आप किस चीज के साथ सहज हैं ... क्या आपको अपना समाधान उड़ाना पसंद है और मौजूदा समाधानों पर इसे जानने का लाभ है, या मौजूदा समाधान पर बैंक को मुश्किल हो सकती है जब कॉन्फ़िगरेशन isn ' टी बस सही? यह सब एक व्यापार है।

हालांकि, एक्सएमएल कॉन्फ़िगरेशन मेरा एक छोटा सा पेशाब है ... मैं हर कीमत पर इससे बचने की कोशिश करता हूं।


5

जब भी आप सही दिशा में एक कदम बढ़ा रहे हैं, तो आप अपना कोड बदल सकते हैं।

डेटा के रूप में किसी भी चीज़ को कोड करने का मतलब है कि आपका कोड स्वयं अधिक सामान्य और पुन: प्रयोज्य है। इसका मतलब यह भी है कि आपका डेटा एक ऐसी भाषा में निर्दिष्ट किया जा सकता है जो इसे बिल्कुल फिट बैठता है।

इसके अलावा, एक XML फ़ाइल को GUI या किसी अन्य उपकरण में पढ़ा जा सकता है और आसानी से व्यावहारिक रूप से हेरफेर किया जा सकता है। कोड उदाहरण के साथ आप ऐसा कैसे करेंगे?

मैं लगातार चीजों को फैक्टर कर रहा हूं ज्यादातर लोग डेटा में कोड के रूप में लागू करेंगे, यह बनाता है कि क्या कोड छोड़ दिया गया है MUCH क्लीनर। मुझे यह समझ में नहीं आता है कि लोग डेटा के बजाय कोड में एक मेनू बनाएंगे - यह स्पष्ट होना चाहिए कि कोड में ऐसा करना बॉयलरप्लेट के कारण सिर्फ सादा गलत है।


समझ में आता है, इस परिप्रेक्ष्य में इसके बारे में नहीं सोचा था
पावेल फेल्डमैन

7
तब फिर से, लोग अक्सर दूसरे रास्ते पर जाते हैं और कोशिश करते हैं और तर्क को डेटा में डालते हैं जिसका मतलब है कि आप अपने एप्लिकेशन को एक घटिया प्रोग्रामिंग भाषा में कोडिंग करते हैं
केसबैश

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

1
"जब भी आप सही दिशा में एक कदम बढ़ा रहे हैं, तो आप अपना कोड बदल सकते हैं।" शीतल कोडिंग विरोधी पैटर्न में आपका स्वागत है।
राडवल्ड

@Raedwald आप किस बारे में बात कर रहे हैं, जो वास्तव में कठिन है, अगर आप नहीं जानते कि आप क्या कर रहे हैं (और किसी ने अक्षम व्यक्ति ने इसे करने की कोशिश की, तो असफल हो गया और इसे एक विरोधी स्वरूप कहा) अधिक सकारात्मक उदाहरण इंजेक्शन, Iterators होंगे , एनोटेशन के साथ कुछ भी, कुछ भी जो सरणियों के साथ आरंभ करता है। अधिकांश महान प्रोग्रामिंग संरचनाएं आपके कोड के अंतरों को अलग करने और जो कुछ बचा है उसे संयोजित करने का प्रयास है, इसे कुछ ऐसी चीज़ों के साथ चलाएं जिन्हें बेहतर तरीके से प्रबंधित किया जा सके।
बिल के

3

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

उदाहरण के लिए, स्प्रिंग आपको आरंभिक इंटरफ़ेस को लागू करने और एक afterPropertiesSet विधि को जोड़ने की अनुमति देता है (आप अपने कोड को स्प्रिंग से बचने के लिए "init-method" भी निर्दिष्ट कर सकते हैं)। ये विधियां आपको यह सुनिश्चित करने की अनुमति देंगी कि आपके वर्ग उदाहरण में फ़ील्ड के रूप में निर्दिष्ट किसी भी इंटरफ़ेस को स्टार्टअप पर सही ढंग से कॉन्फ़िगर किया गया है, और फिर आपको अपने गेटर्स और सेटरों की जांच करने की आवश्यकता नहीं है (यह मानते हुए कि आप अपने सिंगलटन को थ्रेड-सुरक्षित रहने दें )।

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

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

लेकिन, services.xml फ़ाइल के लिए धन्यवाद, मुझे चार नई कक्षाएं बनानी पड़ीं, जो कि उनके कंस्ट्रक्टरों में स्प्रिंग कॉन्फ़िगरेशन फ़ाइलों में उनके डिफॉल्ट्स के अनुसार उनके डिफॉल्ट्स को सेट करना था। यदि हम स्प्रिंग कॉन्फ़िगरेशन का उपयोग करने में सक्षम थे, तो मैं अभी बता सकता था:

<bean id="base" parent="RootXFireBean">
    <property name="secondProperty" ref="secondBean" />
</bean>

<bean id="secondBean" parent="secondaryXFireBean">
    <property name="firstProperty" ref="thirdBean" />
</bean>

<bean id="thirdBean" parent="thirdXFireBean">
    <property name="secondProperty" ref="myNewBean" />
</bean>

<bean id="myNewBean" class="WowItsActuallyTheCodeThatChanged" />

इसके बजाय, यह इस तरह दिखता है:

public class TheFirstPointlessClass extends SomeXFireClass {
    public TheFirstPointlessClass() {
        setFirstProperty(new TheSecondPointlessClass());
        setSecondProperty(new TheThingThatWasHereBefore());
    }
}

public class TheSecondPointlessClass extends YetAnotherXFireClass {
    public TheSecondPointlessClass() {
        setFirstProperty(TheThirdPointlessClass());
    }
}

public class TheThirdPointlessClass extends GeeAnotherXFireClass {
    public TheThirdPointlessClass() {
        setFirstProperty(new AnotherThingThatWasHereBefore());
        setSecondProperty(new WowItsActuallyTheCodeThatChanged());
    }
}

public class WowItsActuallyTheCodeThatChanged extends TheXFireClassIActuallyCareAbout {
    public WowItsActuallyTheCodeThatChanged() {
    }

    public overrideTheMethod(Object[] arguments) {
        //Do overridden stuff
    }
}

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


3

मेरे पास आपका जवाब है

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

बिल्ड सिस्टम और बाहरी कॉन्फ़िगरेशन के बारे में अन्य उपयोगी उपयोग के मामले:

  • अलग-अलग बिल्ड के लिए एकल कोड आधार के लिए स्टाइल / स्टाइलशीट इंजेक्ट कर रहा है
  • अपने एकल कोड आधार के लिए गतिशील सामग्री (या उनके संदर्भ) के विभिन्न सेटों को इंजेक्ट करना
  • विभिन्न बिल्ड / क्लाइंट के लिए स्थानीयकरण संदर्भ को इंजेक्ट करना
  • एक webservice यूआरआई को बैकअप सर्वर में बदलना (जब मुख्य नीचे जाता है)

अद्यतन: उपरोक्त सभी उदाहरण उन चीजों पर थे जिन्हें आवश्यक रूप से कक्षाओं पर निर्भरता की आवश्यकता नहीं थी। लेकिन आप आसानी से उन मामलों का निर्माण कर सकते हैं जहां एक जटिल वस्तु और स्वचालन दोनों आवश्यक हैं - उदाहरण के लिए:

  • कल्पना कीजिए कि आपके पास एक सिस्टम था जिसमें यह आपकी वेबसाइट के ट्रैफ़िक पर नज़र रखता था। समवर्ती उपयोगकर्ताओं के # के आधार पर, यह लॉगिंग तंत्र को चालू / बंद करता है। शायद जब तंत्र बंद होता है, तो एक स्टब ऑब्जेक्ट को उसके स्थान पर रखा जाता है।
  • कल्पना करें कि आपके पास एक वेब कॉन्फ्रेंसिंग प्रणाली थी जिसमें उपयोगकर्ताओं के # के आधार पर, आप प्रतिभागियों के # आधार पर पी 2 पी करने की क्षमता को बदलना चाहते हैं।

शीर्ष पर एंटरप्राइज पहलू को उजागर करने के लिए +1। खराब लिखित विरासत कोड का परीक्षण करना कई बार एक दिन का बुरा सपना हो सकता है।
रिचर्ड ले मेसुरियर

2

जब भी आप कॉन्फ़िगरेशन में कुछ बदलते हैं तो आपको हर बार अपने कोड को पुन: व्यवस्थित करने की आवश्यकता नहीं होती है। यह कार्यक्रम की तैनाती और रखरखाव को सरल करेगा। उदाहरण के लिए, आप कॉन्फ़िगर फ़ाइल में सिर्फ 1 परिवर्तन के साथ एक घटक को दूसरे के साथ स्वैप कर सकते हैं।


तैनाती? शायद ... परिनियोजन का रखरखाव? शायद ... कोड का रखरखाव? मुझे नहीं लगता है ... चौखटे के माध्यम से डिबगिंग एक बड़ा सिरदर्द है, और उस संबंध से निपटने के लिए पीओजोस बहुत आसान है।
माइक स्टोन

1
माइक, मैंने कोड के बारे में कुछ नहीं कहा। हम सभी जानते हैं कि XML कॉन्फ़िगरेशन बेकार है :)
aku

हम्म .. कितनी बार आप घटकों को बदलने के बिना बदलते हैं और क्या? मैं समझता हूं कि यदि कोई व्यक्ति डीबी क्रेडेंशियल्स को बदलता है और कार्यक्रम को फिर से शुरू नहीं करना चाहता है - वह वह नहीं हो सकता है जो इसे विकसित करता है। लेकिन मैं शायद ही कभी वसंत विन्यास को बदलने वाले डेवलपर के अलावा किसी और की कल्पना कर सकता हूं
पावेल फेल्डमैन

पावेल आमतौर पर यह स्थिति तब होती है जब आपको सैकड़ों क्लाइंट्स को प्रोग्राम तैनात करना होता है। ऐसी स्थिति में उत्पाद के नए संस्करण को तैनात करने के बजाय कॉन्फ़िगर को बदलना बहुत आसान है। आप देवों के बारे में सही कह रहे हैं। आमतौर पर डेवलपर नया cfg बनाता है और व्यवस्थापक इसे तैनात करता है।
एक्यू

2

आप प्रेमिका के लिए एक नए कार्यान्वयन में स्लॉट कर सकते हैं। तो आपके कोड को फिर से जमा किए बिना नई महिला को इंजेक्शन लगाया जा सकता है।

<bean id="jane" class="foo.bar.HotFemale">
  <property name="age" value="19"/>
</bean>
<bean id="mary" class="foo.bar.Female">
  <property name="age" value="23"/>
</bean>
<bean id="john" class="foo.bar.Male">
  <property name="girlfriend" ref="jane"/>
</bean>

(उपरोक्त महिला और हॉटफ्रेम एक ही गर्लफ्रेंड इंटरफ़ेस लागू करते हैं)


क्यों पुनर्मूल्यांकन के बिना तर्क संशोधनों को एक अच्छा विचार माना जाता है?
पावेल फेल्डमैन

मैं निश्चित रूप से HotFemont jane = नया HotFmale () कर सकता हूं; jane.setAge (19); john.setGirlfriend (जेन); तो फर्क सिर्फ इतना है कि cfg को बिना recompiling के बदला जा सकता है? जब वसंत की चर्चा होती है तो यह आम उत्तर लगता है। क्यों?! संकलन करने से बचना अच्छा क्यों है?
पावेल फेल्डमैन

वैसे मैं बेहतर तरीके से कोड का परीक्षण कर सकता हूं मैं महिला ऑब्जेक्ट को मॉक कर सकता हूं।
पॉल व्हेलन

@ पावेल फेल्डमैन: क्योंकि यदि आपके पास क्लाइंट में पहले से ही ऐप है तो यह आसान है।
आंद्रेई रोनेया

1

.NET की दुनिया में, अधिकांश IoC फ्रेमवर्क XML और कोड कॉन्फ़िगरेशन दोनों प्रदान करते हैं।

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


यह बहुत अच्छा है कि मैं आखिरकार इसका उपयोग करने के लिए कोड का उपयोग कर सकता हूं :) लेकिन मुझे ऐसी चीजों को करने के लिए प्रोग्रामिंग भाषा के अलावा और कुछ भी क्यों चाहिए?
पावेल फेल्डमैन

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

1

आंशिक कॉन्फ़िगरेशन को अंतिम पूर्ण कॉन्फ़िगरेशन में संयोजित करने में आसानी ।

उदाहरण के लिए, वेब अनुप्रयोगों में, मॉडल, दृश्य और नियंत्रक आमतौर पर अलग कॉन्फ़िगरेशन फ़ाइलों में निर्दिष्ट होते हैं। घोषणात्मक दृष्टिकोण का उपयोग करें, आप उदाहरण के लिए लोड कर सकते हैं:

  UI-context.xml
  Model-context.xml
  Controller-context.xml

या एक अलग यूआई और कुछ अतिरिक्त नियंत्रकों के साथ लोड करें:

  AlternateUI-context.xml
  Model-context.xml
  Controller-context.xml
  ControllerAdditions-context.xml

कोड में समान करने के लिए आंशिक कॉन्फ़िगरेशन के संयोजन के लिए एक बुनियादी ढांचे की आवश्यकता होती है। कोड में करना असंभव नहीं है, लेकिन आईओसी ढांचे का उपयोग करना निश्चित रूप से आसान है।


1

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

उत्पादन प्रणालियों में, XML फ़ाइल में सेटिंग्स के कुछ सबसेट (उदाहरण के लिए आप उदाहरण के लिए) को निकालने के लिए बहुत व्यावहारिक है और उदाहरण के लिए, सिस्टम कोड या व्यक्तिगत समर्थन का समर्थन करने के लिए उन्हें स्रोत कोड या अन्य सेटिंग्स पर पूर्ण शक्ति दिए बिना - या बस उन्हें जटिलताओं से अलग करना।


यह एक मान्य बिंदु है, लेकिन वसंत विन्यास अक्सर जटिल हो जाता है। हालांकि उम्र को बदलना आसान है, फिर भी sysadmin को बड़ी xml फ़ाइल से निपटना पड़ता है जिसे वह पूरी तरह से आवश्यक नहीं समझता है। क्या स्प्रिंग एक्सएमएल विन्यास की तुलना में उस हिस्से को निकालना बेहतर नहीं है जिसे कुछ और भी सरल में कॉन्फ़िगर किया जाना है? गुण फ़ाइल की तरह, एकल पंक्ति "आयु = 23" के साथ और अन्य विवरणों को बदलने की अनुमति न दें, जैसे कि कक्षा के नाम, आदि, जिन्हें आंतरिक संरचना संरचना के ज्ञान की आवश्यकता होती है।
पावेल फेल्डमैन

मैं हाल ही में एक परियोजना पर काम कर रहा था जिसमें जावा कोड और एक्सएसएलटी का मिश्रण था। टीम उन लोगों का मिश्रण थी जो जावा में मजबूत थे (और शायद एक्सएमएल और एक्सएसएलटी के साथ काम करने में कम आरामदायक थे); और वे लोग जो XML और XSLT (और जावा के साथ कम सहज) के साथ बहुत मजबूत काम कर रहे थे। चूंकि कॉन्फ़िगरेशन को दूसरे समूह द्वारा प्रबंधित किया जा रहा था, इसलिए इसे स्प्रिंग का उपयोग करने के लिए समझ में आया और इसमें XML कॉन्फ़िगरेशन है। दूसरे शब्दों में, स्प्रिंग ने टीम में एक डिवीजन-ऑफ-लेबर समस्या को हल किया। यह एक "तकनीकी" समस्या का समाधान नहीं था; इस अर्थ में कि विन्यास जावा कोड के साथ आसानी से किया जा सकता था।
दाऊद इब्न करीम

एक निर्भरता इंजेक्शन कंटेनर के भीतर बनाई जा रही कुछ वर्गों को बदलने के बारे में 'सपोर्ट कर्मियों' को कब पता चलेगा ?? वास्तव में इस धारणा के तहत कि ऐसा करना एक डेवलपर का काम है?
जिम्बो

यही कारण है कि कॉन्फ़िगरेशन मानों को निकालना (जैसे कि आपके द्वारा एकीकृत सिस्टम का URL) समझ में आता है: समर्थन व्यक्ति फ़ाइल गुण (या सबसे खराब स्थिति में) XML फ़ाइल को संकलित करता है, संकलित जावा वर्ग समान रहता है।
मिरो ए

1

एक वसंत दृष्टिकोण से मैं आपको दो उत्तर दे सकता हूं।

पहले XML कॉन्फ़िगरेशन कॉन्फ़िगरेशन को परिभाषित करने का एकमात्र तरीका नहीं है। अधिकांश चीजों को एनोटेशन का उपयोग करके कॉन्फ़िगर किया जा सकता है और जो चीजें एक्सएमएल के साथ होनी चाहिए, वे कोड के लिए कॉन्फ़िगरेशन हैं जो आप वैसे भी नहीं लिख रहे हैं, जैसे कि कनेक्शन पूल जो आप लाइब्रेरी से उपयोग कर रहे हैं। स्प्रिंग 3 में आपके उदाहरण में हाथ से रोल किए गए DI कॉन्फ़िगरेशन के समान जावा का उपयोग करके डि कॉन्फ़िगरेशन को परिभाषित करने के लिए एक विधि शामिल है। तो स्प्रिंग का उपयोग करने का मतलब यह नहीं है कि आपको XML आधारित कॉन्फ़िगरेशन फ़ाइल का उपयोग करना होगा।

दूसरी बात यह है कि स्प्रिंग सिर्फ DI फ्रेमवर्क से बहुत अधिक है। इसमें लेन-देन प्रबंधन और AOP सहित कई अन्य विशेषताएं हैं। स्प्रिंग एक्सएमएल कॉन्फ़िगरेशन इन सभी अवधारणाओं को एक साथ मिलाता है। अक्सर एक ही कॉन्फ़िगरेशन फ़ाइल में मैं बीन निर्भरता, लेन-देन सेटिंग्स निर्दिष्ट कर रहा हूं और सत्र scoped सेम जोड़ रहा हूं जो वास्तव में पृष्ठभूमि में AOP का उपयोग कर संभाल रहा है। मुझे लगता है कि XML कॉन्फ़िगरेशन इन सभी विशेषताओं को प्रबंधित करने के लिए एक बेहतर स्थान प्रदान करता है। मुझे यह भी लगता है कि एनोटेशन आधारित कॉन्फ़िगरेशन और एक्सएमएल कॉन्फ़िगरेशन जावा आधारित कॉन्फ़िगरेशन करने से बेहतर है।

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


0

स्प्रिंग में एक गुणक लोडर भी है। हम इस पद्धति का उपयोग उन चर को सेट करने के लिए करते हैं जो पर्यावरण पर निर्भर हैं (जैसे विकास, परीक्षण, स्वीकृति, उत्पादन, ...)। यह उदाहरण के लिए कतार को सुनने के लिए हो सकता है।

यदि कोई कारण नहीं है कि संपत्ति क्यों बदलेगी, तो इस तरह से इसे कॉन्फ़िगर करने का कोई कारण भी नहीं है।


0

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

IService myService;
// ...
public void doSomething() {
  myService.fetchData();
}

(ध्यान दें कि myService का प्रकार IService है - एक इंटरफ़ेस, एक ठोस कार्यान्वयन नहीं)। अब यह आसान हो सकता है कि अपने IoC कंटेनर को इनिशियलाइज़ेशन के दौरान अपने आप ही सही ठोस उदाहरण प्रदान कर सकें - जब आपके पास कई इंटरफेस और कई कार्यान्वयन हैं, तो यह हाथ से करने के लिए बोझिल हो सकता है। एक IoC कंटेनर (निर्भरता इंजेक्शन ढांचे) के मुख्य लाभ हैं:

  • इंटरफेस और उनके ठोस कार्यान्वयन के बीच मानचित्रण का बाहरी विन्यास
  • IoC कंटेनर कुछ मुश्किल मुद्दों को संभालता है जैसे जटिल निर्भरता ग्राफ को हल करना, घटक के जीवनकाल को प्रबंधित करना आदि।
  • आप कोडिंग का समय बचाते हैं क्योंकि आप प्रक्रियात्मक रूप से मैपिंग प्रदान करते हैं, प्रक्रियात्मक कोड में नहीं
  • नियंत्रण सिद्धांत का उलटा आसान इकाई परीक्षण की अनुमति देता है क्योंकि आप वास्तविक कार्यान्वयन को नकली लोगों के साथ बदल सकते हैं (जैसे कि SQL डेटाबेस को इन-मेमोरी के साथ बदलना)

0

XML कॉन्फिग फ़ाइल में प्रारंभ करने से आपके डिबगिंग / कार्य को एक क्लाइंट के साथ करना आसान हो जाएगा, जिनके पास आपके ऐप को उनके कंप्यूटर पर तैनात किया गया है। (क्योंकि इसमें recompilation + बाइनरी फ़ाइलों के प्रतिस्थापन की आवश्यकता नहीं है)


-2

सबसे आकर्षक कारणों में से एक " हॉलीवुड सिद्धांत है " है: हमें कॉल न करें, हम आपको कॉल करेंगे। अन्य घटकों और सेवाओं के लिए लुकअप करने के लिए एक घटक की आवश्यकता नहीं होती है; इसके बजाय वे इसे स्वचालित रूप से प्रदान करते हैं। जावा में, इसका मतलब है कि घटक के अंदर JNDI लुकअप करना अब आवश्यक नहीं है।

यह भी अलगाव में एक घटक का परीक्षण करने के लिए बहुत आसान है: इसके बजाय इसे उन घटकों के वास्तविक कार्यान्वयन की आवश्यकता होती है, जो आप बस (संभवतः ऑटो उत्पन्न) मोक्स का उपयोग करते हैं।


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

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