बहुत अधिक निर्भरता संकेत कर सकती है कि वर्ग स्वयं बहुत अधिक काम कर रहा है। यह निर्धारित करने के लिए कि क्या यह बहुत अधिक नहीं कर रहा है:
वास्तविक निर्भरता को देखकर, मुझे ऐसी कोई भी चीज नहीं दिखती जो खराब चीजों के संकेत दे रही हो:
IDbContextFactory - डेटाबेस के लिए संदर्भ बनाना।
ठीक है, हम शायद एक व्यावसायिक परत के अंदर हैं जहाँ कक्षाएं डेटा एक्सेस परत के साथ बातचीत करती हैं। ठीक लग रहा है।
IMapper - संस्थाओं से डोमेन मॉडल के लिए मानचित्रण।
समग्र चित्र के बिना कुछ भी बताना मुश्किल है। यह हो सकता है कि आर्किटेक्चर गलत है और मैपिंग सीधे डेटा एक्सेस लेयर द्वारा की जानी चाहिए, या हो सकता है कि आर्किटेक्चर पूरी तरह से ठीक हो। सभी मामलों में, यह यहाँ निर्भरता है समझ में आता है।
एक और विकल्प दो में वर्ग को विभाजित करना होगा: एक मानचित्रण से निपटने वाला, दूसरा वास्तविक व्यापार तर्क से निपटने वाला। यह एक वास्तविक परत बनाएगा जो बीएल को डीएएल से अलग करेगा। यदि मैपिंग जटिल है, तो यह एक अच्छा विचार हो सकता है। ज्यादातर मामलों में, हालांकि, यह सिर्फ बेकार जटिलता जोड़ देगा।
IClock - Abstracts DateTime.Now इकाई परीक्षणों में मदद करने के लिए।
वर्तमान समय में सिर्फ पाने के लिए एक अलग इंटरफ़ेस (और वर्ग) रखना बहुत उपयोगी नहीं है। मैं बस DateTime.Now
उन तरीकों को पास करूंगा जिनके लिए वर्तमान समय की आवश्यकता है।
यदि कोई अन्य जानकारी है, जैसे टाइमज़ोन, या दिनांक सीमाएँ आदि, तो एक अलग वर्ग समझ में आ सकता है।
IPerformanceFactory - विशिष्ट तरीकों के लिए निष्पादन समय को मापता है।
अगला बिंदु देखें
ILog - लॉगिंग के लिए Log4net।
इस तरह की ट्रांसेंडेंट कार्यक्षमता फ्रेमवर्क से संबंधित होनी चाहिए, और वास्तविक पुस्तकालयों को रनटाइम के दौरान विनिमेय और कॉन्फ़िगर करने योग्य होना चाहिए (उदाहरण के लिए .NET में app.config के माध्यम से)।
दुर्भाग्य से, यह (अभी तक) मामला नहीं है, जो आपको या तो एक पुस्तकालय लेने और उसके साथ छड़ी करने देता है, या यदि आवश्यक हो तो बाद में पुस्तकालयों को स्वैप करने में सक्षम होने के लिए एक अमूर्त परत बनाएं। यदि आपका इरादा विशेष रूप से पुस्तकालय की पसंद से स्वतंत्र होना है, तो इसके लिए जाएं। यदि आपको पूरा यकीन है कि आप वर्षों तक लाइब्रेरी का उपयोग करते रहेंगे, तो एब्सट्रैक्ट न जोड़ें।
यदि लाइब्रेरी का उपयोग करने के लिए बहुत जटिल है, तो एक मुखौटा पैटर्न समझ में आता है।
ICollectionWrapperFactory - संग्रह बनाता है (जो IEnumerable का विस्तार करता है)।
मैं मानूंगा कि यह बहुत विशिष्ट डेटा संरचनाएं बनाता है जो डोमेन लॉजिक द्वारा उपयोग की जाती हैं। यह एक उपयोगिता वर्ग की तरह दिखता है। इसके बजाय, प्रासंगिक रचनाकारों के साथ डेटा संरचना के प्रति एक वर्ग का उपयोग करें। यदि प्रारंभिक तर्क एक निर्माता में फिट करने के लिए थोड़ा जटिल है, तो स्थिर कारखाने के तरीकों का उपयोग करें। यदि तर्क और भी जटिल है, तो कारखाने या एक बिल्डर पैटर्न का उपयोग करें।
IQueryFilterFactory - इनपुट के आधार पर क्वेरीज़ उत्पन्न करता है जो db क्वेरी करेगा।
डेटा एक्सेस लेयर में ऐसा क्यों नहीं है? Filter
नाम में एक क्यों है ?
IIdentityHelper - उपयोगकर्ता में लॉग इन प्राप्त करता है।
मुझे यकीन नहीं है कि एक Helper
प्रत्यय क्यों है । सभी मामलों में, अन्य प्रत्यय या तो विशेष रूप से स्पष्ट नहीं होंगे ( IIdentityManager
?)
वैसे भी, यहाँ इस निर्भरता का सही अर्थ है।
IFaultFactory - अलग-अलग FaultException बनाएं (मैं WCF का उपयोग करता हूं)।
यह तर्क इतना जटिल है कि इसे एक कारखाने के पैटर्न का उपयोग करने की आवश्यकता है? उसके लिए डिपेंडेंसी इंजेक्शन का उपयोग क्यों किया जाता है? क्या आप उत्पादन कोड और परीक्षणों के बीच अपवादों के निर्माण की अदला-बदली करेंगे? क्यों?
मैं इसे सरल बनाने की कोशिश करूंगा throw new FaultException(...)
। यदि क्लाइंट को प्रचारित करने से पहले सभी अपवादों में कुछ वैश्विक जानकारी जोड़ी जानी चाहिए, तो शायद WCF के पास एक ऐसा तंत्र है, जहां आप एक बिना अपवाद के अपवाद को पकड़ सकते हैं और इसे बदलकर ग्राहक को वापस ला सकते हैं।
संख्याओं द्वारा गुणवत्ता को मापना आमतौर पर उतना ही बुरा है जितना कि आपके द्वारा प्रति माह लिखी गई कोड की लाइनों द्वारा भुगतान किया जाना। आपके पास एक अच्छी तरह से डिज़ाइन की गई कक्षा में बहुत अधिक निर्भरता हो सकती है, क्योंकि आप कुछ निर्भरता का उपयोग करके एक भद्दा वर्ग रख सकते हैं।
निर्भरता के बहुत से तर्क का पालन करना अधिक कठिन हो जाता है। यदि तर्क का पालन करना मुश्किल है, तो वर्ग संभवतः बहुत अधिक कर रहा है और विभाजित होना चाहिए।