2010-06-25 6 views
7

मैं प्रभावी जावा पढ़ रहा हूं और मुझे टीडीडी और निर्भरता इंजेक्शन के संबंध में पहले आइटम " स्थिर कारखाने विधि का उपयोग" के बारे में कुछ चिंताएं हैं।टीडीडी और निर्भरता इंजेक्शन के साथ प्रभावी जावा आइटम 1 प्रयोज्यता

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

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

कृपया बताएं कि यह आज के जावा एंटरप्राइज़ विकास पर कैसे लागू होता है जिसमें डीआई और टीडीडी शामिल है। नई()

  • निर्भरता इंजेक्शन
  • का उपयोग कर बनाम

    • स्थिर कारखानों जब नया अपने कोड बस के रूप में कसकर एक स्थिर विधि का उपयोग कर के रूप में मिलकर है का उपयोग करते हुए:

    उत्तर

    3

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

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

    उस मामले में कारखानों बेहतर हैं क्योंकि आप अपने नियंत्रण में एक परीक्षण कारखाना इंजेक्ट कर सकते हैं। नए के साथ यह संभव नहीं है (क्लासपाथ को अजीब चीजें किए बिना टेस्ट क्लासपाथ में डमी ऑब्जेक्ट्स के साथ कार्यान्वयन को छुपाएं, जिसे मैं बीटीडब्ल्यू की सिफारिश नहीं करता)।

    4

    डी इंजन कारखाना है।

    जोशुआ ब्लोच डी को काफी अच्छी तरह समझता है। मुझे लगता है कि यह इतिहास का एक आर्टिफैक्ट है, क्योंकि डीआई की चढ़ाई "प्रभावी जावा" के पहले संस्करण के बाद आई थी।

    "प्रभावी जावा" published in 2001 था। Martin Fowler ने 2004 में इस शब्द का निर्माण किया। Spring's 1.0 release मार्च 2004 में आया।

    जोशुआ ब्लोच ने दूसरे संस्करण के लिए उस अध्याय को संशोधित नहीं किया।

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

    +0

    मुझे नहीं लगता कि आपको मेरा प्रश्न मिलता है। सवाल यह नहीं है कि हम नए युग्मन को पेश करते हैं और हमें स्थिर कारखानों का उपयोग करना चाहिए। आज के उद्यम विकास में इसकी प्रयोज्यता के बारे में। मैं नहीं कह रहा हूं कि यहोशू ब्लोच डीआई को नहीं जानता है। कृपया मेरे प्रश्न में जो मैं पूछ रहा हूं उसे उत्तर दें। मई 2008 में प्रकाशित दूसरा संस्करण – Shekhar

    +0

    मुझे पता है कि दूसरा संस्करण कब प्रकाशित हुआ था। मैं कह रहा हूं कि उसने बस उस अध्याय को अद्यतन नहीं किया। और "नुकसान जोशुआ ने टीडीडी को याद किया" ने मुझे निष्कर्ष निकाला कि आप कह रहे थे कि ब्लोच डी को नहीं जानता था। – duffymo

    0

    मुझे आपकी यही चिंता थी, और इस तरह मैंने आपका प्रश्न पाया।

    आप कहते हैं:

    अपने कोड में स्थिर कारखानों होने तंग युग्मन को बढ़ावा मिलेगा और आप इसे

    पुस्तक पता चलता है कि आप को बेनकाब करना चाहिए का उपयोग कर वर्ग नकली नहीं कर सकते क्योंकि एक स्थिर विधि (एपीआई डिजाइन) के साथ अपनी कक्षा के निर्माता। यह सुझाव नहीं देता है कि आप "हार्डकोड" अपने पूरे एप्लिकेशन (एपीआई उपयोग) पर स्थिर कॉल करें।

    आप डि के लिए Guice का उपयोग कर रहे मान लीजिए, और अपने इंटरफेस Connection कहा जाता है, तुम कर सकते हो:

    bind(Connection.class).toInstance(Connections.makeASpecificConnection(params)); 
    

    और फिर अपने सामान्य @Inject Connection connection;

    बेशक यह करता है, तो आपके कनेक्शन की एक सिंगलटन है। यदि ऐसा नहीं है, तो आप एक कार्यान्वयन के साथ एक सार फैक्ट्री इंजेक्ट कर सकते हैं जो आपके वर्ग की स्थैतिक विधि को बुलाते हुए उदाहरण बनाता है, लेकिन यह शायद अधिक हो सकता है और आप अकेले गुइस का उपयोग करके बेहतर होंगे।

    याद रखें कि यह पुस्तक मुख्य रूप से बड़े उद्यम अनुप्रयोगों के निर्माण पर लक्षित नहीं है, हालांकि यह अभी भी बहुत उपयोगी है। पुस्तक की प्रस्तावना से उद्धरण:

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

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