2009-03-08 16 views
6

मैं एक पुनः उपयोग करने योग्य क्लास लाइब्रेरी तैयार कर रहा हूं जिसमें 2 असेंबली (दूसरों के बीच) कोर.xml.dll और core.string.dll नामक हैं।सर्कुलर निर्भरता बनाम डीआरवाई

एक्सएमएल असेंबली कुछ स्ट्रिंग सहायक विधियों का उपयोग करने के लिए स्ट्रिंग असेंबली का संदर्भ देता है।

हालांकि अब एक स्ट्रिंग विधि है जो xml असेंबली में निहित विधि का उपयोग करने से लाभान्वित होगी।

यदि मैं स्ट्रिंग असेंबली से एक्सएमएल असेंबली का संदर्भ देता हूं तो मैंने एक परिपत्र निर्भरता बनाई होगी और स्रोत कोड से दोनों असेंबली बनाने में असमर्थ रहेगा। (यानी चिकन और अंडे की समस्या)।

"स्वयं को दोहराएं" सिद्धांत का पालन करने के लिए मैं दोनों विधानसभाओं में कार्यक्षमता को डुप्लिकेट करने से बचाना चाहता हूं। अगर मुझे कार्यान्वयन में एक बग मिलती है तो मैं इसे केवल एक ही स्थान पर ठीक करना चाहता हूं।

जबकि मैं असेंबली को एक में विलय कर सकता हूं, यह आदर्श नहीं है क्योंकि यह असेंबली की समेकन को कम करता है।

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

तो लाइब्रेरी असेंबली के पुनः उपयोग करने योग्य सेट के संदर्भ में यहां उपयोग करने का सबसे अच्छा तरीका क्या है? साथ ही, .NET ढांचा स्वयं इस मुद्दे से कैसे निपटता है?

(परावर्तक में यह प्रतीत होता है System.Configuration.dll संदर्भ System.XML.DLL और इसके विपरीत। क्या यह वास्तव में सही है, तो कैसे प्रबंधित सर्कुलर निर्भरता रहा है?) की तरह आप किसी तृतीय जरूरत

+0

क्या आप एक ठोस उदाहरण दे सकते हैं कि "... स्ट्रिंग विधि जो xml असेंबली में निहित विधि का उपयोग करने से लाभान्वित होगी।" –

+0

मैं एक रूपांतरण विधि देख रहा था जो एक्सएमएल स्वीकार करता है और स्ट्रिंग आधारित प्रारूप में परिवर्तित हो जाता है। हाँ, मैं सोच रहा हूं कि यह विशेष रूप से किसी अन्य तरीके से संभाला जा सकता है, हालांकि मुझे अभी भी अधिक सामान्य प्रश्न में दिलचस्पी है। – Ash

+0

देखो जॉन लेकोस की पुस्तक, "बड़े पैमाने पर सी ++ सॉफ्टवेयर डिजाइन"। उस सामग्री में से बहुत सी सी # के लिए लागू नहीं हो सकती है, लेकिन वह स्तरित आर्किटेक्चर के बारे में गहराई से जाता है, जो वास्तव में आपका प्रश्न हो रहा है। – Tom

उत्तर

6

चाकू के साथ सहमत हैं। परिपत्र depedencies एक डिजाइन गंध है। इसे निर्दयतापूर्वक दोहराएं!

यह उस मामले में चुनौतीपूर्ण हो सकता है जहां व्यावसायिक वस्तुओं को कसकर जोड़ दिया जाता है। ज्यादातर मामलों में यह निर्भरता इंजेक्शन के माध्यम से हल किया जा सकता है।

छद्म सी ++ उदाहरण:

class Employee { 
    Company company; 
}; 

class Company { 
    vector<Employee> employees; 
}; 

ट्रिकी? जरूरी नहीं:

template<class CompanyT> 
class Employee { 
    CompanyT company; 
}; 

class Company { 
    vector<Employee<Company> > employees; 
}; 

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

+0

