2009-12-14 13 views
5

मैं चाहते हैं:ServiceLocator और खुला/बंद सिद्धांत

  1. बनाओ सामान्यतः testability का त्याग किए बिना सभी वर्गों है कि उन्हें जरूरत है,
  2. बॉयलरप्लेट की एक न्यूनतम के साथ
  3. , और
  4. को दिखाई सेवाओं की आवश्यकता !

यह एक छोटी परियोजना है और मुझे लगता है कि DI अधिक हो सकता है, लेकिन शायद मैं गलत हूं? उन सदस्य के माध्यम से जिम्मेदार बताते हैं तरीकों सेवा का उपयोग, जैसे: किसी भी तरह, मैं ServiceLocator pattern as described by Martin Fowler

पर ध्यान केंद्रित किया गया है एक ग्राहक वर्ग में '

this->db = Locator::getDb(); 
this->log = Locator::getLogger(); 

फिर कक्षा के बाकी निर्माता, मैं कुछ इस तरह है' :

this->fooModel = new fooModel(this->db); 
fooItem1234 = this->fooModel->findById(1234); 

हालांकि मैं करूंगा भी "मॉडल" वस्तुओं (ऊपर fooModel) की तरह है क्योंकि वे कई अलग अलग स्थानों से पहुँचा रहे हैं और एक से अधिक उदाहरण के लिए कोई जरूरत नहीं है के लिए दृश्यता के इस स्तर की तरह।

तो मेरा प्रारंभिक विचार लोकेटर को ::getFooModel() रखने के लिए विस्तारित करना था, लेकिन अब ऐसा लगता है कि मैं ओपन/क्लोज़ड सिद्धांत का उल्लंघन कर रहा हूं, क्योंकि जब भी मैं एक नया मॉडल क्लास पेश करता हूं तो मुझे लोकेटर को संशोधित करना होगा।

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

एक और समाधान सिर्फ मेरे सभी मॉडलों के तरीकों को स्थिर बनाना होगा। तो:

fooItem1234 = FooModel::findById(1234); 

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

अंत में, DI है। लेकिन जैसा कि मैंने उपरोक्त कहा है, मुझे लगता है कि यह इस छोटी परियोजना के लिए बहुत अधिक हो सकता है।

निष्कर्ष: मैं यहां थोड़ा फंस गया हूं और स्टैक ओवरफ्लो के गुरुओं से कुछ सलाह की सराहना करता हूं!

उत्तर

7

आपको क्यों लगता है कि DI आपकी परियोजना के लिए अधिक है? डी पैटर्न जैसे कि कन्स्ट्रक्टर इंजेक्शन सेवा लोकेटर (जो मैं एक विरोधी पैटर्न पर विचार करता हूं) से सरल और क्लीनर है।

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

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

+0

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

+1

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

+0

गैर-पूरी तरह से संबंधित चीजों को ढेर/लपेटने के बारे में क्या - उदाहरण के लिए ऊपर दिए गए मेरे उदाहरण से डीबीकॉन और लॉगर - "कॉन्फ़िगर" नामक एक ऑब्जेक्ट में या वह खराब रूप है? – oops

3

... और एक से अधिक उदाहरण होने की आवश्यकता नहीं है।

आप सेब और संतरे मिश्रण कर रहे हैं। तथ्य यह है कि आपको केवल एक आवेदन के लिए कक्षा के एक उदाहरण की आवश्यकता है, वही बात नहीं है क्योंकि यह उदाहरण वैश्विक स्तर पर उपलब्ध कराने के लिए एक अच्छा विचार है। DI के साथ आप कार्डिनिटी नहीं बदलते हैं - अभी भी एक उदाहरण है। आप जो बदलते हैं वो वैरिएबल का दायरा है जो पते ने कहा था। एक अंतर है

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