Qual é a diferença entre o padrão de design MVC, MVP e MVVM em termos de codificação c #

202

Se pesquisarmos no Google usando a frase "Qual é a diferença entre o padrão de design MVC, MVP e MVVM", poderemos obter alguns URLs que discutam a diferença entre o padrão de design MVC MVP e MVVM teoricamente como :

MVP

Use em situações em que a ligação através de um datacontext não é possível. O Windows Forms é um exemplo perfeito disso. Para separar a visualização do modelo, é necessário um apresentador. Como a visualização não pode se vincular diretamente ao apresentador, as informações devem ser passadas para a visualização por meio de uma interface (IView).

MVVM

Use em situações em que a ligação por meio de um datacontext é possível. Por quê? As várias interfaces IView para cada visualização são removidas, o que significa menos código a ser mantido. Alguns exemplos em que o MVVM é possível incluem projetos WPF e javascript usando Knockout.

MVC

Use em situações em que a conexão entre a visualização e o restante do programa nem sempre esteja disponível (e você não pode efetivamente empregar MVVM ou MVP). Isso descreve claramente a situação em que uma API da web é separada dos dados enviados para os navegadores do cliente. O ASP.NET MVC da Microsoft é uma ótima ferramenta para gerenciar essas situações e fornece uma estrutura MVC muito clara


Mas não encontrei um único artigo que discuta teoricamente a diferença junto com o código de exemplo.

Seria muito bom se eu receber um artigo que discuta a diferença entre esses três padrões de design (MVC, MVP e MVVM) junto com o código.

Gostaria de obter o código-fonte de três aplicativos CRUD similares , implementados por esses três padrões de design (MVC, MVP e MVVM). Para que eu possa analisar o código e entender como se deve escrever um código para esses três padrões de design (MVC, MVP e MVVM).

Portanto, se existir algum artigo desse tipo que discuta como o código pareceria diferente para esses três padrões de design (MVC, MVP e MVVM), redirecione-me para esse artigo.

Thomas
fonte
14
No TechEd 2011, houve uma apresentação boa, porém simples, sobre esses três padrões. O palestrante fez e mostrou exemplos sobre o mesmo modelo de negócios usando C # e Visual Studio. Aqui está o vídeo no canal9 MVC, MVP e MVVM: Uma comparação de padrões arquiteturais
Marco Medrano
2
Aqui está o artigo: realm.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android . IMO muito bem escrito e claro. Ele também possui um repositório do Github com uma ramificação para cada padrão.
precisa saber é o seguinte
Este foi interessante: cirw.in/blog/time-to-move-on
Andrew

Respostas:

100

Algumas diferenças básicas podem ser escritas em resumo:

MVC:

MVC tradicional é onde existe uma

  1. Modelo: atua como o modelo para dados
  2. Ver: lida com a vista para o usuário, que pode ser a interface do usuário
  3. Controlador: controla a interação entre Model e View, em que view chama o controlador para atualizar o modelo. O View pode chamar vários controladores, se necessário.

MVP:

Semelhante ao MVC tradicional, mas o Controller é substituído pelo Presenter. Mas o apresentador, ao contrário do Controller, também é responsável por alterar a exibição. A exibição geralmente não chama o apresentador.

MVVM

A diferença aqui é a presença do View Model. É uma espécie de implementação do Observer Design Pattern, onde as mudanças no modelo também são representadas na exibição pela VM. Por exemplo: se um controle deslizante for alterado, não apenas o modelo será atualizado, mas também os dados que podem ser um texto, exibidos na visualização. Portanto, há uma ligação de dados bidirecional.

Pritam Banerjee
fonte
1
Pequenos detalhes - você pode escolher se é uma ligação de dados bidirecional ou também pode definir uma ligação unidirecional.
Jviaches
10
"A visão geralmente não chama o apresentador"? você pode explicar mais sobre essa frase? se a visualização da interface do usuário não ligar para o apresentador para quem?
Amir Ziarati
3
@AmirZiarati O apresentador fica de olho nos eventos. Em caso de eventos, o apresentador entra em ação e toma as ações necessárias.
Pritam Banerjee
sim, desde que tenha uma referência para visualizar. Eu entendi errado, eu pensei que você queria dizer vista nem precisa ligar para um apresentador inicialmente enquanto deveria pelo menos uma vez. Obrigado;)
Amir Ziarati
1
@PritamBanerjee, Pela explicação, o MVP e o MVVM quase têm a mesma funcionalidade. Atualização P ou VM tanto M & V
Manohar Reddy Poreddy
42

