2010-07-22 10 views
21

संभव डुप्लिकेट:किसी भी सदस्य के बिना इंटरफ़ेस - खराब अभ्यास?

public interface ISomething 
{ 
} 

एक मामले में जहां मैं इलाज के लिए चाहते हैं नहीं है:
What is the purpose of a marker interface?

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

+0

मैं http://stackoverflow.com/questions/1023068/what-is-the-purpose-of- के डुप्लिकेट के रूप में चिह्नित कर रहा हूं। ए-मार्कर-इंटरफ़ेस क्योंकि यह प्रभावी रूप से इस प्रश्न का उत्तर देता है। – spender

+0

पहले कभी 'मार्कर इंटरफेस' शब्द के बारे में नहीं सुना। तो मुझे खोज करते समय यह नहीं मिला। – Erix

+0

@SP - मैं उस लिंक के उत्तर में स्कॉट के सुझाव को दिल में ले जाऊंगा, इमो, यह कुछ बदसूरत बुराई की जड़ है। – Marc

उत्तर

22

मुझे व्यक्तिगत रूप से लगता है कि खाली इंटरफेस अच्छी बात नहीं है।

इंटरफेस व्यवहारिक अनुबंधों का वर्णन करने के लिए हैं। एक खाली इंटरफेस किसी भी व्यवहार का वर्णन नहीं करता है - आप यहां किसी भी प्रकार के अनुबंध को परिभाषित नहीं कर रहे हैं।

design guidelines for interfaces विशेष रूप से कहते हैं: मार्कर का उपयोग

बचें इंटरफेस (कोई सदस्यों के साथ इंटरफेस)।

कस्टम विशेषताएँ एक प्रकार को चिह्नित करने का एक तरीका प्रदान करती हैं। कस्टम विशेषताओं के बारे में अधिक जानकारी के लिए, कस्टम विशेषताएँ लिखना देखें। कस्टम गुणों को प्राथमिकता दी जाती है जब आप कोड निष्पादित होने तक विशेषता के लिए जांच को रोक सकते हैं। यदि आपके परिदृश्य को संकलन-समय की जांच की आवश्यकता है, तो आप इस दिशानिर्देश का पालन नहीं कर सकते हैं।

+0

+1 - मैं उस सटीक उसी लेख से लिंक करने वाला था। –

+0

संकलन-समय की जांच में संग्रह के अंदर समूहांकन उत्तराधिकारी शामिल हैं। इसलिए मैं इसे लेता हूं कि मैं मार्कर इंटरफ़ेस का उपयोग करने के लिए दिशानिर्देश का उल्लंघन कर सकता हूं। उत्कृष्ट उत्तर और उत्कृष्ट संदर्भ! –

12

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

+0

उत्कृष्ट सुझाव। –

+4

लेकिन विशेषताएँ विस्तार विधियां सक्षम नहीं करती हैं। –

0

मैं ऐसा नहीं करता लेकिन मुझे इसके खिलाफ कोई अच्छा कारण नहीं दिखता है। मैं अक्सर जेनेरिक प्रकारों के लिए बेस क्लास बनाता हूं ताकि मैं सामान्य वस्तुओं का संग्रह कर सकूं। ऐसा करने के लिए एक इंटरफ़ेस एक क्लीनर तरीका हो सकता है, लेकिन मुझे आमतौर पर बेस क्लास में कुछ लगाने के लिए मिलता है ताकि इंटरफ़ेस समाधान उस के लिए काम न करे।

मुझे लगता है कि आप इसे एक सार आधार वर्ग के रूप में सोच सकते हैं?

2

मैं कहूंगा कि एक विशेषता बेहतर है लेकिन खाली इंटरफेस के .NET ढांचे में उदाहरण हैं (जैसे INamingContainer - http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx)। Ive हमेशा सोच रहा था कि ऐसा क्यों किया गया था - किसी को पता है?

1

मैं यहां सभी के साथ सहमत हूं। मुझे लगता है कि अगर मुझे एक इंटरफ़ेस वाले क्लास को बनाए रखने और देखने के लिए कोड दिया गया था जिसमें कोई गुण या विधियां नहीं थीं तो मैं बहुत उलझन में रहूंगा।

एक asp.net MVC अनुप्रयोग है कि मैं पर काम किया हाल ही में मैं एक कोर आपरेशन (ट्रैकिंग कोड) था मैं लगभग पर प्रत्येक अनुरोध किया चाहते थे (लेकिन पर नहीं कह और ajax अनुरोध या एक व्यवस्थापक पृष्ठ)। मैंने ऑपरेशन को बेस कंट्रोलर में जोड़ा और इसे ExecuteCore विधि में निष्पादित किया। कुछ स्थितियों के लिए मैं इसे चलाने के लिए नहीं चाहता था, मैंने व्युत्पन्न नियंत्रक में एक ध्वज सेट नहीं किया है, इसे चलाने के लिए।

यह एक विशेषता के रूप में स्वच्छ और सुरुचिपूर्ण नहीं है लेकिन इसे लागू करना बहुत आसान है।

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

1

ऐसा लगता है कि मार्कर इंटरफ़ेस को कार्यान्वित करना और कोई पैरामीटर के साथ एक विशेषता को जोड़ना सिंटैक्स में भिन्न नहीं है, लेकिन पूर्व रन टाइम प्रकार की जानकारी के साथ उपयोग करने के लिए पूर्व सीधे आगे है।

मैं मार्कर इंटरफेस का व्यक्तिगत रूप से उपयोग करने के लिए कठिन और तेज़ नियम बनाने के लिए तैयार नहीं हूं, लेकिन अगर वे केवल "अंकन" से अधिक के लिए उपयोग किए जाते हैं तो संभावित गिरावट देख सकते हैं - इस मामले में गुण बेहतर हो सकते हैं फिट।

उसने कहा, अगर मैं पहली बार तुलना करता हूं कि मैं पहली बार तुलना करता हूं तो मुझे एक खाली इंटरफ़ेस (मुझे याद है कि यह निश्चित रूप से जावा लगभग 2000 था) पहली बार जब मैं एक विशेषता (सी # वेब सेवाओं) में आया - मैं कटौती करने में सक्षम था एक का उद्देश्य लेकिन दूसरे ने मुझे सीखने के तरीके में मजबूर किया ...

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