2013-02-10 6 views
6

के हिस्सों का उपयोग करने के लिए डेवलपर्स को निर्देश देने के लिए [अप्रचलित] विशेषता का उपयोग करना एक अच्छा अभ्यास है हाल ही में मैं कुछ धारावाहिक वस्तु लिख रहा हूं जो विशिष्ट तर्क से संबंधित है और इसमें विशिष्ट जीवन-चक्र है। इसे ठीक से काम करने के लिए, इसे उचित कन्स्ट्रक्टर के साथ तुरंत चालू किया जाना चाहिए, जो अनिवार्य तर्क लेता है। क्रमिक उद्देश्यों के लिए, हालांकि, मुझे एक सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर भी जोड़ना होगा।डेवलपर्स को एपीआई

ऑब्जेक्ट सार्वजनिक रूप से हमारे एपीआई द्वारा उपलब्ध होगा और तृतीय पक्ष डेवलपर्स को तत्काल और इसका उपयोग करने में सक्षम होना चाहिए। यद्यपि उस वस्तु के साथ सही तरीके से छेड़छाड़ करने के लिए उचित दस्तावेज होगा, लेकिन यह गारंटी नहीं है कि किसी को गलत कन्स्ट्रक्टर का उपयोग करने का लुत्फ उठाया जाएगा - और फिर परेशानी होगी।

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

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

तो सवाल यह है - क्या यह विशेषता के इस उपयोग के लिए एक स्वीकार्य अभ्यास है? क्या एक ही प्रभाव प्राप्त करने के लिए कोई अन्य कानूनी और सार्वभौमिक तरीके हैं (सार्वभौमिक से मेरा मतलब है कि तृतीय पक्ष कोड निरीक्षण एड-ऑन और आदि पर भरोसा नहीं है - मैं इस बात पर नियंत्रण नहीं करता कि कोड का उपयोग कौन करता है और उनका सेटअप क्या है)?


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

+4

यह बिल्कुल वही बात नहीं है, लेकिन [EditorBrowsable (EditorBrowsableState.Never)] का उपयोग करके डेवलपर को इंटेलिजेंस से छुपाएगा ताकि डेवलपर को इसे सुझाव के रूप में प्राप्त किया जा सके और दस्तावेज़ों की जांच किए बिना गलती से इसका उपयोग किया जा सके। उपयोगी जानकारी के लिए धन्यवाद – fsimonazzi

+0

@fsimonazzi। उसी तरह कोई भी अप्रचलित सदस्य को उपयोगकर्ता कोड द्वारा एक्सेस करने से रोक नहीं सकता है, इसलिए आपका सुझाव काफी मान्य है, और अधिक जगह है। –

उत्तर

3

एचएम, मुझे नहीं लगता कि यह एक अच्छा समाधान है। हालांकि, क्या आपको वास्तव में एक डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता है?

ध्यान दें कि सीरियलाइजेशन एपीआई में कन्स्ट्रक्टर का उपयोग किए बिना अनियमित उदाहरण बनाने के तरीके हैं (एमएसडीएन: FormatterServices.GetUninitializedObject देखें)।

इसके अलावा, सामान्य कस्टम सीरियलाइजेशन कन्स्ट्रक्टर एक डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है बल्कि एक SerializationInfo और StreamingContext ले रहा है। यदि आपके पास कुछ कस्टम क्रमबद्धता है, तो आप डिफ़ॉल्ट कन्स्ट्रक्टर आंतरिक बनाकर अपनी समस्या को हल करने में सक्षम हो सकते हैं और धारावाहिक प्रदर्शन करने वाली असेंबली के लिए InternalsVisibleToAttribute लागू कर सकते हैं।

+1

deserialization मुद्दे पर स्पष्टीकरण के लिए, मैं बाइनरी (डिफ़ॉल्ट) नहीं संबोधित कर रहा था, लेकिन एक्सएमएल serialization जो .NET ढांचे का हिस्सा है। इसे पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता है। कन्स्ट्रक्टर को 'सार्वजनिक' होने की आवश्यकता नहीं है, लेकिन यदि वर्ग विरासत में है और उसे क्रमबद्धता क्षमताओं को संरक्षित करना है, तो कन्स्ट्रक्टर कम से कम 'संरक्षित' होना चाहिए (बेशक, यदि कुछ अन्य रचनाकार आपके लिए काम करते हैं, लेकिन यह सवाल मुद्दा का मामला नहीं है)। –

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