दिलचस्प पोस्ट
छोरों का क्रम प्रदर्शन पर असर क्यों करता है जब 2 डी सरणी पर चलती है? jQuery ने तुल्यकालिक XMLHTTPRequest को पदावनत किया है डीबी से कनेक्ट किए बिना mysql_real_escape_string के वैकल्पिक जावा कीस्टोर में निजी-कुंजी / सार्वजनिक-प्रमाणपत्र जोड़ी आयात करना स्प्रिंग एमवीसी 3.1 में रीडायरेक्शन के बाद फ्लैश एट्रिब्यूट्स को कैसे पढ़ें? NumPy के einsum को समझना एक बार फिर से यात्रा के दौरान आइटम को निकालें CMake + GoogleTest "चेतावनी सामग्री शरीर की लंबाई की लंबाई निर्धारित नहीं कर सका" क्या मतलब है और इसे कैसे से छुटकारा मिल सकता है? मेमोरी में विधि प्रतिनिधित्व क्या है? लॉगरिदमिक स्केल के साथ सेट टिक्स एक WCF सेवा के लिए डेटा इंजेक्शन एकाधिक रिटर्न: कौन सा अंतिम रिटर्न मान सेट करता है? सरणी से सबसे निकटतम संख्या प्राप्त करें getWidth () और getHeight () दृश्य का रिटर्न 0

मार्कर इंटरफ़ेस का उद्देश्य क्या है?

मार्कर इंटरफ़ेस का उद्देश्य क्या है?

वेब के समाधान से एकत्रित समाधान "मार्कर इंटरफ़ेस का उद्देश्य क्या है?"

यह "मिच गेहूं" की प्रतिक्रिया के आधार पर एक स्पर्शरेखा का थोड़ा सा है

आम तौर पर, कभी भी मैं लोगों को ढांचा डिजाइन के दिशानिर्देशों का हवाला देते हुए देखता हूं, मैं हमेशा यह उल्लेख करना चाहता हूं:

आपको आम तौर पर ढांचे के डिजाइन दिशानिर्देशों को आमतौर पर अनदेखा करना चाहिए।

यह रूपरेखा डिजाइन दिशानिर्देशों के साथ किसी भी मुद्दे की वजह से नहीं है। मुझे लगता है कि .NET ढांचा एक उत्कृष्ट कक्षा पुस्तकालय है। ढांचे के डिज़ाइन दिशानिर्देशों से बहुत सी फैंसीदारी बहती है।

हालांकि, डिज़ाइन दिशानिर्देश ज्यादातर प्रोग्रामर द्वारा लिखे गए अधिकांश कोड पर लागू नहीं होते हैं। उनका उद्देश्य एक बड़े ढांचे के निर्माण को सक्षम करना है जो कि लाखों डेवलपर्स द्वारा उपयोग किया जाता है, लाइब्रेरी को और अधिक कुशल बनाने के लिए नहीं।

इसमें बहुत सारे सुझाव आपको काम करने के लिए मार्गदर्शन कर सकते हैं कि:

  1. कुछ को लागू करने का सबसे आसान तरीका नहीं हो सकता है
  2. मई अतिरिक्त कोड दोहराव में परिणाम मई
  3. अतिरिक्त रनटाइम ओवरहेड हो सकता है

असली ढांचा बड़ा है, वास्तव में बड़ा है। यह इतना बड़ा है कि ऐसा लगता है कि किसी को भी इसके बारे में हर पहलू के बारे में विस्तृत ज्ञान है यह बिल्कुल अनुचित होगा। वास्तव में, यह मानने में अधिक सुरक्षित है कि अधिकांश प्रोग्रामर अक्सर उन ढांचे के कुछ हिस्सों का सामना करते हैं जिनका उपयोग उन्होंने कभी नहीं किया है

उस स्थिति में, एपीआई डिजाइनर के प्राथमिक लक्ष्य निम्न हैं:

  1. बाकी ढांचे के अनुरूप बातें रखें
  2. एपीआई सतह क्षेत्र में अनावश्यक जटिलता को हटा दें

ढांचे के डिजाइन दिशानिर्देश डेवलपर्स को ऐसे कोड बनाने के लिए निर्देश करते हैं जो उन लक्ष्यों को पूरा करता है

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

