आप मूल्य की वस्तुओं और सेवाओं की वस्तुओं में अपने सिस्टम विभाजित (के रूप में सुझाव दिया "बढ़ते वस्तु उन्मुख सॉफ्टवेयर, टेस्ट से प्रेरित होकर" मान लें। 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() का कार्यान्वयन बाहर निकल रहा है।
मुझे पता है कि ऐसी चीजें हैं जो इसे पाने के लिए की जा सकती हैं, लेकिन सबसे साफ तरीका क्या है?
दिलचस्प। यह मेरे लिए स्वाभाविक लगता है कि व्यवहार (सत्यापन) क्रेडिट कार्ड ऑब्जेक्ट के बजाय डेटा के साथ रहना चाहिए। –
जो असली दुनिया को अपने सिर पर बदल देता है, यद्यपि। क्रेडिट कार्ड के पास स्वयं को प्रमाणित करने का कोई तरीका नहीं है - नकली, समाप्त हो चुके कार्ड जंगली में रहते हैं और उन्हें पता नहीं है कि वे वैध हैं या नहीं। यदि आप भुगतान प्रोसेसर से अनुरोध भेजते हैं, तो वे आपको नहीं पूछेंगे कि आपका कार्ड मान्य है या इसके लिए अपना शब्द लें - वे स्वयं को निर्धारित करेंगे, और केवल ऐसा करने के लिए आवश्यक डेटा का अनुरोध करेंगे। – expedient
@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