2009-12-15 11 views
11

का उपयोग करने वाले पुस्तकालय बनाने के लिए सर्वोत्तम प्रथाएं क्या लाइब्रेरी लिखना बुरा व्यवहार है जो किसी अन्य लाइब्रेरी पर निर्भर इंटरफ़ेस को परिभाषित करता है?.NET नेमस्पेस

मुझे पता है कि तंग युग्मन खराब है, लेकिन क्या यह अभी भी .NET कक्षाओं का उपयोग करते समय लागू होता है?

उदाहरण के लिए, .NET में, यदि मेरे पास एक लाइब्रेरी है जो कलर ऑब्जेक्ट लौटाती है, तो यह सिस्टम पर निर्भरता को मजबूर करेगी। मेरी लाइब्रेरी का उपयोग करने वाली किसी भी चीज़ पर ड्रॉ करना। क्या मैं अपनी लाइब्रेरी के अंदर अपनी खुद की कलर-टाइप क्लास बनाने से बेहतर होगा?

+0

अच्छा सवाल। । –

उत्तर

10

मैं Volatile और स्थिर निर्भरता के बीच भेद।

सामान्य रूप से, रंग एक स्थिर निर्भरता की तरह दिखता है क्योंकि यह पहले से ही बीसीएल में है, यह प्रकृति में निर्धारक है और इसमें कोई संसाधन-गहन आउट-प्रोसेस संचार शामिल नहीं है, और न ही यह किसी विशेष सेट-अप पर भरोसा करता है अपने रन-टाइम पर्यावरण का।

एकमात्र विचार यह है कि जब रंग की बात आती है, तो बीसीएल में एक से अधिक ऐसी कक्षाएं होती हैं, इसलिए सुनिश्चित करें कि आप वास्तव में अपने एपीआई के साथ केवल विंडोज फॉर्म एप्लिकेशन को लक्षित करना चाहते हैं, क्योंकि डब्ल्यूपीएफ की अपनी परिभाषा है रंग का

यदि आपको किसी निश्चित रंग में UI के हिस्सों को पेंट करने के लिए रंग की आवश्यकता है, तो अंतर्निहित रंग वर्ग शायद ठीक है, लेकिन यदि रंग आपके डोमेन मॉडल में मुख्य अवधारणा है, और आपको अलग-अलग लक्ष्य रखना होगा यूआई (डब्ल्यूपीएफ, विंडोज फॉर्म, वेब) आप शायद अपने स्वयं के अमूर्तता को परिभाषित करके बेहतर होंगे।

इस तरह के एक और उन्नत मामले में, आप बाद में अमूर्तता और ठोस रंग वर्गों के बीच के अंतर को पुल करने के लिए अपने अमूर्तता के चारों ओर एडाप्टर और मैपर बना सकते हैं।

+1

अस्थिर निर्भरताओं के लिए उत्कृष्ट लिंक और सामान्य रूप से एक महान जवाब। +1! – Randolpho

+0

इस जानकारी के लिए धन्यवाद, उन मुद्दों पर सलाह से भरा जिन पर मैंने विचार नहीं किया था। मुझे यकीन है कि मैं कुछ बिंदुओं पर WinForms से तोड़ना चाहता हूं। – DanDan

+0

मुझे यह सलाह पसंद है, यह मुझे मेरी कक्षाओं से निर्भरता रखने के लिए याद दिलाता है, और गुस (द गुस सिद्धांत) से पोस्ट के साथ मिलकर सामान्य सलाह "खुद को रोल करें" लगता है। कलर क्लास तुच्छ होने के कारण कार्रवाई का यह कोर्स सबसे प्रभावी है। तीसरी पार्टी निर्भरताओं के साथ अधिक जटिल परिस्थितियों में, जैसा कि रैंडोल्फो का उल्लेख है, इस सिद्धांत को झुकाव हो सकता है, या डिज़ाइन किसी भी तरह से पुनर्विचार करना पड़ सकता है। आपकी पोस्ट के लिए धन्यवाद! – DanDan

5

यदि यह मानक .NET लाइब्रेरी है, तो मैं इसके बारे में चिंता नहीं करता। एक वर्ग से दूसरे में मानचित्र करने का कोई कारण नहीं है ... क्या होगा यदि सिस्टम। रंग अगले .NET रिलीज में बदल गया है? आपको अपना मानचित्रण कोड भी बदलना होगा, और संभवतः संस्करण का पता लगाना होगा और तदनुसार मानचित्र बनाना होगा। यह एक असली दर्द है।

