2017-08-31 3 views
0

Gerade bei Ereignissen habe ich mich gefragt, ob es einen guten Grund gibt, sich für einen anderen zu entscheiden?Senden von relevanten Daten nach Parameter oder Zugriff mit Getter?

C# Beispiel:

Class A 
public event System.Action<someparam> someevent; 

Class B 
void eventcalledmethod(someparam param){ 
    //do something with param 
} 

Vs.

Class A 
public event System.Action(); 
public static someparam Getter{get;} 

Class B 
void eventcalledmethod(){ 
    //do something with A.Getter 
} 

Das zweite Beispiel wird in der Microsoft Windows C++ - API für die Behandlung von Fensterereignissen verwendet.

+0

Sie sollten wirklich https://codereview.stackexchange.com/ für diese verwenden, da dies nicht wirklich eine Frage für seine nicht funktioniert hier ist, was ich versucht habe. – rogue39nin

+0

Hey, danke für den Hinweis, wusste nicht, wo ich war, als ich diese –

Antwort

0

Beantworten, wie ich würde argumentieren, dass dies keine Frage des Stils ist, da die erste Methode verschiedene Funktionen für die zweite bietet (ignorieren alberne Dinge, die Sie sonst nirgends in Ihrer Code-Basis tun würden).

Die erste Methode hat den Vorteil, Informationen über eine bestimmte Instanz von A (oder andere für das Ereignis benötigte Informationen) weitergeben zu können. Dies ist idiomatisch und folgt normalen OOP-Praktiken hinsichtlich Polymorphismus und Einkapselung. In Bezug auf Muster ermöglicht es unter anderem die Abhängigkeitsinjektion.

Die zweite Methode bindet die Ereignisbehandlung an eine statische Eigenschaft von A, was bedeutet, dass jede Instanz von A keine eigenen Werte dafür haben kann. Es ist auch nicht idiomatisch, da die meisten Programmierer erwarten, dass das Ereignis alle Informationen enthält, die für die Behandlung des Ereignisses benötigt werden - das Binden der Verarbeitung an eine statische Eigenschaft fügt eine unnötige Kopplung hinzu.

Ich weiß, dass dies wie ein Stil-Argument scheinen mag, aber ich würde wirklich argumentieren, dass das erste einfach flexibler ist und als solches sollte wo möglich bevorzugt werden.

+0

posten Danke @Bilkokuya für Ihre ausführliche Antwort. Das zweite Beispiel wurde nicht explizit für Instanzinformationen angegeben. Ich erinnere mich an die Input-Klasse von Unity, die alle wichtigen Informationen statisch liefert. Wenn es ein Event für OnMouseClicked geben würde, wäre es nicht notwendig, dass das Ereignis die Maustaste weitergibt, weil man auf einige Input-Klassen struct für diese Information zugreifen könnte. Vielleicht macht eine andere Frage das klarer: "Wenn ich wissen wollte, ob ein bestimmtes Objekt etwas getan hat, melde ich mich dann zu seinem Ereignis an oder melde ich mich zu einem Klassenereignis an, das es passiert"? –

+0

@AlexanderSeeck Danke für die Klarstellung. Das Wichtigste für mich ist, dass die Veranstaltung alle Informationen über die Veranstaltung enthält und wer sie gesendet hat. Ob von einer statischen Instanz oder von jedem Objekt selbst - wenn Sie das Quellobjekt nicht an das Ereignis übergeben, benötigen Sie einen separaten Handler für das Ereignis jedes Objekts. Wenn Sie sich im Idealfall bei einem Ereignis eines Objekts registrieren, sollte es dennoch eine Referenz von sich selbst in dem Ereignis senden. Außerhalb dieser Informationen ist das, was das Ereignis tatsächlich sendet, völlig stilistisch und wird keinen wirklichen Einfluss darauf haben, was Sie erreichen können/können. – Bilkokuya

Verwandte Themen