2009-10-05 4 views
5

Vor kurzem fand ich über Presenter First und lesen ihre White Papers und Blogs etc.In Presenter Zuerst, warum ist die SubscribeSomeEvent-Methode auf einer Schnittstelle gegenüber einfachen alten Ereignissen bevorzugt?

In den meisten der Beispiele, die ich gefunden, werden die Ereignisse nicht direkt an der Schnittstelle deklariert, sondern als Methode dafür. Zum Beispiel

public interface IPuzzleView 
{ 
    void SubscribeMoveRequest(PointDelegate listener); 
    // vs 
    event PointDelegate MoveRequest; 
} 

Ich verstehe nicht genau warum. Ich dachte, ich hätte irgendwo eine Zeitung/Artikel/Blog gesehen, die die Gründe dafür erklären, aber ich kann sie nicht mehr finden. Der Text enthielt auch Auszüge aus Unit-Test-Code - ich weiß das, weil ich mich erinnere, mir selbst gesagt zu haben, dass einer der Unit-Tests falsch war.

UPDATE:

Das Folgende ist ein Beispiel zum Vergleich:

public class Collect 
{ 
    public static CollectAction<T> Argument<T>(int index, 
     CollectAction<T>.Collect collectDelegate) 
    { 
     CollectAction<T> collect = new CollectAction<T>(index, collectDelegate); 
     return collect; 
    } 
} 

public interface IApplicationView 
{ 
    event EventHandler Load; 

    // or 

    void SubscribeLoad(Action action); 
} 

Mockery mockery = new Mockery(); 
IApplicationView view = mockery.NewMock<IApplicationView>(); 
IApplicationModel model = mockery.NewMock<IApplicationModel>(); 

Abonnieren Stil:

Action savedAction = null; 
Expect.Once.On(view).Method("SubscribeLoad").Will(
    Collect.Argument<Action>(0, 
    delegate(Action action) { savedAction = action; })); 
Expect.Once.On(model).Method("LoadModules"); 
new ApplicationPresenter(view, model); 
savedAction(); 
mockery.VerifyAllExpectationsHaveBeenMet(); 

vs. Ereignis:

Expect.Once.On(view).EventAdd("Load", Is.Anything); 
Expect.Once.On(model).Method("LoadModules"); 
new ApplicationPresenter(view, model); 
Fire.Event("Load").On(view); 
mockery.VerifyAllExpectationsHaveBeenMet(); 

FYI, der obige Event-Stil wird nicht so funktionieren, wie es ist, da ApplicationPresenter sofort Müll sammelt und die Verkabelung nie passiert.

+1

Ich würde die Leute über atomobject kontaktieren, da sie die meisten Informationen zu diesem Thema hosten und ein großer Teil der Forschung wurde von ihnen durchgeführt. Sie können Sie vielleicht auf das Papier verweisen, an das Sie sich erinnern. –

Antwort

3

Die kurze Antwort ist: Presenter Zuerst entwickelt ursprünglich in den Tagen von .NET 1.1 und VS2003, und C# -Ereignisse könnten problematisch sein.

Die Thin-Current-Test-/Mockingtools unterstützten nicht unsere Notwendigkeit, Ereignissubskription und -versand zu kapseln. Im Laufe der Zeit kamen wir zu dem Gefühl, dass das Offenlegen der spezifischen Natur von Ereignissen außerhalb ihrer emittierenden Klassen den Client-Code mit zu viel Wissen über die Implementierung belastete, was das Refactoring schwierig machte.

Für veröffentlichte Beispiele wollten wir vermeiden, die Presenter First-Technik mit einer sprachspezifischen Funktion zu verknüpfen. (ZB Java hat keine Entsprechung zu C# -Ereignissen oder Delegaten, aber das heißt nicht, dass Sie das Observer-Muster nicht verwenden können.)

Ich sehe, dass Ereignisse, anonyme Delegierte und Mock-Tools einen langen Weg in der die letzten Jahre. Das nächste Mal, wenn ich ein C# -Projekt aufnehme, werde ich alle meine Annahmen auf "die beste Art und Weise" für das Abonnieren und Versenden von Veranstaltungen überprüfen. Die obigen Beispiele sind faszinierend.

unsere ursprüngliche Zusammenfassend vielleicht veraltet, Gründe für unsere Verwendung von C# Ereignissen versteckt: - Mocking Ereignisabonnement war in der Einheit nicht möglich Tests - Gelegentlich würden wir einen anderen internen Mechanismus verwenden Ereignisabonnement/Versand zu handhaben . Dies führte zu einer Inkonsistenz von einer Schnittstelle zur anderen. - Mehrere Male erwogen wir, C# -Ereignisse sogar intern aufzugeben, da sie sich anders verhielten, wenn keine Abonnenten existierten. Ereignisse extern zu exponieren, hätte es viel schwieriger gemacht, sie erneut zu implementieren.

Als Jiho Han mich mit dieser Frage meldete, fragte er auch nach Datenbindung und einem ausgefeilteren PF-Beispiel, auf das ich mit der Veröffentlichung a newer, fuller example of Presenter First and elaborating on Adapters geantwortet habe.

Verwandte Themen