Estou implementando o padrão de interface do usuário do MVP / Apresentação corretamente?

StackOverflow https://stackoverflow.com/questions/3435834

Pergunta

Estou fazendo novamente um aplicativo Winforms e gostaria de empregar uma variação do Padrão do modelo de apresentação para a interface do usuário. Alguém poderia me dizer das seguintes explicações se estou fazendo isso corretamente?


Eu decidi configurar dependências da seguinte maneira:

   Model <---- Presentation Model <---- View

Aquilo é:

  • O modelo não está ciente de nada, exceto por si mesmo.

  • O modelo de apresentação tem uma referência ao modelo (mas não vice -versa).

  • A visualização tem uma referência ao modelo de apresentação (mas não vice -versa).

Estou usando a ligação de dados do WinForms para manter a visualização e o modelo de apresentação sincronizado.

Agora, tudo isso funciona como um encanto, exceto quando eu preciso lidar com, por exemplo, um clique no botão "Fechar" de um formulário. Como o modelo de apresentação não tem referência à visualização, ele não pode assinar nenhum evento publicado pelo The View. Assim, eu criei a seguinte muleta:

Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+

Aquilo é:

  • O usuário clica no botão "Fechar".

  • Os botões Click O evento é capturado na vista, que reage ao definir a propriedade CloseRequested.

  • A ligação de dados transfere esse valor para uma propriedade correspondente no modelo de apresentação.

  • O modelo de apresentação reage a essa mudança definindo sua propriedade IsClosed.

  • A ligação de dados transfere esse valor para a visualização MustClose.

  • A visão reage a essa mudança fechando -se.

O modelo de apresentação é bem dissociado da vista e vice -versa, no entanto Isso é muito trabalho apenas para processar um único comando de botão. Existe uma maneira mais fácil, dado o gráfico de dependência que eu decidi?

Foi útil?

Solução

Recentemente, tenho convertido um aplicativo Windows Forms na arquitetura MVP e parece que você configurou suas dependências de maneira semelhante à do que tenho feito. No entanto, eu simplesmente tenho um IPresenter Interface que define métodos para permitir que a visualização passe as solicitações de usuário. Como a visualização já tem uma dependência do apresentador e uma referência a ele, parece sensato simplesmente chamar métodos de solicitação diretamente.

Assim, no meu sistema, o apresentador ouve eventos do modelo e dispara seus próprios eventos de apresentação para qualquer visão interessada para ouvir. A visualização responde a esses eventos atualizando -se conforme apropriado e encaminha solicitações do usuário ao apresentador quando forem feitas.

Outras dicas

É apenas minha opinião.

Trabalhar com o modelo de apresentação requer suporte 100% da interface do usuário para ligação de dados. Mesmo o WPF não torna a ação próxima como vinculável. Muita coisa não funcionará sem problemas no modelo de apresentação, como a confirmação da caixa de mensagem. Mesmo pode ser abstraído com a interface do apresentador, mas ainda não tem um sabor bom e a simplicidade é sacrificada.

Por outro lado, os principais propósitos do modelo de apresentação é testar a lógica de exibição. Em alguns casos, se a sua "ação próxima" deve ser testada por unidade, devido a alguma lógica antes que ele esteja próximo, seu código é a única opção. Mas se for apenas uma confirmação simples "Você tem certeza de que deseja sair", é melhor colocar isso na visualização não no modelo de apresentação, porque não é necessário para o teste de unidade.

A visualização tem uma referência ao modelo de apresentação (mas não vice -versa).

Afaik A apresentação deve ter uma referência para ver mais exatamente para a interface IView, para que a apresentação não pareça com vista concreta. Em seguida, na aula de apresentação, você pode chamar métodos de visualização e assinar para visualizar eventos via IView.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top