2009-06-08 8 views
5

Angenommen, ich eine Klasse, die das folgende Ereignis macht:Naming Methoden, die auf Ereignisse registriert sind

public event EventHandler Closing 

Wie sollten Methoden, die zu diesem Ereignis benannt werden registriert? Befolgen Sie lieber die Konvention, die Visual Studio verwendet, wenn es den von ihm generierten Methoden Namen zuweist (aka. + =, Tab, Tab)? Zum Beispiel:

private void TheClass_Closing(object sender, EventArgs e) 

Oder verwenden Sie Ihren eigenen Stil, um diese Methoden zu benennen?

Ich habe verschiedene Methoden versucht, diese Methoden zu benennen (wie TheClassClosing, HandleClosing, usw.). Aber ich habe keinen guten Stil gefunden, um anzuzeigen, dass die Absicht einer Methode darin besteht, ein registriertes Ereignis zu behandeln. Ich persönlich mag den Stil (Unterstrich) nicht, den Visual Studio verwendet, um Methodennamen zu generieren.

Ich weiß, dass registrierte Ereignisbehandlungsmethoden immer privat sind und dass es wie das keine Namenskonvention für Methoden, die Ereignisse auslösen (zum Beispiel OnClosing).

+0

Während das Verb "register" in dieser Frage verwendet wird, verwendet Microsoft häufig das Verb ["subscribe."] (Https://msdn.microsoft.com/en-us/library/ms366768.aspx) – DavidRR

Antwort

2

Die beiden häufigsten verwendeten Optionen für die Benennung ist entweder nach dem, was die Methode tut:

theObject.Closing += SaveResults; 

Oder alternativ nach dem, was die Methode behandelt:

theObject.Closing += ClosingHandler; 

Welche hängt wirklich ein wenig vorzuziehen ist, auf Kontext.

Im ersten Fall ist sofort klar, was der Handler tun wird, wodurch der Code den Handler besser lesbar macht ... aber wenn man sich den Handler SaveResults betrachtet, wird es nicht unbedingt offensichtlich sein, wann er es ist wird aufgerufen, es sei denn, die Ereignisargumente haben einen offensichtlichen Namen (ClosingEventArgs oder einige solche).

Im zweiten Fall ist die Registrierung undurchsichtiger (okay, was passiert, wenn Closing geschieht?), Aber auf der anderen Seite, wenn man die Handler-Implementierung betrachtet, wird es offensichtlich sein, was vor sich geht.

Ich denke, die eine zu wählen hängt davon ab, welche der beiden Sie mehr offensichtlich sein möchten; die Website der Registrierung oder die Implementierung des Handlers.

Oder alternativ können Sie für die unheilige Kombination beiden Methoden gehen:

theObject.Closing += ClosingHandlerSaveResults; 

beide Nun ist die Website-Registrierung und die Umsetzung ist ebenso offensichtlich, und keiner sieht besonders elegant (plus, es verletzt wahrscheinlich die DRY Prinzip).

Für die Aufzeichnung ziehe ich das erste Namensschema, wenn theObject in einem anderen Bereich der Implementierung von SaveResults, und das zweite Schema enthalten ist, wenn ich Handler Ereignisse bin für Verkabelung, die alle innerhalb derselben Klasse enthalten sind.

0

Ich benenne meine Event-Handler ähnlich wie die von Visual Studio (die +, =, Registerkarte, Registerkarte, die Sie erwähnen). Ich versuche, meine Benennung in meinem Code konsistent zu halten, und ich weiß, dass ich zumindest zeitweise Handler mit dem VS-Auto-Creator erstellen werde.

Die Unterstriche stören mich nicht.

0

vielleicht: OnObjectNameEventName, wie

private void OnTheClassClosing(object sender, EventArgs e) 

Dieses die internen Ereignismethoden übereinstimmt und mit dem Zusatz des Objektnamens, sollte es helfen, zu unterscheiden, dabei die Methode Ereignisse erhöhen im Wesentlichen interne Event-Handler sind

Benutzer klickt auf Formular, formt Aufrufe OnClicked, macht sein Ding, dann löst das Clicked-Ereignis aus, es wäre nur aus meiner Sicht natürlich.

+1

Aufgrund MFC, der "OnSomeEvent" -Stil ist in vielen Programmierern (mir eingeschlossen) eingeprägt. Leider hat Microsoft beschlossen, die Bedeutung von "Senden eines Ereignisses" anstelle von "Empfangen eines Ereignisses" zu ändern, wodurch viele .NET-Codes unnötig verwirrt werden. Ich benutze jetzt RaiseSomeEvent, um ein Ereignis zu senden, und habe die unangenehme aber klare Sender_EventName() Konvention übernommen. Ich benutze Many_EventName() in dem Fall, in dem ein Event-Handler an mehr als einen Sender angehängt ist. –

+0

@Jason: Also, wenn Sie sich entscheiden, an einen anderen Absender anzuhängen, müssen Sie Ihre Methode umbenennen? Ich mag den RaiseSomeEvent-Namen aber ... vielleicht werde ich anfangen, das anstelle von OnSomeEvent zu verwenden ... fand immer das Letztere ein bisschen ... falsch ... – Svish

3

Benennen Sie es nach was der Handler tatsächlich tut.

// event += event handler 
saveButton.Click += SaveData(); 
startButton.Click += StartTheTimer(); 
+1

Ich bin froh zu sehen, dass ich nicht der Einzige bin wer macht das? Methoden sollten sagen, was sie tun, nicht wie sie verwendet werden. Es ist die Aufgabe der Eventverkabelung, das klarzustellen :) –

+1

@DavidRR: Nun, das ist eine Anleitung zur Benennung der Delegierten selbst - was heutzutage selten mit 'EventHandler ' zu tun hat. Ich würde sicherlich keinen separaten Delegattyp für jedes Ereignis wünschen, das jemals erstellt wurde. Die Frage des OP fragt nicht nach der Benennung des Delegaten, da sie 'EventHandler' verwenden. Grundsätzlich denke ich, Ihre Antwort ist keine Antwort auf die Frage, die gestellt wurde ... –

+0

Um Jons Kommentar, der eine Antwort auf meine Antwort ist, die ich gelöscht habe, Kontext zu geben, bietet Microsoft Anleitungen für die [naming ** -Ereignis Handler ** (Delegierte, die als Ereignistypen verwendet werden)] (https://msdn.microsoft.com/en-us/library/ms229012%28v=vs.110%29.aspx). Der in diesem Zusammenhang verwendete Begriff "Ereignisbehandler" ist jedoch * nicht * der gleiche wie eine Methode, die für ein Ereignis abonniert (registriert) ist. – DavidRR

Verwandte Themen