प्राथमिक कारण यह है कि उन दिशानिर्देश मार्कर इंटरफेस के बजाय एट्रिब्यूट का उपयोग करते हैं क्योंकि मार्कर इंटरफेस को हटाने से क्लास लाइब्रेरी का विरासत ढांचा अधिक सुलभ बना देता है विरासत पदानुक्रम के 30 प्रकारों और 6 परतों के साथ एक क्लास आरेख बहुत मुश्किल है, एक की तुलना में 15 प्रकार और पदानुक्रम के 2 परतों के साथ।

यदि वास्तव में आपके एपीआई का उपयोग कर लाखों डेवलपर्स हैं, या आपका कोड बेस वास्तव में बड़ा है (100 किमी से अधिक कहना) तो फिर उन दिशानिर्देशों का पालन करने से बहुत मदद मिल सकती है

अगर 5 लाख डेवलपर्स इसे सीखने में 60 मिनट खर्च करने के बजाय 15 मिनट में एपीआई सीखते हैं, तो परिणाम 428 आदमी वर्षों की शुद्ध बचत है। यह बहुत समय है

हालांकि अधिकांश परियोजनाएं, लाखों डेवलपर्स, या 100K + LOC को शामिल नहीं करती हैं एक विशिष्ट परियोजना में, 4 डेवलपर्स और लगभग 50K स्थान के साथ, मान्यताओं का सेट बहुत भिन्न होता है टीम के डेवलपर्स को बेहतर तरीके से समझना होगा कि कोड कैसे काम करता है इसका मतलब है कि यह उच्च गुणवत्ता वाले कोड को शीघ्रता से विकसित करने के लिए बहुत अधिक समझदारी बनाता है, और बग की मात्रा को कम करने और परिवर्तन करने के लिए आवश्यक प्रयास को कम करने के लिए

1 सप्ताह का विकास कोड खर्च करना जो कि नेट नेटवर्क्चर के साथ संगत है, 8 घंटे लिखने वाला कोड बदलना आसान है और कम बग में इसका परिणाम हो सकता है:

  1. स्वर्गीय परियोजनाएं
  2. कम बोनस
  3. बग की संख्या में वृद्धि हुई
  4. दफ्तर में बिताए अधिक समय, और समुद्र तट पीने के मार्जरीटास पर कम समय।

4,99 9, 99 9 के बिना अन्य डेवलपर्स लागतों को अवशोषित करने के लिए आमतौर पर इसके लायक नहीं हैं।

उदाहरण के लिए, मार्कर इंटरफेस के लिए परीक्षण एक एकल "है" अभिव्यक्ति के लिए आता है, और कम कोड में परिणाम जो विशेषताओं की तलाश में है

तो मेरी सलाह है:

  1. ढांचागत दिशानिर्देशों का पालन करें यदि आप व्यापक पुस्तकालयों (या यूआई विजेट) विकसित कर रहे हैं जो व्यापक प्रसार की खपत के लिए है।
  2. उनमें से कुछ को अपनाने पर विचार करें यदि आपकी परियोजना में 100 किमी से अधिक की सीमा है
  3. अन्यथा उन्हें पूरी तरह से अनदेखा करें।

मार्कर इंटरफेस का उपयोग एक क्लास की क्षमता को रन-टाइम पर एक विशिष्ट इंटरफ़ेस को लागू करने के रूप में चिह्नित करने के लिए किया जाता है।

अंतरफलक डिजाइन और .नेट प्रकार डिजाइन दिशानिर्देश – इंटरफ़ेस डिजाइन सी # में विशेषताओं का उपयोग करने के पक्ष में मार्कर इंटरफेस के उपयोग को हतोत्साहित करते हैं, लेकिन जैसा कि @ जै बज़ुज़ी बताते हैं, गुणों की तुलना में मार्कर इंटरफेस की जांच करना आसान है: o is I

इसलिए इसके बजाय:

 public interface IFooAssignable {} public class FooAssignableAttribute : IFooAssignable { ... } 

.NET दिशानिर्देशों की अनुशंसा है कि आप ऐसा करते हैं:

 public class FooAssignableAttribute : Attribute { ... } [FooAssignable] public class Foo { ... } 

