
MVP é um acrônimo para Model-View-Presenter. O Model no MVP é como no MVC, é a camada que trata das regras de negócios, a View também segue o mesmo papel que possui no MVC, que é lidar com a interface do usuário, e o Presenter pode ser visto como a camada Controller do MVC, tendo o papel de ligar e lidar com o Model e a View. A semelhança não é mera coisncidência, já que é um modelo baseado no MVC.
A primeira vista é dificil identificar a diferença entre o MVC e o MVP e de entender assim o porque de usar o MVP no Android. Os dois modelos possuem as mesmas 3 camadas, apenas 1 camada em comum que possui nome diferente, mas todas possuem os mesmos papéis básicos em seus modelos.
Não vamos entender o modelo até o vermos em ação, com suas camadas interagindo segundo seus papéis. Abaixo segue um diagrama que demonstra o MVP.
Uma boa maneira de se entender a interação entre as camadas no MVP é imaginarmos a compra de um lanche em um fast-food qualquer. Nesse cenário teremos 3 elementos para analisarmos, você representando a View, o funcionário do estabelescimento representando o Presenter, e o caixa representando a camada Model. Você geralmente se encaminha e faz seu pedido ao funcionário do estabelescimento, o funcionário irá fazer uso da máquina, que exibirá ao funcionário com o valor a ser pago. Ao ler o valor na máquina o funcionário irá lhe avisar o quanto deve ser pago para que você possa pegar o lanche.
Veja que nesse primeiro processo, transferindo agora a situação para o nosso padrão, temos a View solicitando algo ao Presente que vai ao Model e o informa da solicitação. Ao obter uma resposta do Model, o Presenter é responsável para encaminhar esse resultado a View. E assim se interagem as camadas do MVP, como em uma compra de um lanche em um fast-food.
Continuando a cena, você, após ouvir o valor a ser pago, irá entregar ao funcionário a quantia dita em dinheiro. O funcionário irá pegar o dinheiro, voltar a máquina, colocar esse dinheiro e concluir a operação. A máquina responderá ao ato do funcionario com a nota fiscal da compra, que o funcionário irá pegar e transferir a você.
Veja que esse segundo processo transferido para nosso padrão de projeto irá ser semalhante ao primeiro. A View, você, transfere dados, o dinheiro, ao Presenter, o funcionário, que irá encaminhar ao Model, a máquina, e aguardar a resposta. Quando houve uma resposta do Model, o Presenter encaminhará para a View o resultado, a nota fiscal.
Tendo em mente esses dois semelhantes casos podemos partir para a comparação entre os dois modelos explicados. Como já dito, superficialmente olhando os dois padrões se equivalem em número de camadas e em seus papéis básicos. O primeiro ponto que podemos contrastar é o entry-point dos dois modelos, que dará inicio aos nossos tópicos que listam o que os diferencia.
Como importante aspecto para que uma arquitetura seja chamada de MVC temos o já explicado entry-point, que obrigatóriamente deve ser o Controller. Ou seja, a primeira das três camadas que uma solicitação deve ter contato é o Controller. Enquanto isso temos no MVP uma camada diferente que assume o papel de entry-point, a View.
Como estudado no caso do fast-food, o cliente, personagem representante da camada View, é que o primeiro a atuar ao captar o evento de desejo de comprar um lanche e encaminhar isso ao Funcionário do balcão, representante da camada Presenter.
Então temos que nossa primeira diferença entre os dois padrões. O entry-point em cada padrão é assumido por camadas diferentes.
Seguindo com nossas diferenças, no MVP, toda e qualquer interação com a camada Model sempre partirá da camada Presenter, e o Model sempre responderá apenas ao Presenter. A camada View no MVP jamais tem interação com a camada Model, o que é diferente do MVC, onde o Controller pode interagir com a Model e a Model pode atualizar a View. Então, no MVP, a camada View é então desacoplada do Model e é atualizada ou manipulada unicamente pelo Presenter, o que marca uma nova diferença entre os dois modelos.
E para finalizar, temos a passividade da View nessa variação do MVP, equanto a View no MVC pode ser contrastada como ativa. O que isso quer dizer é que a View no MVP (Passive View) é possui praticamente zero de lógica, delegando todos os a fazeres ao Presenter, sendo o seu papel apenas de encaminhar o evento dos usuários a camada Presenter e aguardar que os dados sejam populados. Enquanto isso, no MVC, a View possui papéis lógicos e tem ações para com o Model.
Excelentes posts sobre MVC e MVP Tássio!
Tanto em inglês quando em português, não encontrava material tão rico em detalhes quanto estes seus.
Parabéns!
CurtirCurtido por 1 pessoa
Olá, Gustavo!
Muito obrigado pelo seu comentário e elogios! =D
Pretendo escrever um post mais formal sobre isso, por enquanto escrevi mais como diário de estudo mas fico muito feliz em ter sido útil! Tive muita dificuldades também de encontrar material que mostre diferenças entre MVC e MVP. Depois de muito tempo colhendo retalhos em livros e posts que cheguei a esse 3 pontos: Entry-point diferentes, View passiva no MVP (Passive View) e sempre ativa no MVC e, por fim, a comunicação entre View e Model que não existe no MVP mas que ocorre em alguns MVCs.
Não sei se tem interesse em MVP para o Android, mas eu tenho um app beeem simples em código aberto que fiz usando MVP. Esse app eu desenvolvi como tarefa pra Nanodegree em Desenvolvimento Android da Udacity. De repente, pode ser válido de alguma maneira: https://github.com/tassioauad/SpotifyStreamer
CurtirCurtir
Olá Tassio! Realmente, muito bom o seu artigo. O exemplo do fast food realmente foi muito bom. Clareou as minhas idéias aqui. Eu também estou procurando referências sobre o assunto, mas não achava nada de concreto. E obrigado também por disponibilizar esse exemplo no git. Vou dar uma olhada nele. Vai ajudar muito. Abraços!
CurtirCurtido por 1 pessoa
Olá, Ricardo! Fico muito satisfeito em ver um post meu clareando meus colegas! Eu preciso realmente fazer um post mais formal a respeito desse assunto, muitos estão começando a procurar sobre MVP e seria bom ajudar. Qualquer coisa podemos bater um papo para trocarmos informações, me adicione no hangout ou se quiser podemos nos falar via email: auadtassio@gmail.com. Estou começando um outro projeto em MVP, pode ficar também como auxílio: https://github.com/tassioauad/Game-Catalog . Abraços!
CurtirCurtir
Muito bom! Obrigado ajudou muito esclarecendo minha duvidas sobre a diferença entre um e outro e a implementação no Android.
P.S. Ali na segunda linha do artigo me parece que faltou a palavra “Model”.
Abraços.
CurtirCurtido por 1 pessoa
Eu que agradeço, Marcus Eduardo! Obrigado pela visita no blog e pelo feedback! Tenho uns projetos Android no GitHub que podem te ajudar um pouco mais. Além do Game Check que havia indicado em resposta ao comentário anterior desse post, tenho agora o Coach Tracker e o Movie Check. Todos eles implementam o MVP, dê uma conferida!
CurtirCurtir
Eu gostei bastante, ótima explicação. Estou lendo sobre esse conteúdo tem vários dias porém o seu está ótimo!
CurtirCurtido por 1 pessoa
Muito obrigado, jsiajsia! Fico realmente muito feliz em ver que estou podendo ajudar a muitos na busca pelo conhecimento, pois sei o quanto essa jornada é difícil! Muito li e também durante vários dias para poder “concatenar” ideias. Eu agradeço muito ter dedicado seu tempo a um comentário no meu blog, isso me estimula muito! Obrigado e obrigado!
CurtirCurtir
Parabéns pela objetividade! Não havia encontrado nenhum artigo nem vídeo que fizesse uma explicação objetiva das diferenças. Além disso o toque lúdico (abstração) facilitou muito a compreensão para aqueles que não conhecem os padrões isoladamente. Grato!
CurtirCurtir