Concrete | Desmistificando o MVC e MVP no Android
Ao longo dos anos tenho trabalhado em diversos projetos e muitas vezes entramos em debates com as equipes para decidir quais seriam as melhores práticas e padrões de projeto para um determinado software. Uma questão que sempre retorna nessas discussões é quais as diferenças entre o Model View Controller (MVC) e o Model View Presenter (MVP)?
Model View Controller (ou MVC)
MVC é um padrão de apresentação da interface do usuário que se concentra em separar a UI (View) de sua camada de negócios (Model). Para isso, o MVC define três componentes:
Diagrama do Model View Controller
– View: apresenta os elementos da UI;
– Controller: responde às ações da UI;
– Model: comportamentos de negócio e gerenciamento de estado.
Na maioria das implementações todos os três componentes podem interagir diretamente uns com os outros, e em algumas implementações o controlador é responsável por determinar qual visualização vai ser exibida.
Model View Presenter (ou MVP)
MVP também é um padrão de apresentação da interface do usuário e é considerado por muitos uma evolução dos conceitos do MVC. Ele separa as responsabilidades em quatro componentes:
Diagrama do Model View Presenter
– View: apresenta os elementos da UI.
– Presenter (Interface): define os eventos que o Presenter poderá responder. Serve unicamente para desacoplar a View do Presenter.
– Presenter: responde às ações da UI controlando a interação entre a View e o Model.
A interface do Presenter garante que seja fácil realizar testes na View. Em algumas implementações é criado um Supervising Controller, que tem como responsabilidade cuidar da recuperação e persistência do Model.
Diagrama do Model View Presenter com Supervising Controller
Para mais detalhes sobre MVP, veja (em inglês): aqui.
Na prática, não há muitas diferenças entre as duas propostas de apresentação. Ambas se concentram em separar as responsabilidades entre as camadas e incentivar o desacoplamento da UI (View) com a camada de negócios (Model). As principais diferenças entre elas são:
– Padrão MVC: o Controller é baseado em comportamentos e pode ser compartilhado entre múltiplas Views, com menor burocracia e rápido reaproveitamento.
– Padrão MVP: pela grande separação entre a View e o Presenter (graças à interface), garante testes mais fáceis. As interfaces são criadas com relacionamento de 1 para 1, ou seja: para cada View existirá um Presenter.
Conclusão: e no Android, qual usar?
No Android o MVP tem se tornado popular por sua facilidade em desacoplar a View do Presenter. Isso facilita nos Instrumentation Tests com a View e nos <>Unit Tests com o Presenter. Apesar disso, o MVC pode ser muito útil no Android quando se tem o desejo de diminuir a burocracia entre as camadas (retirando uma camada de Interface).
Para mais detalhes sobre Instrumentation Test, veja (em inglês): aqui.
Para mais detalhes sobre Unit Test, veja (em inglês): aqui.
Conforme entendidas as diferenças e realizados meus experimentos, o MVC se mostrou melhor para projetos menores nos quais é possível trabalhar com uma burocracia de comunicação menor, reaproveitar rapidamente os comportamentos dos Controllers entre múltiplas Views e ainda ter uma boa separação para a manutenção. Para projetos maiores o MVP é a solução ideal: seu desacoplamento entre a View e o Presenter, pela utilização de uma interface, ajuda na criação de testes e permite uma evolução estrutural e de apresentação do aplicativo sem traumas maiores.
Espero que este post tenha sido útil e que tenha ajudado a esclarecer as diferenças entre o MVC e MVP. É importante ter em mente que eles não são "balas de prata" e você sempre deve usar como um guia, mas modificar sua implementação de acordo com as suas regras de negócio. Ficou alguma dúvida ou tem algo a dizer? Aproveite os campos abaixo!