c ++ Model View Presenter: ¿Dónde construir presentador?

8

Estoy usando el patrón Model View Presenter (MVP) como se describe en el documento The Humble Dialog Box (pdf) con un proyecto de MFC. Estoy seguro de que el problema es el mismo con la mayoría de los kits de herramientas GUI.

Lo que me molesta es la vista concreta (es decir, la clase de diálogo) está creando no solo el presentador sino también los servicios que el presentador necesita. ¿Eso es normal? ¿Por qué la vista necesita saber qué servicios necesita el presentador? Lo que estoy pensando es que debería inyectar dependencia al presentador en la clase de diálogo.

El control principal para la aplicación es una clase derivada de CWinApp. Entonces, ¿debería construir servicios y presentador en esta clase y luego inyectarlos en la clase de diálogo?

Aunque, ¿cómo inyectaría la dependencia al presentador en la clase de diálogo cuando el presentador necesita una referencia a la clase de vista en su constructor?

MyPresenter(IView *view, MyService *service);

Además, ¿qué tal si la ventana principal se genera en una ventana emergente, dónde se deben construir los detalles para ese presentador de ventanas y servicios?

Como se trata de C ++, no creo que me interese ningún tipo de marco DI.

ACTUALIZAR

Una idea que tuve fue construir el presentador con una vista nula, el constructor inyectó el presentador en la clase de diálogo, y luego en el constructor de la clase de diálogo llamar a un SetView(IView *view)método en el presentador con thisdónde thissería la clase de diálogo (que se deriva de IView ) Entonces:

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);
}

Parece un poco torpe pero mantiene la construcción del servicio fuera de la clase Dialog. La vista nula parece un poco peligrosa. Una alternativa sería construir una clase NullView que tuviera cuerpos de método vacíos y luego pasarla al constructor del presentador.

Usuario
fuente

Respuestas:

1

¿Quizás una mejor solución es usar una clase o método de fábrica que sepa cómo construir un presentador? La vista pasaría al método de fábrica y almacenaría el valor de retorno en su miembro presentador.

Esto desacopla la información sobre cómo se construye un presentador (dependencias de los servicios o lo que sea) de la vista misma.

Jørn Jensen
fuente
0

Creo que su idea original (construir presentador y servicio dentro de la vista) no hace daño. Tenemos que pedirnos beneficio de la inyección y no veo ninguna.

Al separar la vista real en vista abstracta y presentador, ya logró la separación de las preocupaciones. Y puede obtener beneficios del logro, por ejemplo, probando al presentador con una vista rellena o burlada. Entonces, ¿por qué querrías inyectar al presentador en una vista concreta? No veo ninguna necesidad

Tae-Sung Shin
fuente