+2

बीसीएल कोड संस्करणों के बीच नहीं बदलते हैं, लेकिन दूसरी तरफ, नए रंग के प्रकार दिखाई दे सकते हैं - और उनके पास है: यदि आप सिस्टम पर निर्भरता लेते हैं। ड्रॉइंग। रंग आप डब्ल्यूपीएफ में अपने एपीआई का उपयोग करने से खुद को बंद कर देंगे। –

+0

सलाह के लिए धन्यवाद। – DanDan

2

मेरे सभी पुस्तकालयों के साथ, मैं उन वस्तुओं को वापस करता हूं जो पुस्तकालय में केवल चीज़ों पर निर्भर करते हैं।

मैं खुद से पूछूंगा कि मैं एक पुस्तकालय क्यों लिख रहा था जो किसी अन्य नामस्थान पर निर्भर करेगा जो अंतर्निहित नहीं था। ऐसा लगता है कि पूरे "Encapsulation" अवधारणा के खिलाफ जाना है।

तो ओओपी के अपने तर्क और ज्ञान से बाहर निकलने के बाद, मैं कहूंगा कि आप अपने स्वयं के गैर-निर्भर वस्तु को वापस करने के साथ सही रास्ते पर हैं।

+0

मुझे लगता है कि mscorlib में नेमस्पेस के साथ काम करना स्वीकार्य है; इसके बाहर, सिद्धांत ध्वनि है। –

+0

मुझे आपका सिद्धांत भी पसंद है, मैं इसका पालन करने जा रहा हूं। – DanDan

1

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

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

यहां कोई सही जवाब नहीं है, आपको बस अपनी परियोजना के लिए सबसे अधिक समझदारी के साथ जाना होगा। जितना संभव हो सके decouple करने की कोशिश करो, हाँ, लेकिन कभी-कभी आप सिर्फ गड़बड़ करना होगा और काम पूरा करना होगा।

+0

हेहे, मुझे यह शब्द पसंद है "आप बस गड़बड़ कर लेंगे और काम पूरा करें"। मुझे लगता है कि इस मामले में, कलर क्लास की सापेक्ष तुच्छता के कारण मैं खुद को रोल करने से बेहतर होगा। मैं देखता हूं कि अधिक जटिल मामले सिरदर्द लाने जा रहे हैं। – DanDan

1

यह कक्षा के आपके उपयोग पर निर्भर करता है।

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

दूसरी ओर आप बस मनमाने ढंग से आरजीबी मूल्यों (शायद वैज्ञानिक गणना के लिए) और के साथ काम कर रहे हैं, तो कभी नहीं System.Color का एक उदाहरण में बदलने की जरूरत है, तो यह समझ बनाने के कर सकते हैं अपने खुद के वर्ग बनाने के लिए

सभी संभावनाओं में आप सिस्टम का उपयोग कर बेहतर हैं। रंग वर्ग - हाँ encapsulation और यह सब एक अच्छा विचार है, हालांकि आप समय की भारी मात्रा में बचत की कीमत पर नहीं!

+0

मुझे 99% यकीन है कि मुझे अंतर्निर्मित स्थिरांक की आवश्यकता नहीं होगी, इसलिए इस मामले में मुझे लगता है कि मैं अपना खुद का रोलिंग बेहतर कर रहा हूं। आपकी सलाह के लिए धन्यवाद। चेतावनी के लिए – DanDan

1

आपको .NET कोर लाइब्रेरी में किसी भी चीज़ का उपयोग करने की चिंता नहीं करनी चाहिए। आप इसके बिना एक डीएलएल लिखने में बहुत दूर नहीं होंगे। संभवतः इसके आस-पास सावधान रहने का एकमात्र स्थान सिस्टम है। वेब नेमस्पेस जैसा कि मेरा मानना ​​है कि .NET 4 में क्लाइंट प्रोफाइल इंस्टॉलर है जिसका मूल रूप से अर्थ है कि यदि आप इस इंस्टॉलर का उपयोग करते हैं तो यह केवल क्लाइंट पर उपयोग की जाने वाली चीज़ों को स्थापित करेगा। मुझे व्यक्तिगत रूप से लगता है कि यह माइक्रोसॉफ्ट के हिस्से पर एक बुरा विचार है क्योंकि यह डाउनलोड समय की थोड़ी सी मात्रा को बचाने के लिए अनिवार्य जटिलता को जोड़ता है।

+0

धन्यवाद। – DanDan

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