.NET प्रतिनिधि प्रकार के लिए उचित नामकरण सम्मेलन?


83

सम्मेलन वर्गों द्वारा अक्सर संज्ञाओं की तरह क्रियाओं और क्रियाओं जैसे विशेषणों का नाम दिया जाता है।

एक प्रतिनिधि के लिए सामान्य नामकरण सम्मेलन क्या है? जब प्रतिनिधियों को प्रकार और अन्य चीजों में सूचीबद्ध किया जाता है, तो इसके नाम को अलग करने का एक अच्छा तरीका क्या है?

मेरी तत्काल धारणा एक प्रतिनिधि को अधिक विशेषण का नाम देना है क्योंकि एक एकल विधि इंटरफ़ेस को अक्सर एक प्रतिनिधि के साथ बदल दिया जा सकता है।

कुछ विचार:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

जवाबों:


112

व्यक्तिगत रूप से मैं कुछ अलग पैटर्न का उपयोग करता हूं:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - का उपयोग तब किया जाता है जब मुझे एक अलग / नए धागे पर एक फ़ंक्शन को कॉल करने के लिए एक प्रतिनिधि बनाने की आवश्यकता होती है

[Task]Callback - ContainerLoadedCallback - इस्तेमाल किया जब नियंत्रण एक एक कार्रवाई है जो नियंत्रण बी है काम और नियंत्रण एक के सबसे नियंत्रण बी करने के लिए एक निर्भरता बीत चुका है शुरू होता है (यानी ControlA को भरने के लिए ControlB के लिए एक यूआई कंटेनर पारित कर दिया हो सकता है और वास्तव में कंटेनर को दिखाने के लिए अधिसूचना की जरूरत है )

जब आपके पास एक ऐसा प्रोजेक्ट होता है जो बहुत सारे मल्टी थ्रेडिंग या एसक्यूसी डब्ल्यूसीएफ कॉल का उपयोग करता है तो आप बहुत सारे प्रतिनिधियों के साथ समाप्त हो सकते हैं, इसलिए यह एक मानक अपनाना महत्वपूर्ण है जो कम से कम आपके लिए समझ में आता है।


+1 यह एक अच्छा सम्मेलन है। मैं नीचे दिए गए @ जवाब के साथ भी सहमत हूँ जहाँ एक घटना प्रकार के एक प्रतिनिधि द्वारा उपयोग किया जाने वाला 'हैंडलर' के बजाय 'EventHandler' प्रत्यय होना चाहिए।
शमूएल

1
"[समारोह का नाम] प्रतिनिधि" दुर्भाग्य से, CA1711 का उल्लंघन करता है। मुझे "[फंक्शन नेम] फंक" या "[फंक्शन नेम] एक्शन" का उपयोग करना पसंद है, इस पर निर्भर करता है कि उसमें रिटर्न टाइप है या नहीं।
टीनिस्टर

1
यह शायद अब तक का सबसे उपयोगी (और सबसे छोटा) अधिवेशन है। मुझ से +1। @Slugster
FullStackForger

कोड नियम आपको डेलिगेट डॉक्स। Microsoft.en
ईसाई

3
@MelbourneDeveloper बताएं कि जिन लोगों ने RequestDelegateasp.net-core के लिए बनाया है ? -]
t3chb0t

48

Microsoft का फ्रेमवर्क डिज़ाइन दिशानिर्देश - मेरे लिए नामकरण पंचांग, विषय पर निम्नलिखित कहता है :

√ घटनाओं में उपयोग होने वाले प्रतिनिधियों के नामों के लिए प्रत्यय "EventHandler" जोड़ें।
Add ईवेंट हैंडलर के रूप में इस्तेमाल किए गए प्रतिनिधियों के अलावा प्रतिनिधियों के नामों में प्रत्यय "कॉलबैक" जोड़ें।
X एक प्रतिनिधि के लिए प्रत्यय "प्रतिनिधि" न जोड़ें।


16
अजीब बात है कि एमएस का कहना है कि 'डेलीगेट "को एक प्रतिनिधि के लिए प्रत्यय न जोड़ें, लेकिन इस उदाहरण में उनके पास एक प्रतिनिधि है ProcessBookDelegate...
PadawanLondon

1
@PadawanLondon RequestDelegateasp.net-core में एक ही कहानी है - इतना संगति और कोडिंग सम्मेलनों के लिए। मुझे लगता है कि उनके अपने डॉक्स भी नहीं पढ़े।
t3chb0t

16

चूंकि एक प्रतिनिधि एक ऐसी चीज है जो एक क्रिया (क्रिया) करता है, प्रतिनिधि को नाम दिया जाना चाहिए जो आप उस कार्रवाई को करने वाले कुछ को कॉल करेंगे। Converter<TInput, TOutput>उदाहरण के लिए लें । क्रिया रूपांतरित है । कन्वर्सेशन करने वाली चीज़ को कन्वर्टर कहा जाता है , इसलिए डेलीगेट का नाम।