MVC, MVP, MVVM

MVC (antigo)

MVP (mais modular devido ao seu baixo acoplamento. O Presenter é um mediador entre o View e o Model)

MVVM (você já tem ligação bidirecional entre o componente VM e UI, por isso é mais automatizado que o MVP) insira a descrição da imagem aqui

Outra imagem: insira a descrição da imagem aqui

Uddhav Gautam
fonte
24
Por favor, não copie imagens - especialmente quando elas não concordam entre si. Veja o navegador MVC (o antigo que você não vê) fala para ver na imagem superior, mas fala com o controlador na imagem inferior.
Peter.fr
1
@UddhavGautam É um pouco confuso porque a primeira imagem mostra View como o ponto de entrada e a segunda mostra Controller.
everlasto
1
No primeiro diagrama, qual é a diferença entre MVVM e MVP? A meu ver, são apenas os links entre o V e o VM / P. Que em um caso tem as mensagens de ida e volta como um link bidirecional e no outro elas são representadas como dois links unidirecionais. Não vejo nenhuma diferença funcional entre eles. o que estou perdendo?
ICyberPaul 12/0118
1
Navegador significa o usuário de onde a interação acontece entre você e o aplicativo.
Uddhav Gautam
4
Reviravolta na trama: ninguém sabe realmente o que está acontecendo. Na verdade, são todos exatamente a mesma coisa. Haha Não, mas realmente, mesmo com essas imagens "úteis", é difícil processar o que diabos está acontecendo. Eu acho que isso faz parte do problema / confusão.
30719 Andrew
34

Grande explicação do link: http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

Vamos primeiro olhar para o MVC

A entrada é direcionada primeiro ao Controlador, não à visualização. Essa entrada pode ser proveniente de um usuário interagindo com uma página, mas também pode ser simplesmente inserindo um URL específico em um navegador. Em qualquer um dos casos, é um Controlador com interface para iniciar algumas funcionalidades.

Há um relacionamento muitos-para-um entre o Controller e a View. Isso ocorre porque um único controlador pode selecionar diferentes visualizações a serem renderizadas com base na operação que está sendo executada.

Há uma seta de sentido único do Controller para o View. Isso ocorre porque o View não tem nenhum conhecimento ou referência ao controlador.

O Controller repassa o Modelo, para que haja conhecimento entre a Visualização e o Modelo esperado que está sendo passado para ele, mas não o Controlador que o serve.

MVP - Model View Presenter

Agora vamos ver o padrão MVP. Parece muito semelhante ao MVC, exceto por algumas distinções importantes:

A entrada começa com a exibição, não o apresentador.

Há um mapeamento individual entre a View e o Presenter associado.

A exibição contém uma referência ao apresentador. O Apresentador também está reagindo aos eventos que estão sendo acionados a partir da Visualização, para que esteja ciente da Visualização à qual está associado.

O Apresentador atualiza a Visualização com base nas ações solicitadas que realiza no Modelo, mas a Visualização não reconhece o Modelo.

MVVM - Vista de modelo Vista de modelo

Portanto, com os padrões MVC e MVP à nossa frente, vejamos o padrão MVVM e vejamos quais diferenças ele possui:

A entrada começa com o View, não o View Model.

Enquanto o View mantém uma referência ao View Model, o View Model não possui informações sobre o View. É por isso que é possível ter um mapeamento de um para muitos entre várias vistas e um modelo de vista ... mesmo entre as tecnologias. Por exemplo, uma exibição WPF e uma exibição Silverlight poderiam compartilhar o mesmo modelo de exibição.

taha027
fonte
7
"Isso ocorre porque o View não tem conhecimento ou referência ao controlador" Isso não é verdade
Adam Wolski
O @AmirZiarati ViewModel não faz parte do MVP, mas do padrão MVVM.
315 Joe
Eu seria bom se você fornecer exemplos como onde poderíamos usar esses padrão
JKA
3

A imagem abaixo é do artigo escrito por Erwin van der Valk:

imagem explicando MVC, MVP e MVVM - por Erwin Vandervalk

O artigo explica as diferenças e fornece alguns exemplos de código em C #

Jboy Flaga
fonte
As imagens acima não são confusas, como no MVC, por que a VIEW acessa diretamente o Model? o mesmo para os outros?
smkrn110 21/04
Nestes diagramas, não está claro o significado das setas. A seta significa acesso ou manipulação? No diagrama MVC, não está claro por que não há seta iniciando no Model
Pontios