2012-03-31 9 views
0

Ich habe ein paar verschiedene Beispiele für MVP-Muster untersucht und verschiedene Implementierungen gefunden. Es ist mir jedoch nicht klar, welches das andere enthalten sollte: die Ansicht oder der Moderator?Rechte Richtung des Containments in MVP?

Wie der Name schon sagt es:

public MyPresenter(){ 
    display = new MyView(this); 
} 

oder wie meine vernünftige Logik (und eine wikipedia Seite über MVP)

public MyView(){ 
    presenter = new MyPresenter(this); 
} 

oder soll ich etwas völlig anderer Ansatz, diese Objekte zu schaffen?

Antwort

5

DOM ist eines der teuersten Dinge in Browsern, daher ist das Erstellen von Widgets in GWT teuer. Im Gegensatz dazu sind Moderatoren im Allgemeinen billig, so dass sie nach Belieben verwüstet und rekonstruiert werden können.

Deshalb würde ich als Faustregel empfehlen, dass Sie versuchen, Ihre Ansichten für viele Moderatoren wiederzuverwenden (machen Sie sie zu Singletons oder cachen Sie sie für ein paar Minuten).

Das bedeutet, dass Ihr (kurzlebiger) Moderator auf Ihre (langlebige) Ansicht verweisen sollte.

Ich bin ein starker Anhänger der Abhängigkeitsinjektion, also würde ich keinen von innerhalb eines anderen instantiieren. Dies hilft sehr bei der Verwaltung der Lebensdauer der Komponenten, jeweils unabhängig voneinander.
So würden Sie Ihren Blick in Ihren Moderator injizieren: Erstellen Sie den Moderator, wählen Sie die Ansicht (entweder erstellen Sie es oder erhalten Sie aus Ihrem Cache) und geben Sie es Ihrem Referenten. Dann werden Sie den Moderator zerstören und den Überblick behalten, um ihn das nächste Mal wiederzuverwenden (mit einem anderen Moderator).

+0

+1 Um auf die kostspieligen Dinge in den Browsern hinzuweisen. In diesem Sinne denke ich, dass ich mein Projekt noch besser strukturieren kann. Ich beginne nur GWT und DI ist etwas, das ich auch lernen muss (ich weiß nur über das Entwurfsmuster aber keines der Rahmenwerke) Ich werde dann gin/guice überprüfen. – Croo

2

Einer der Hauptgründe für die Verwendung des MVP-Musters besteht darin, die Logik im Presenter zu isolieren, damit sie in der Einheit getestet werden kann.

Wenn Sie dies tun:

public MyPresenter(){ 
    display = new MyView(this); 
} 

Sie werden nicht Ihre Moderator Gerät testen, ohne Verlängerung GWTTestCase der Lage sein, die langsam ist. So ziehe ich viel:

public MyPresenter(MyViewInterface view){ 
    this.view = view; 
} 

Wo MyView implementiert MyViewInterface. Die Schnittstelle kann mit der echten MyView-Implementierung oder einer Testimplementierung verbunden werden, bei der der GWT-Kontext zum Testen nicht aktiviert werden muss.