लेकिन मुझे पता चला है कि सर्कुलर डिप्टी अक्सर ऑब्जेक्ट में स्वाभाविक रूप से दिखाई देते हैं उन्मुख डिजाइन, यानी कंपनी के लिए कर्मचारी काम करता है, कंपनी के कई कर्मचारी हैं। आप इस तरह के रिश्ते को बदलने के बिना कैसे प्रतिक्रिया करते हैं? – Ash

+0

@ एएसएच: क्या आपके सिस्टम का कर्मचारी कर्मचारी या कंपनी है? यदि पूर्व, तो कर्मचारी कंपनी के स्वामित्व में नहीं है, कंपनी अपने जीवन का केवल एक पहलू है। यदि उत्तरार्द्ध, तो कंपनी के पास विभिन्न प्रकार के कर्मचारी हैं, जो एक या अधिक आम इंटरफेस साझा करते हैं। – Shog9

+0

@ शोग 9, मुझे लगता है कि मैं अक्सर अपने डिजाइन में दो तरह के संदर्भ बनाते हैं। लेकिन ऐसा लगता है कि आप कह रहे हैं कि यह एक डिजाइन गंध हो सकता है और इसे कम किया जाना चाहिए। मुझे इस पर थोड़ा और सोचना होगा, धन्यवाद। – Ash

3

ध्वनि असेंबली ...

+0

मेरे पास केवल एक तीसरी असेंबली थी जिसमें इंटीफेस शामिल थे। लेकिन क्या यह दोनों विधानसभाओं के अनुप्रयोग (क्लाइंट) को एक साथ घटकों के सभी "प्लगिंग" करने के लिए मजबूर नहीं करता है? यह होगा एक पूर्ण उड़ा निर्भरता इंजेक्शन ढांचे की आवश्यकता नहीं होगी? – Ash

+1

@Ash - इसे अपने सिर में अतिरंजित करने की कोशिश न करें। अगर आपको एक्सएमएल -> स्ट्रिंग को कन्वर्ट करने की आवश्यकता है, तो निर्भरता इंजे की आवश्यकता नहीं है कथन, कि केवल एक सिंगल फ्री फ़ंक्शन की आवश्यकता है (जो स्ट्रिंग और एक्सएमएल पुस्तकालय दोनों का संदर्भ देता है)। – Tom

+0

टॉम के उत्तर के साथ सहमत हो गया, तीसरी असेंबली की आवश्यकता के साथ असहमत है, यह ओवरकिल है जब यह सिर्फ एक विस्तार विधि परिदृश्य हो सकता है यानी IENumerable पर linq एक्सटेंशन विधियों को लगता है ... – eglasius

3

इसे एक विस्तार विधि बनाएं जिसे एक्सएमएल असेंबली में परिभाषित किया गया है (आपकी टिप्पणी "रूपांतरण विधि के आधार पर जो एक्सएमएल स्वीकार करता है और स्ट्रिंग आधारित प्रारूप में परिवर्तित होता है")। यह एक्सएमएल से निपट रहा है। जैसे Linq IENumerable के लिए करता है।

+0

उचित टिप। लेकिन क्या इस मुद्दे पर एक आम तौर पर लागू सॉफ्टवेयर इंजीनियरिंग दृष्टिकोण है। स्ट्रिंग और एक्सएमएल का उपयोग करने का मेरा उदाहरण शायद सबसे अच्छा नहीं है, एक्सएमएल असेंबली और वीआईसी बनाम सेटिंग्स सेटिंग्स असेंबली के बारे में क्या कहता है? – Ash

+0

@Ash - कोर एक्सएमएल मॉड्यूल को कॉन्फ़िगरेशन की आवश्यकता नहीं है। एक एक्सएमएल आधारित विन्यास समझ में आता है। एक उच्च-स्तरीय मॉड्यूल जो एक्सएमएल-आधारित कॉन्फ़िगरेशन का उपयोग करता है यह निर्धारित करने के लिए कि अन्य XML दस्तावेज़ों को कैसे पार्स किया जाए, उन दोनों पुस्तकालयों का उपयोग करेगा। – Tom

3

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

+0

अच्छी टिप्स, धन्यवाद। – Ash