सबसे पहले, अच्छा सवाल। मैं नेत्रहीन रूप से "सर्वोत्तम प्रथाओं" को स्वीकार करने के बजाय उपयोगिता पर आपका ध्यान केंद्रित करता हूं। उसके लिए +1।
मैंने उस गाइड को पहले पढ़ा है। आपको इसके बारे में कुछ याद रखना होगा - यह सिर्फ एक मार्गदर्शक है, मुख्य रूप से सी # नवागंतुकों के लिए जो प्रोग्राम करना जानते हैं लेकिन चीजों को करने के सी # तरीके से परिचित नहीं हैं। यह नियमों के एक पृष्ठ के रूप में इतना नहीं है क्योंकि यह एक पृष्ठ है जो बताता है कि चीजें पहले से ही आमतौर पर कैसे होती हैं। और जब से वे पहले से ही हर जगह इस तरह से कर रहे हैं, यह लगातार बने रहने के लिए एक अच्छा विचार हो सकता है।
मैं आपके सवालों का जवाब देने के लिए इस बिंदु पर पहुंचूंगा।
सबसे पहले, मुझे लगता है कि आप पहले से ही जानते हैं कि इंटरफ़ेस क्या है। एक प्रतिनिधि के रूप में, यह कहने के लिए पर्याप्त है कि यह एक संरचना के लिए एक टाइप्टर पॉइंटर के साथ एक संरचना है, साथ ही वैकल्पिक पॉइंटर के साथ ऑब्जेक्ट के लिए this
तर्क का प्रतिनिधित्व करता है। स्थैतिक तरीकों के मामले में, बाद वाला सूचक शून्य है।
मल्टीकास्ट डेलीगेट्स भी हैं, जो केवल प्रतिनिधियों की तरह हैं, लेकिन इनमें से कई संरचनाएं उन्हें सौंपी जा सकती हैं (मतलब मल्टीकास्ट डेलीगेट पर इनवॉइस करने के लिए एक एकल कॉल अपनी निर्दिष्ट आमंत्रण सूची में सभी तरीकों को शामिल करती है)।
एक इवेंटिंग डिज़ाइन पैटर्न से उनका क्या मतलब है?
उनका मतलब सी # में घटनाओं का उपयोग करना है (जिसमें विशेष रूप से इस अत्यंत उपयोगी पैटर्न को लागू करने के लिए विशेष कीवर्ड हैं)। मल्टिकास्ट प्रतिनिधियों द्वारा सी # में घटनाओं को ईंधन दिया जाता है।
जब आप किसी घटना को परिभाषित करते हैं, जैसे कि इस उदाहरण में:
class MyClass {
// Note: EventHandler is just a multicast delegate,
// that returns void and accepts (object sender, EventArgs e)!
public event EventHandler MyEvent;
public void DoSomethingThatTriggersMyEvent() {
// ... some code
var handler = MyEvent;
if (handler != null)
handler(this, EventArgs.Empty);
// ... some other code
}
}
संकलक वास्तव में इसे निम्नलिखित कोड में बदल देता है:
class MyClass {
private EventHandler MyEvent = null;
public void add_MyEvent(EventHandler value) {
MyEvent += value;
}
public void remove_MyEvent(EventHandler value) {
MyEvent -= value;
}
public void DoSomethingThatTriggersMyEvent() {
// ... some code
var handler = MyEvent;
if (handler != null)
handler(this, EventArgs.Empty);
// ... some other code
}
}
आप तब किसी ईवेंट को सब्सक्राइब करें
MyClass instance = new MyClass();
instance.MyEvent += SomeMethodInMyClass;
जिसका संकलन किया जाता है
MyClass instance = new MyClass();
instance.add_MyEvent(new EventHandler(SomeMethodInMyClass));
तो यह C # (या .NET सामान्य रूप से) में इवेंट कर रहा है।
यदि प्रतिनिधि का उपयोग किया जाता है तो रचना कैसे आसान हो जाती है?
यह आसानी से प्रदर्शित किया जा सकता है:
मान लीजिए कि आपके पास एक वर्ग है जो उस पर पारित किए जाने वाले कार्यों के एक सेट पर निर्भर करता है। आप एक इंटरफ़ेस में उन क्रियाओं को संक्षिप्त कर सकते हैं:
interface RequiredMethods {
void DoX();
int DoY();
};
और जो कोई भी आपकी कक्षा में कार्रवाई करना चाहता था, उसे पहले उस इंटरफ़ेस को लागू करना होगा। या आप निम्न वर्ग के आधार पर उनके जीवन को आसान बना सकते हैं :
sealed class RequiredMethods {
public Action DoX;
public Func<int> DoY();
}
इस तरह से कॉल करने वालों को केवल आवश्यक प्रक्रिया का एक उदाहरण बनाना होता है और प्रतिनिधियों को रनटाइम पर तरीकों को बाँधना होता है। यह है आम तौर पर आसान।
सही परिस्थितियों में चीजों को करने का यह तरीका बेहद फायदेमंद है। इसके बारे में सोचें - जब आप वास्तव में इस बारे में ध्यान रखते हैं कि एक इंटरफ़ेस पर निर्भर क्यों है, तो एक कार्यान्वयन आपके पास है?
संबंधित विधियों का एक समूह होने पर इंटरफेस का उपयोग करने के लाभ
इंटरफेस का उपयोग करना फायदेमंद है क्योंकि इंटरफेस को सामान्य रूप से स्पष्ट संकलन-समय कार्यान्वयन की आवश्यकता होती है। इसका मतलब है कि आप एक नया वर्ग बनाते हैं।
और यदि आपके पास एकल पैकेज में संबंधित विधियों का एक समूह है, तो उस पैकेज के कोड के अन्य भागों द्वारा पुन: प्रयोज्य होना फायदेमंद है। इसलिए यदि वे केवल प्रतिनिधियों के एक समूह के निर्माण के बजाय एक वर्ग को तुरंत रोक सकते हैं, तो यह आसान है।
यदि किसी वर्ग को केवल एक कार्यान्वयन की आवश्यकता है, तो इंटरफेस का उपयोग करने के लाभ
जैसा कि पहले उल्लेख किया गया है, संकलन समय में लागू किए जाते हैं - जिसका अर्थ है कि वे एक प्रतिनिधि को आमंत्रित करने की तुलना में अधिक कुशल हैं (जो कि प्रति स्तर अप्रत्यक्ष स्तर है)।
"एक कार्यान्वयन" का अर्थ एक ऐसा कार्यान्वयन हो सकता है जो एक एकल परिभाषित जगह पर मौजूद हो।
अन्यथा एक कार्यान्वयन कार्यक्रम में कहीं से भी आ सकता है जो सिर्फ विधि हस्ताक्षर के अनुरूप होता है । यह अधिक लचीलेपन की अनुमति देता है, क्योंकि विधियों को केवल अपेक्षित हस्ताक्षर के अनुरूप होने की आवश्यकता होती है, बल्कि उस वर्ग से संबंधित होती है जो स्पष्ट रूप से एक विशिष्ट इंटरफ़ेस लागू करता है। लेकिन यह लचीलापन एक लागत पर आ सकता है, और वास्तव में लिस्कोव सबस्टीट्यूशन सिद्धांत को तोड़ता है , क्योंकि ज्यादातर बार आप गवाह चाहते हैं, क्योंकि यह दुर्घटनाओं का मौका कम से कम करता है। जैसे स्टैटिक टंकण।
यह शब्द यहां बहुस्तरीय प्रतिनिधियों को भी संदर्भित कर सकता है। इंटरफेस द्वारा घोषित तरीके केवल एक कार्यान्वयन वर्ग में एक बार लागू किए जा सकते हैं। लेकिन प्रतिनिधि कई तरीकों को जमा कर सकते हैं, जिन्हें क्रमिक रूप से कहा जाएगा।
तो सब सब में, ऐसा लगता है कि गाइड पर्याप्त रूप से जानकारीपूर्ण नहीं है, और केवल यह है कि यह क्या है - एक गाइड, एक नियम पुस्तिका नहीं। कुछ सलाह वास्तव में थोड़ा विरोधाभासी लग सकता है। यह आपको तय करना है कि कब क्या लागू करना सही है। गाइड हमें केवल एक सामान्य रास्ता देता प्रतीत होता है।
मुझे आशा है कि आपके प्रश्नों का उत्तर आपकी संतुष्टि के लिए दिया गया है। और फिर, सवाल के लिए यश।