6

यह कुछ बातों पर निर्भर करता है।

यदि प्रतिनिधि को एक घटना के रूप में इस्तेमाल किया जा रहा है, तो इसे हमेशा एक EventHandlerउपप्रकार के रूप में संदर्भित किया जाना चाहिए , उदाहरण के लिए:

public delegate void ValueExtractingEventHandler(object sender,
    ValueExtractingEventArgs e);

यदि यह एक घटना नहीं है, तो एमएस कोडिंग दिशानिर्देश (जो मुझे Google पर कभी भी सही कॉपी नहीं मिल सकते हैं) स्पष्ट रूप से "प्रतिनिधि" या "हैंडलर" जैसे शब्दों को प्रतिनिधि नाम में शामिल करने की सलाह देते हैं , सिवाय विशेष मामले के EventHandlerप्रकार के।

आम तौर पर, प्रतिनिधियों को कार्यों के नाम पर रखा जाना चाहिए , जो इस तरह होगा ValueExtracting(यदि प्रतिनिधि मूल्य निकाले जाने से पहले होता है) या ValueExtracted(निष्कर्षण के बाद)।

Func<T1, T2, ..., TResult>प्रतिनिधि वाक्य रचना भी अधिक आम होता जा रहा है, लेकिन जब तक आप इसे में जाने 4 या अधिक पैरामीटर है, तो आप अपने खुद के घोषित करने के लिए बिल्कुल भी जरूरत नहीं है - सिर्फ एक एक मौजूदा का उपयोग करें:

object ExtractObject(object source, Func<object, object> extractor);

यह सिंटैक्स सबसे अच्छा है जब प्रतिनिधि को एक बंद के रूप में इस्तेमाल किया जा रहा है । प्रतिनिधि के पास स्वयं बहुत दिलचस्प नाम नहीं है, लेकिन तर्क एक एजेंट संज्ञा (चिमटा, प्रदाता, मूल्यांकनकर्ता, चयनकर्ता, आदि) है।

अधिकांश प्रतिनिधि यूजेज उपरोक्त श्रेणियों में से एक में फिट होते हैं, इसलिए यह पता लगाएं कि इसका उपयोग किसके लिए उचित रूप से किया जा रहा है।


3

मैं इसके बारे में कभी नहीं सोचा था, ज्यादातर क्योंकि मैं तो बस से एक का उपयोग EventHandler<T>, Func<T>या Action<T>भार के और अपने को परिभाषित करने के लिए परेशान नहीं किया। मैं शायद आपके द्वारा सूचीबद्ध मूल्य से ValueExtractor चुनूंगा। यह एक वस्तु की तरह अधिक ध्वनि करता है, और जब आप इसे लागू करते हैं तो आप उस वस्तु का उपयोग एक क्रिया करने के लिए करेंगे। उदाहरण के लिए:

ValueExtractor extractor += Blah;
var value = extractor(data);

इसके अतिरिक्त, अधिकांश बिल्ट-इन प्रतिनिधियों को संज्ञा की तरह नाम दिया गया है। जब संदेह हो, तो .NET फ्रेमवर्क का पालन करें।


0

मैं ValueExtraction के साथ जाऊंगा ..
मैंने कभी नहीं सोचा कि क्यों, लेकिन मुझे लगता है क्योंकि आप एक ऑपरेशन का भंडारण कर रहे हैं और इसे एक संज्ञा होना चाहिए .. कड़ाई से यह एक ऑपरेशन नहीं है, मुझे पता है ...


0

के आधार पर Enumerable.Sum, मैं प्रतिनिधि को एक के रूप में पास करूंगा Func<object, object>और पैरामीटर को नाम दूंगा selector:

void Foo(Func<object, object> selector) ...

यदि आपको इसके लिए अपना स्वयं का प्रतिनिधि बनाना है, तो मैं इसके साथ जाऊंगा ValueExtractorक्योंकि यह जो करता है उसके लिए सबसे वर्णनात्मक नाम है।


ये सामान्य प्रतिनिधि (एक्शन और फंक) 95% मामलों में ठीक हैं। ऐसे कुछ मामले हैं जहां वे बेतहाशा अपर्याप्त हैं - यह तब है जब प्रतिनिधि के पास जटिल हस्ताक्षर हैं और बहुत कुछ पास हो जाता है। मूल रूप से, प्रत्येक तर्क क्या स्पष्ट होता है, यदि यह नहीं है, तो एक नामित प्रतिनिधि बनाना एक अच्छा विचार है।
Mat --j Zábský

0

घटनाओं के मामले में (प्रतिनिधि के साथ) विंडोज फॉर्म निम्नलिखित सम्मेलन का उपयोग करता है:

प्रतिनिधि:

public delegate void MouseEventHandler(object sender, MouseEventArgs e);

प्रतिस्पर्धा:

public event MouseEventHandler MouseClick;

घटना श्रोता:

this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseClick);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.