2010-02-27 17 views
69

Per convenzione le classi sono spesso denominate come nomi, metodi come verbi e interfacce come aggettivi.Convenzione di denominazione corretta per un tipo di delegato .NET?

Qual è la convenzione di denominazione comune per un delegato? O qual è un buon modo per differenziare il suo nome quando i delegati sono elencati tra tipi e altre cose?

Il mio presupposto immediato è di nominare un delegato più probabilmente un aggettivo perché una singola interfaccia di metodo può essere spesso sostituita con un delegato.

Alcuni pensieri:

delegate object ValueExtracting(object container); 

delegate object ValueExtractor(object container); 

delegate object ValueExtractionHandling(object container); 

delegate object ValueExtractionHandler(object container); 

risposta

87

Personalmente io uso un paio di modelli diversi:

[Task][State]Handler- UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - usato quando ho bisogno di creare un delegato per chiamare una funzione su una nuova/nuova discussione

[Task]Callback - ContainerLoadedCallback - utilizzato quando il controllo A avvia un'azione che controlla B svolge la maggior parte del lavoro e controlla A ha passato una dipendenza in controllo B (ad es. ControlA potrebbe aver passato un contenitore UI per ControlB da compilare e ha bisogno di notifica per mostrare effettivamente il contenitore)

Quando si ha un progetto che utilizza molte chiamate WCF multi-threading o asincrone, è possibile ritrovarsi con molti delegati che si spostano in giro, quindi è importante adottare uno standard che abbia almeno senso per te.

+0

+1 È una bella convenzione. Sono inoltre d'accordo con la risposta @Aaronaught in cui un delegato utilizza un tipo di evento dovrebbe avere il suffisso 'EventHandler' invece di solo 'Handler'. – Samuel

+0

"[Nome funzione] Delegato" viola CA1711, sfortunatamente. Mi piace usare "[Nome funzione] Func" o "[Nome funzione] Azione" a seconda se ha un tipo di ritorno o meno. – Tinister

+1

Questa è probabilmente la convenzione più utile (e più breve) che ho visto finora. +1 da me. Grazie per aver condiviso @slugster – FullStackForger

3

ho mai pensato, soprattutto perché mi basta usare una delle EventHandler<T>, Func<T> o Action<T> sovraccarichi e mai preoccuparsi di definire la mia. Probabilmente scegliere ValueExtractor da quelli che hai elencato. Ciò lo rende più simile a un oggetto e, quando lo invochi, utilizzerai quell'oggetto per eseguire un'azione. Ad esempio:

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

Inoltre, la maggior parte dei delegati incorporati sono denominati come nomi. In caso di dubbi, seguire il framework .NET.

0

vorrei andare con ValueExtraction ..
ho mai pensato perché, ma credo perché sei memorizzare un'operazione e dovrebbe essere un sostantivo .. strettamente questo non è un'operazione, lo so .. .

0

sulla base di Enumerable.Sum, mi piacerebbe passare il delegato come Func<object, object> e il nome del parametro selector:

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

Se dovete fare il vostro proprio delegato per questo, mi piacerebbe andare con ValueExtractor dato che è più nome descrittivo per quello che fa.

+0

Questi delegati generici (Azione e Func) sono buoni al 95% dei casi. Ci sono alcuni casi in cui sono selvaggiamente insufficienti - questo è quando il delegato ha una firma complicata e viene passato molto spesso. Fondamentalmente, ciò che ogni argomento dovrebbe essere ovvio, se non lo è, fare un delegato nominato è una buona idea. –

6

Questo dipende da alcune cose.

Se il delegato sta per essere usato come un evento, occorre sempre essere indicato come un EventHandler sottotipo, ad esempio:

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

Se non è un evento, poi le linee guida di codifica MS (che non riesco mai a trovare la copia corretta di su Google) raccomando esplicitamente contro includendo parole come "delegato" o "gestore" nel nome del delegato, eccetto nel caso speciale dei tipi EventHandler.

Normalmente, delegati dovrebbe essere chiamato dopo azioni, che sarebbe come ValueExtracting (se il delegato avviene prima che il valore viene estratto) o ValueExtracted (dopo l'estrazione).

La sintassi Func<T1, T2, ..., TResult> delegato è anche diventando sempre più comune, ma a meno che non si hanno 4 o più parametri andando in esso, non è necessario dichiarare il proprio a tutti - basta usare uno esistente:

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

Questa sintassi è la migliore quando il delegato viene utilizzato come chiusura . Il delegato sé non ha un nome molto interessante, ma l'argomento è un agente sostantivo (estrattore, erogatori, valutatore, selettore, etc.)

La maggior parte dei usi delegati rientrano in una delle categorie di cui sopra, in modo da figura da quale viene utilizzato per scegliere appropriatamente.

13

Poiché un delegato è qualcosa che esegue un'azione (un verbo), il delegato dovrebbe essere denominato ciò che chiamereste qualcosa che esegue quell'azione. Prendi ad esempio Converter<TInput, TOutput>. Il verbo è Convertire. La cosa che fa la conversione è chiamata convertitore , da cui il nome del delegato.

30

Framework Design Guidelines - l'almanacco di denominazione per me, dice the following sul tema:

√ aggiungi il suffisso "EventHandler" per i nomi dei delegati che vengono utilizzati negli eventi.
√ Aggiungere il suffisso "Callback" ai nomi dei delegati altri rispetto a quelli utilizzati come gestori di eventi.
X NON aggiungere il suffisso "Delega" a un delegato.

+8

Divertente che MS abbia scritto "NON aggiungere il suffisso" Delegato "a un delegato", ma in [questo esempio] (https://msdn.microsoft.com/en-us/library/ms173176.aspx) hanno un delegato chiamato 'ProcessBookDelegate' ... – PadawanLondon

Problemi correlati