No desenvolvimento de software, uma das maiores dificuldades é manter a interface do usuário (UI) desacoplada da lógica de negócios. Quando esses dois aspectos estão misturados, o código pode se tornar difícil de manter, testar e evoluir. Para resolver esse problema, Martin Fowler propôs o padrão Passive View, que promove uma separação clara entre a lógica de apresentação e a interface do usuário.

Neste post, vamos explorar o que é o Passive View, porque ele foi criado, como implementá-lo e quais são os benefícios de usá-lo em seus projetos. Bora lá?!
O que é Passive View?
O Passive View é um padrão de design pertencente à família Model-View-Presenter (MVP). Ele foi criado para reduzir o acoplamento entre a interface do usuário (UI) e a lógica de negócios. A ideia central é que a View (interface) seja o mais "burra" possível, ou seja, não contenha nenhuma lógica de negócios ou de apresentação. Toda a lógica é delegada a um Presenter, que atua como intermediário entre a View e o Model (camada de dados).
Características principais:
View passiva: A View apenas exibe dados e repassa interações do usuário para o Presenter.
Presenter ativo: O Presenter contém toda a lógica de apresentação e coordena a interação entre a View e o Model.
Separação clara: A View não conhece o Model, e o Model não conhece a View.
Problemas de não usar o Passive View
Quando não utilizamos o Passive View (ou padrões semelhantes, como MVP ou MVVM), alguns problemas comuns podem surgir:
1. Acoplamento excessivo
Problema: A lógica de negócios e a interface do usuário ficam misturadas no mesmo componente (por exemplo, em uma Activity no Android ou um ViewController no iOS).
Consequência: Alterações na interface podem exigir mudanças na lógica de negócios e vice-versa, tornando o código frágil e difícil de manter.
Exemplo: Em uma tela de login, a validação das credenciais pode estar diretamente no código da Activity, misturada com a lógica de exibição de erros e carregamento.
2. Dificuldade de teste
Problema: Interfaces com lógica embutida são difíceis de testar de forma isolada.
Consequência: Testes automatizados se tornam complexos e frágeis, pois é difícil simular interações do usuário e verificar o comportamento da lógica de negócios.
Exemplo: Se a validação de um formulário está diretamente na View, você precisará criar testes de UI, que são mais lentos e menos confiáveis do que testes unitários.
3. Falta de reutilização
Problema: A lógica de apresentação está acoplada à interface, dificultando sua reutilização em diferentes telas ou plataformas.
Consequência: Caso seja necessário utilizar a mesma lógica em outra tela, será preciso duplicar o código ou criar soluções improvisadas.
Exemplo: Uma lógica de paginação de dados pode estar diretamente em uma RecyclerView no Android, impossibilitando sua reutilização em uma UITableView no iOS.
4. Complexidade crescente
Problema: À medida que o projeto cresce, a mistura de lógica e interface torna o código cada vez mais complexo e difícil de entender.
Consequência: Novos desenvolvedores terão dificuldade para compreender o código, e a manutenção se tornará um pesadelo.
Exemplo: Uma Activity com centenas de linhas de código, misturando lógica de negócios, chamadas de API, manipulação de UI e navegação.
5. Dificuldade de evolução
Problema: Alterações na interface ou na lógica de negócios podem gerar efeitos colaterais imprevisíveis.
Consequência: O custo de implementar novas funcionalidades ou corrigir bugs aumenta significativamente.
Exemplo: Alterar o layout de uma tela pode quebrar a lógica de negócios embutida na View.
Como o Passive View resolve esses problemas?
O Passive View aborda esses problemas promovendo uma separação clara de responsabilidades:
- Separação de responsabilidades:
- A View é responsável apenas pela interface.
- O Presenter cuida da lógica de apresentação.
- O Model gerencia os dados e a lógica de negócios.
- Facilidade de teste:
- A View pode ser testada isoladamente, verificando apenas a exibição de dados e a captura de interações.
- O Presenter pode ser testado de forma unitária, sem depender da UI.
- Reutilização:
- A mesma lógica de apresentação pode ser usada em diferentes Views.
- O Presenter pode ser reutilizado em diferentes plataformas (Android, iOS, etc.).
- Manutenção simplificada:
- Alterações na interface não afetam a lógica de negócios.
- Alterações na lógica de negócios não afetam a interface.
- Evolução facilitada:
- Novas funcionalidades podem ser adicionadas sem impactar o código existente.
- Bugs podem ser corrigidos de forma isolada, sem risco de efeitos colaterais.
E é isso…
O Passive View é uma abordagem poderosa para quem busca desenvolver interfaces de usuário desacopladas da lógica de negócios. Ele resolve problemas comuns como acoplamento excessivo, dificuldade de teste e falta de reutilização, promovendo um código mais limpo, testável e fácil de manter.
Se você está enfrentando esses desafios em seus projetos, considere adotar o Passive View. Essa pode ser a chave para simplificar seu desenvolvimento e melhorar a qualidade do seu código.
