c ++ Model View Presenter: Wo wird der Presenter erstellt?

8

Ich verwende das Model View Presenter (MVP) -Muster, wie in The Humble Dialog Box (pdf) beschrieben, mit einem MFC-Projekt. Ich bin sicher, dass das Problem bei den meisten GUI-Toolkits dasselbe ist.

Was mich stört, ist die konkrete Sichtweise (dh die Dialogklasse), die nicht nur den Präsentator erstellt, sondern auch die Dienste, die der Präsentator benötigt. Ist das normal? Warum muss die Ansicht wissen, welche Dienste der Präsentator benötigt? Was ich denke ist, dass ich den Präsentator abhängig in die Dialogklasse einfügen sollte.

Das Hauptsteuerelement für die Anwendung ist eine von CWinApp abgeleitete Klasse. Soll ich also Dienste und Präsentatoren in dieser Klasse erstellen und sie dann in die Dialogklasse einfügen?

Wie würde ich den Präsentator in Abhängigkeit in die Dialogklasse einfügen, wenn der Präsentator einen Verweis auf die Ansichtsklasse in seinem Konstruktor benötigt?

MyPresenter(IView *view, MyService *service);

Wie wäre es auch, wenn das Hauptfenster aus einem Popup-Fenster hervorgeht. Wo sollten die Details für diesen Windows-Präsentator und die Windows-Dienste erstellt werden?

Da dies C ++ ist, glaube ich nicht, dass ich an irgendeiner Art von DI-Framework interessiert wäre.

AKTUALISIEREN

Eine Idee , die ich hatte , war der Moderator mit einem Null - Ansicht, Konstruktor inject Präsentator in die Dialogklasse zu konstruieren, und dann in den Konstruktor des Dialogklasse aufrufen eine SetView(IView *view)Methode auf dem Moderator mit thisdem thisder Dialog - Klasse sein würde (das ergibt sich aus IView ). Damit:

MyApp::Start()
{
  SomeService *service = new SomeService();
  MyPresenter *presenter = new MyPresenter(null, service);
  MyDialog *dialog = new MyDialog(presenter);
  ...
}

MyDialog::MyDialog(MyPresenter *presenter):
 presenter_(presenter)
{
  presenter_->SetView(this);
}

Scheint ein wenig klobig, hält aber die Servicekonstruktion von der Dialog-Klasse fern. Die Nullansicht scheint ein wenig gefährlich. Eine Alternative wäre, tatsächlich eine NullView-Klasse mit leeren Methodenkörpern zu erstellen und diese dann an den Presenter-Konstruktor zu übergeben.

Benutzer
quelle

Antworten:

1

Vielleicht ist eine bessere Lösung die Verwendung einer Factory-Klasse oder -Methode, die weiß, wie man einen Präsentator erstellt? Die Ansicht würde sich selbst an die Factory-Methode übergeben und den Rückgabewert in ihrem Präsentationsmitglied speichern.

Dadurch werden Informationen darüber, wie ein Präsentator aufgebaut ist (Abhängigkeiten von Diensten oder was auch immer), von der Ansicht selbst entkoppelt.

Jørn Jensen
quelle
0

Ich denke, Ihre ursprüngliche Idee (Moderator und Service innerhalb der Ansicht zu konstruieren) schadet nicht. Wir müssen uns fragen, ob wir von der Injektion profitieren können, und ich sehe keine.

Durch die Trennung der tatsächlichen Ansicht in eine abstrakte Ansicht und einen Präsentator haben Sie bereits eine Trennung der Bedenken erreicht. Und Sie können von der Leistung profitieren, indem Sie beispielsweise den Moderator mit einer ausgestopften oder verspotteten Ansicht testen. Warum sollten Sie den Moderator in eine konkrete Sicht einbringen? Ich sehe keine Notwendigkeit.

Tae-Sung Shin
quelle