O Padrão MVP (Passive View) em contraste com MVC

by Cinta Vidal Agullo / from beautifuldecay.com

    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.

MVP Diagram

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.

 mvp-fast-food-1

    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.

Anúncios

8 comentários em “O Padrão MVP (Passive View) em contraste com MVC

    1. 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

      Curtir

  1. 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!

    Curtido por 1 pessoa

    1. 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!

      Curtir

    1. 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!

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s