2010-06-25 13 views
7

आप मूल्य की वस्तुओं और सेवाओं की वस्तुओं में अपने सिस्टम विभाजित (के रूप में सुझाव दिया "बढ़ते वस्तु उन्मुख सॉफ्टवेयर, टेस्ट से प्रेरित होकर" मान लें। Misko Hevery इन "newables" और "इंजेक्शन" कहता है।निर्भरता इंजेक्शन जब कक्षा बनाई गई तो रनटाइम मानों की भी आवश्यकता होती है?

क्या जब एक होता है आपकी मूल्य वस्तुओं को अचानक इसकी विधियों को लागू करने के लिए किसी सेवा तक पहुंचने की आवश्यकता है?

मान लें कि आपके पास एक अच्छा सरल मूल्य वस्तु है। यह अपरिवर्तनीय है, जानकारी के कुछ बिट्स रखती है और यह इसके बारे में है। मान लें कि हम इसे कुछ उपयोग करते हैं यह:

CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10"); 
if (card.isValid()) 
{ 
    // do stuff 
} 
else 
{ 
    // don't do stuff 
} 

अब तक इतना अच्छा है। isValid() कार्ड नंबर पर एक चेक अंक एल्गोरिदम लागू करता है और सत्य/गलत लौटाता है।

अब, मान लें कि मैं वर्तमान समय के विरुद्ध समाप्ति तिथि को सत्यापित करके सिस्टम को बढ़ाने की इच्छा रखता हूं। आप कैसे सुझाव देंगे कि यह वैल्यू ऑब्जेक्ट/सेवा ऑब्जेक्ट पैराडाइम तोड़ने के बिना किया जाता है? मुझे इस कक्षा को यूनिट टेस्टेबल होना जारी रखना चाहिए।

  • CreditCard अब एक निर्भरता है, लेकिन क्योंकि रास्ते से यह इंजेक्शन नहीं किया जा सकता बनाई गई है, इसलिए निर्भरता इंजेक्शन बाहर है।
  • CreditCard वर्ग Singletons के लिए बाहर नहीं जाना चाहिए बुला
  • CreditCardVerificationService.validateCard() पर व्यवहार लाना (मैं स्थिति यह है कि एक सिंगलटन करने के लिए वैश्विक पहुँच बुरा व्यवहार है की कर रहा हूँ) का अर्थ है सभी मौजूदा कोड पर दोबारा गौर किया जाना है। IsValid() का कार्यान्वयन बाहर निकल रहा है।

मुझे पता है कि ऐसी चीजें हैं जो इसे पाने के लिए की जा सकती हैं, लेकिन सबसे साफ तरीका क्या है?

उत्तर

4

मैं तर्क दूंगा कि यह कुछ भी मान्य करने के लिए क्रेडिट कार्ड ऑब्जेक्ट का काम नहीं है। एक कारखाना यह सुनिश्चित करने के लिए चेक अंकों को मान्य करेगा कि यह एक अनुरूप कार्ड को चालू कर रहा है, जबकि एक सत्यापन सेवा समाप्ति/$ सीमा के लिए कार्ड को मान्य करेगी।

+0

दिलचस्प। यह मेरे लिए स्वाभाविक लगता है कि व्यवहार (सत्यापन) क्रेडिट कार्ड ऑब्जेक्ट के बजाय डेटा के साथ रहना चाहिए। –

+4

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

+0

@WW: रॉबर्ट सी मार्टिन "अंकल बॉब" इसके मॉडेम उदाहरण में सॉलिड के एकल जिम्मेदारी सिद्धांत का वर्णन करते समय इसके बारे में बात करता है (6 पृष्ठ लेख: http://www.objectmentor.com/resources/articles/srp.pdf)। मुझे लगता है कि पिछले क्रेडिट कार्ड में। वैलिडेट() को अच्छी ऑब्जेक्ट उन्मुख डिजाइन माना जाएगा, लेकिन यह प्रवृत्ति कई अलग-अलग वर्गों से दूर प्रतीत होती है। इसके अलावा मैंने प्रोग्रामरर्स http://programmers.stackexchange.com/questions/77690/design-object-method-vs-separate-classs-method-which-takes-object-as-parameter – User

1

मुझे यह कहने का लुत्फ होगा कि CreditCard एक मूल्य वस्तु नहीं है।

C2 wiki से:

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

एक मान वस्तु BusinessObject/ReferenceObject नहीं है। BusinessObject/ReferenceObject कुछ है जो आपको दुनिया में मिलता है, जबकि एक ValueObject एक उपाय या कुछ विवरण है।

यदि CreditCardNumber एक मूल्य वस्तु हो सकता है, CreditCard एक व्यावसायिक वस्तु की तरह दिखता है जिसमें कुछ व्यावसायिक तर्क शामिल हैं, उदा। मान्यता।

मेरे पास आमतौर पर वैल्यू ऑब्जेक्ट, सर्विस और बिजनेस ऑब्जेक्ट होता है। मुझे "बढ़ते ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर" के बारे में पता नहीं है, लेकिन केवल खुद को ऑब्जेक्ट और सेवा के लिए प्रतिबंधित करना मेरे लिए अजीब लगता है।

+0

पर इसके बारे में एक प्रश्न पूछा, तो यदि क्रेडिट कार्ड एक बिजनेस ऑब्जेक्ट है, आप इस सवाल की स्थिति को कैसे संभालेंगे? –

+0

@WW मेरा सुझाव है कि आपको "डोमेन संचालित डिजाइन" पर एक नज़र डालें। इसके बारे में बहुत सारे संसाधन हैं। क्रेडिट कार्ड के उदाहरण के साथ डीडीडी के बारे में एक चर्चा यहां दी गई है http://misko.hevery.com/2009/03/16/design-for-testability-and-domain-driven-design/ – ewernli

0

मैं CreditCard कहेंगे एक इकाई बजाय एक मूल्य वस्तु, क्योंकि यह लगातार होने की संभावना है और एक अद्वितीय पहचान की है।

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

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

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