चूंकि हर दूसरे उत्तर में "उनको बचा जाना चाहिए" कहा गया है, इसलिए इसका स्पष्टीकरण करना उपयोगी होगा कि क्यों

सबसे पहले, मार्कर इंटरफेस का उपयोग क्यों किया जाता है: वे उस कोड को अनुमति देने के लिए मौजूद हैं जो ऑब्जेक्ट का उपयोग कर रहे हैं, यह जांचने के लिए कि वे इंटरफ़ेस का उपयोग करते हैं और ऑब्जेक्ट को अलग तरीके से व्यवहार करते हैं अगर यह करता है।

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

व्यावहारिक स्तर पर यह पोर्टेबिलिटी और पुन: प्रयोज्यता को कम करता है। अगर क्लास का किसी अन्य अनुप्रयोग में फिर से उपयोग किया जाता है, तो इंटरफ़ेस को भी प्रतिलिपि बनाने की आवश्यकता होती है, और नए परिवेश में इसका कोई मतलब नहीं हो सकता है, जिससे यह पूरी तरह बेमानी हो।

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

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

एक मार्कर इंटरफ़ेस सिर्फ एक इंटरफ़ेस है जो खाली है। एक क्लास इस इंटरफ़ेस को लागू करेगा क्योंकि किसी कारण के लिए मेटाडेटा इस्तेमाल किया जा सकता है। सी # में आप अन्य भाषाओं में एक मार्कर इंटरफ़ेस का उपयोग करने वाले उसी कारणों के लिए एक वर्ग को चिह्नित करने के लिए अधिक सामान्यतः उपयोग करेंगे।

मार्कर इंटरफेस कभी-कभी एक आवश्यक बुराई हो सकती है जब कोई भाषा भेदभावित यूनियन प्रकारों का समर्थन नहीं करती।

मान लीजिए आप एक ऐसी पद्धति को परिभाषित करना चाहते हैं, जो किसी ऐसे तर्क की अपेक्षा करता है जिसका प्रकार ए, बी या सी में से एक होना चाहिए, जैसे कई फंक्शनल-प्रथम भाषाओं (जैसे एफ # ), इस तरह के एक प्रकार को स्पष्ट रूप से परिभाषित किया जा सकता है:

 type Arg = | AArg of A | BArg of B | CArg of C 

हालांकि, ऊ-पहली भाषाओं में जैसे सी #, यह संभव नहीं है। इसी तरह से कुछ हासिल करने का एकमात्र तरीका इंटरफ़ेस आईएआरजी और "चिह्न" ए, बी और सी को परिभाषित करना है।

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

भेदभावित यूनियन प्रकार अत्यंत उपयोगी होते हैं और कम से कम 30 वर्षों तक कार्यात्मक भाषाओं में मौजूद होते हैं। हैरत की बात है, आज तक, सभी मुख्यधारा ओओ भाषाओं ने इस सुविधा को नजरअंदाज कर दिया है – हालांकि वास्तव में यह कार्यात्मक प्रोग्रामिंग के साथ कुछ नहीं करना है, लेकिन यह प्रकार सिस्टम के अंतर्गत आता है।

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

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

इन दोनों विस्तार विधियों में से अधिकांश मुद्दों को सुलझाया जाएगा स्कॉट गुणों पर एहटी मार्कर इंटरफेस पर हस्ताक्षर करता है:

 public static bool HasAttribute<T>(this ICustomAttributeProvider self) where T : Attribute { return self.GetCustomAttributes(true).Any(o => o is T); } public static bool HasAttribute<T>(this object self) where T : Attribute { return self != null && self.GetType().HasAttribute<T>() } 

अब आपके पास है:

 if (o.HasAttribute<FooAssignableAttribute>()) { //... } 

बनाम:

 if (o is IFooAssignable) { //... } 

मैं यह देखने में विफल हूं कि एपीआई का निर्माण दूसरे की तुलना में 5 गुना ज्यादा होगा, क्योंकि स्कॉट का दावा है।

मार्कर खाली इंटरफेस हैं। एक मार्कर या तो है या वह नहीं है।

वर्ग फू: आईसीओनफाँदरियल

यहां हम फू को गोपनीय मानते हैं I कोई वास्तविक अतिरिक्त गुण या विशेषताओं की आवश्यकता नहीं है