क्या किसी घटना को भेजने वाला हमेशा एक सामान्य वस्तु होना चाहिए?


10

जब C # में प्रोग्रामिंग की घटनाओं, यह एक प्रतिनिधि बनाने के लिए सलाह दी जाती है:

delegate XEventHandler(object sender, XEventArgs e);

मेरा प्रश्न, प्रतिनिधि का पहला तर्क पर है object sender। क्या यह हमेशा एक सामान्य होना है object? प्रकार का एक प्रेषक होने से objectहमेशा इसके समान कोड आता है।

val = ((ConcreteType)sender).Property;

या, और भी अधिक क्रिया,

ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }

दृढ़ता से टाइप किए गए प्रेषकों के खिलाफ एक तर्क यह है कि अन्य ऑब्जेक्ट प्रकार के बारे में चिंता किए बिना घटना को आगे बढ़ा सकते हैं । हालांकि यह जीयूआई वातावरण में समझ में आता है, मुझे यकीन नहीं है कि यह जीयूआई के बाहर लाभान्वित हो सकता है।

क्या होगा यदि प्रेषक का वर्ग हमेशा ज्ञात होता है (कम से कम एक अमूर्त वर्ग के रूप में)? उदाहरण के लिए, यदि मैं ListChangedएक अमूर्त Listवर्ग में एक घटना को लागू कर रहा हूं , और यदि अन्य वर्ग इसे प्राप्त करने जा रहे हैं (उदाहरण LinkedListके लिए ArrayList), तो क्या यह सब मेरे प्रतिनिधि को टाइप के प्रेषक के साथ परिभाषित करने के लिए सही है List?

delegate ListChangedEventHander(List sender, ListChangedEventArgs e);

या, पारंपरिक object senderको और अधिक विशिष्ट प्रकार में बदलने का नकारात्मक पक्ष होगा ?

जवाबों:


10

इस बिंदु पर, यह ज्यादातर एक (बहुत मजबूत) सम्मेलन है। यही है, यह अजीब होगा यदि आप एक पुस्तकालय लिखते हैं जो उस सम्मेलन का पालन नहीं करता है।

घटना डिजाइन दिशानिर्देश कहते हैं:

DO उपयोग objectईवेंट हैंडलर के पहले पैरामीटर के प्रकार के रूप में, और यह कहते हैं sender

हालांकि, आप ध्यान दे सकते हैं कि वर्तमान मार्गदर्शन कहता है कि आपको घटनाओं के लिए अपने स्वयं के कस्टम प्रतिनिधि को परिभाषित नहीं करना चाहिए, लेकिन EventHandler<T>यदि आप कर सकते हैं तो इसका उपयोग करें ।

डिजाइन के लिए, मुझे लगता है कि यह भी घटना संचालकों के पुन: उपयोग को बढ़ावा देता है, यहां तक ​​कि इस संदर्भ में मूल रूप से घटना के मूल डिजाइनर द्वारा नहीं देखा जाता है।


2
Ughhh ... सिर्फ इसलिए कि Microsoft ने अपने दिशानिर्देशों को हर किसी के लिए लागू करने के लिए पर्याप्त सामान्य बनाने का फैसला किया, इसका मतलब यह नहीं है कि हर किसी के लिए अपने दिशानिर्देशों का पालन करना एक अच्छा विचार है। बाधाओं की बहुत संभावना है कि "अन्य सभी" लाखों अन्य डेवलपर्स द्वारा उपयोग किए जाने वाले कोड नहीं लिख रहे हैं। मैंने आपके द्वारा प्रदान की गई लिंक से सिफारिशों के बारे में 2/3 पर cringed।
डंक

आपको सच्चाई बताने के लिए, यह "दिशानिर्देश" कमोबेश विंडोज एपीआई के हंगेरियन संकेतन जैसा लगता है। किसी ने इसे वास्तव में अच्छे कारण के लिए शुरू किया और फिर बाकी सभी ने इसका दुरुपयोग करना शुरू कर दिया। जब कोई दिशानिर्देश होता है, तो उस दिशानिर्देश के पीछे एक अच्छा कारण होता है। और जो मुझे लगता है कि इस दिशानिर्देश का कारण यह है कि System.Windows.Formsनाम स्थान वह जगह है जहां घटनाओं का सबसे अधिक उपयोग किया जाता है, और यह एक या Clickघटना की सदस्यता के लिए समझ में आता Buttonहै CheckBox। इस प्रकार इस की जरूरत है आम हो सकते। ...
संपतश्री

... लेकिन जब यह अन्य, अधिक विशिष्ट, कार्यक्षमता के निहित क्षेत्रों की बात आती है, तो प्रेषक को एक सामान्य वर्ग होने की आवश्यकता नहीं हो सकती है। फिर से एक वर्ग पदानुक्रम का मेरा उदाहरण देखें List
संपतश्री

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

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

0

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

इवेंट तंत्र स्वयं अभी भी "VB6" -स्टाइल घटनाओं के लिए उपयोग किया जा सकता है, लेकिन आपको सभी मौजूदा उपभोक्ताओं को बदलना होगा यदि आपको कभी भी हस्ताक्षर बदलने की ज़रूरत है (या इससे भी बदतर: एक ही घटनाओं के नए संस्करण बनाएं)। अनुशंसित दृष्टिकोण के साथ, जब तक कि मौजूदा से नए आइटम विरासत में मिलते हैं, आप मौजूदा कोड को ठीक किए बिना हस्ताक्षर को अपडेट कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.