Richtige Namenskonvention für einen .NET-Delegatentyp?

81

Nach Konventionen werden Klassen oft wie Substantive, Methoden wie Verben und Schnittstellen wie Adjektive benannt.

Was ist die übliche Namenskonvention für einen Delegierten? Oder was ist ein guter Weg, um seinen Namen zu unterscheiden, wenn Delegierte nach Typen und anderen Dingen aufgelistet sind?

Meine unmittelbare Annahme ist, einen Delegaten eher als Adjektiv zu bezeichnen, da eine einzelne Methodenschnittstelle häufig durch einen Delegaten ersetzt werden kann.

Einige Gedanken:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);
John K.
quelle

Antworten:

110

Persönlich verwende ich ein paar verschiedene Muster:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - Wird verwendet, wenn ein Delegat zum Aufrufen einer Funktion in einem anderen / neuen Thread erstellt werden muss

[Task]Callback - ContainerLoadedCallback - Wird verwendet, wenn Steuerelement A eine Aktion startet, bei der Steuerelement B den größten Teil der Arbeit erledigt und Steuerelement A eine Abhängigkeit an Steuerelement B übergeben hat (dh ControlA hat möglicherweise einen UI-Container übergeben, den ControlB füllen soll, und muss benachrichtigt werden, um den Container tatsächlich anzuzeigen )

Wenn Sie ein Projekt haben, das viele Multithreading- oder asynchrone WCF-Aufrufe verwendet, können viele Delegierte herumschweben. Daher ist es wichtig, einen Standard zu übernehmen, der zumindest für Sie sinnvoll ist.

Slugster
quelle
+1 Es ist eine schöne Konvention. Ich stimme auch der folgenden Antwort von @Aaronaught zu, in der ein Delegat, der von einem Ereignistyp verwendet wird, das Suffix 'EventHandler' anstelle von 'Handler' haben sollte.
Samuel
1
"[Funktionsname] Delegat" verstößt leider gegen CA1711. Ich verwende gerne "[Funktionsname] Func" oder "[Funktionsname] Aktion", je nachdem, ob es einen Rückgabetyp hat oder nicht.
Tinister
1
Das ist wahrscheinlich die nützlichste (und kürzeste) Konvention, die ich bisher gesehen habe. +1 von mir. Vielen Dank für das Teilen von @slugster
FullStackForger
Die Code-Regeln sagen Ihnen, dass Sie keinen Delegierten mit Delegate docs.microsoft.com/en-us/visualstudio/code-quality/…
Christian Findlay
1
@ MelbourneDeveloper sagen, dass die Jungs, die den RequestDelegatefür asp.net-Core erstellt haben; -]
t3chb0t
48

Microsoft Framework Design Guidelines - der Namensalmanach für mich, sagt Folgendes zum Thema:

√ Fügen Sie den Namen der Delegierten, die in Ereignissen verwendet werden, das Suffix "EventHandler" hinzu.
√ Fügen Sie das Suffix "Rückruf" zu Namen von anderen Delegierten als den als Ereignishandler verwendeten hinzu.
X Fügen Sie einem Delegaten NICHT das Suffix "Delegieren" hinzu.

Borislav Ivanov
quelle
16
Komisch, dass MS sagt "Füge NICHT das Suffix" Delegierter "zu einem Delegierten hinzu", aber in diesem Beispiel haben sie einen Delegierten namens ProcessBookDelegate...
PadawanLondon
@PadawanLondon die gleiche Geschichte mit RequestDelegatein asp.net-core - so viel zu Konsistenz und Codierungskonventionen. Ich denke, die lesen nicht einmal ihre eigenen Dokumente.
t3chb0t
16

Da ein Delegat eine Aktion (ein Verb) ausführt, sollte der Delegat so genannt werden, wie Sie etwas nennen würden, das diese Aktion ausführt. Nehmen Sie Converter<TInput, TOutput>zum Beispiel. Das Verb ist Konvertieren . Die Konvertierung wird als Konverter bezeichnet , daher der Name des Delegaten.

Kevin Kibler
quelle
6

Dies hängt von einigen Dingen ab.

Wenn der Delegat als Ereignis verwendet werden soll, sollte er immer als EventHandlerSubtyp bezeichnet werden, zum Beispiel:

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

Wenn es nicht ein Ereignis ist, dann ist die MS Code - Richtlinien explizit (was ich kann nie die richtige Kopie auf Google zu finden scheine) empfehlen gegen Worte wie „delegiert“ oder „Handler“ in den Delegiertennamen einschließlich, außer in dem Sonderfall EventHandlerTypen.

Normalerweise sollten Delegaten nach Aktionen benannt werden , die wie ValueExtractingfolgt aussehen (wenn der Delegat vor dem ValueExtractedExtrahieren des Werts auftritt) oder (nach dem Extrahieren).

Die Func<T1, T2, ..., TResult>Delegatensyntax wird ebenfalls immer häufiger, aber wenn Sie nicht über 4 oder mehr Parameter verfügen, müssen Sie Ihre eigenen überhaupt nicht deklarieren - verwenden Sie einfach einen vorhandenen:

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

Diese Syntax ist am besten geeignet, wenn der Delegat als Abschluss verwendet wird . Der Delegat selbst hat keinen sehr interessanten Namen, aber das Argument ist ein Agentennomen (Extraktor, Anbieter, Bewerter, Selektor usw.).

Die meisten Delegiertenverwendungen passen in eine der oben genannten Kategorien. Stellen Sie also fest, für welche Kategorie sie angemessen ausgewählt werden.

Aaronaught
quelle
3

Ich habe nie darüber nachgedacht, vor allem , weil ich nur eine der verwenden EventHandler<T>, Func<T>oder Action<T>Überlastungen und nie die Mühe meinen eigenen definieren. Ich würde wahrscheinlich ValueExtractor aus den von Ihnen aufgelisteten auswählen. Dadurch klingt es eher wie ein Objekt, und wenn Sie es aufrufen, verwenden Sie dieses Objekt, um eine Aktion auszuführen. Beispielsweise:

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

Darüber hinaus werden die meisten integrierten Delegaten auch wie Substantive benannt. Befolgen Sie im Zweifelsfall das .NET Framework.

MikeP
quelle
0

Ich würde mit ValueExtraction gehen.
Ich habe nie darüber nachgedacht, warum, aber ich denke, weil Sie eine Operation speichern und es ein Substantiv sein sollte. Genau genommen ist dies keine Operation, ich weiß ...

Matias
quelle
0

Basierend auf Enumerable.Sumwürde ich den Delegaten als übergeben Func<object, object>und den Parameter benennen selector:

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

Wenn Sie Ihren eigenen Delegierten dafür machen müssen, würde ich mitmachen, ValueExtractorda dies der aussagekräftigste Name für das ist, was es tut.

Sam Harwell
quelle
Diese generischen Delegierten (Action und Func) sind in 95% der Fälle in Ordnung. Es gibt jedoch einige Fälle, in denen sie völlig unzureichend sind - dann hat der Delegat eine komplizierte Signatur UND wird häufig herumgereicht. Grundsätzlich sollte klar sein, was jedes Argument tut. Wenn dies nicht der Fall ist, ist es eine gute Idee, einen benannten Delegierten zu bestimmen.
Matěj Zábský