Apresentador do Model View do c ++: onde construir o apresentador?

8

Estou usando o padrão Model View Presenter (MVP), conforme descrito no artigo The Humble Dialog Box (pdf) com um projeto MFC. Tenho certeza de que o problema é o mesmo com a maioria dos kits de ferramentas da GUI.

O que está me incomodando é a visão concreta (ou seja, a classe de diálogo) está criando não apenas o apresentador, mas também os serviços que o apresentador precisa. Isso é normal? Por que a exibição precisa saber de quais serviços o apresentador precisa? O que estou pensando é que eu deveria injetar dependência no apresentador na classe de diálogo.

O controle principal do aplicativo é uma classe derivada do CWinApp. Então, devo construir serviços e apresentador nesta classe e injetá-los na classe dialog?

Embora como a dependência injetasse o apresentador na classe de diálogo quando o apresentador precisa de uma referência à classe de exibição em seu construtor?

MyPresenter(IView *view, MyService *service);

E se a janela principal aparecer em uma janela pop-up, onde os detalhes desse apresentador e serviços do Windows devem ser construídos?

Como este é C ++, acho que não estaria interessado em nenhum tipo de estrutura de DI.

ATUALIZAR

Uma idéia que tive foi construir o apresentador com uma visão nula, o construtor injeta o apresentador na classe de diálogo e, em seguida, no construtor da classe de diálogo, chama um SetView(IView *view)método no apresentador com thisonde thisseria a classe de diálogo (que deriva de IView ) Assim:

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 um pouco arrogante, mas mantém a construção de serviços fora da classe Dialog. A visão nula parece um pouco perigosa. Uma alternativa seria realmente construir uma classe NullView que tivesse corpos de métodos vazios e depois passar isso para o construtor do apresentador.

Do utilizador
fonte

Respostas:

1

Talvez uma solução melhor seja usar uma classe ou método de fábrica que saiba como criar um apresentador? A visualização passaria para o método de fábrica e armazenaria o valor de retorno em seu membro apresentador.

Isso separa as informações sobre como um apresentador é construído (dependências de serviços ou qualquer outra coisa) da própria exibição.

Jørn Jensen
fonte
0

Acho que sua ideia original (construir apresentador e serviço dentro da visualização) não faz mal. Temos que nos perguntar o benefício da injeção e não vejo nenhuma.

Ao separar a visão real da visão abstrata e do apresentador, você já conseguiu separar as preocupações. E você pode se beneficiar da conquista, por exemplo, testando o apresentador com a exibição cheia ou zombada. Então, por que você deseja injetar o apresentador em uma visão concreta? Não vejo necessidade.

Tae-Sung Shin
fonte