Arquitetura limpa nas apps: utilizando VIPER no Android

Diogo Cabral
Jun 13 · 10 min read
tipo de cobra conhecida como Viper

A importância de uma arquitetura adequada

Quando eu fui montar uma palestra para falar sobre arquitetura de código nas aplicações móveis, pensei em uma maneira de como ilustrar a importância de utilizá-las no nosso dia a dia, como uma coisa necessária e não apenas uma firula para aplicarmos no tempo livre.

exemplo de código de activity sem responsabilidade única
  • Como você testaria este código de maneira simples e clara?
  • Você teria coragem de mexer neste código para adicionar uma nova funcionalidade ao projeto?

As arquiteturas famosas e suas limitações

Antes de mais nada, acredito que vale a pena nós passarmos um pouco por algumas das arquiteturas conhecidas, que já foram bastante utilizadas ou estão mais em alta atualmente. Isso vai servir para entender bem o seu propósito e os pontos onde elas poderiam ser melhores, pensando sempre no mundo do desenvolvimento mobile.

MVC

Ilustração de como funciona a arquitetura MVC

MVP

Ilustração de como funciona a arquitetura MVP

MVVM

Ilustração de como funciona a arquitetura MVVM

Onde poderíamos aplicar melhorias?

As três arquiteturas citadas tem uma característica muito similar: possuir apenas uma camada de regras de negócio. E o que isso implica? Bem, em determinadas construções de projeto, podemos ter tanto o Controller, Presenter e View-Model inflados, com muita lógica e sem responsabilidade única (como por exemplo utilização de chamada a banco de dados, API externa, routers, tudo em uma mesma classe).


Clean Architecture ao resgate

Quando nos deparamos com um cenário onde notamos que temos modelos inflados e com muita responsabilidade, o mais natural a pensar é que precisamos realizar algum ajuste na construção do nosso projeto. Uma das alternativas aplicáveis neste contexto seria o Clean Architecture, que prega segundo suas regras que a arquitetura precisa ser:

  • Independente de frameworks
  • Independete de interface do usuário
  • Independete de banco de dados
  • Independete de qualquer agente externo
Dependências entre as camadas do Clean Architecture
  • Domain Layer: é a camada mais interna, que não depende de nenhuma outra camada. Ela contem entidades, casos de uso (regras de negócios) e interfaces para os repositórios. Os casos de uso combinam dados de uma ou mais interfaces de repositórios.
  • Data Layer: contém a implementação dos repositórios e uma ou mais fontes de dados. Tais repositórios são responsáveis por coordenar as mais diferentes fontes de dados existentes no projeto. Essa camada também depende do Domain Layer.

VIPER: Onde surgiu, o que faz, do que se alimenta?

Antes de falar da plataforma do nosso querido robozinho, vamos ter que voltar um pouco e contar como o VIPER chegou até ele, pois no início essa história mais tem haver com o iOS do que com o Android.

Ilustração de como funciona a arquitetura VIPER

Pontos fortes e pontos fracos

Antes de passarmos para o exemplo, acredito que vale a pena citarmos e entendermos o que o VIPER tem de nos oferecer de melhor e as suas fraquezas.

Pontos fortes

  • Possibilidade de reuso de módulos e sub-módulos
  • Maior facilidade em pensar em divisão de tarefas dentro de uma equipe com uma maior quantidade de pessoas
  • Impacto minimizado em mudanças realizadas no código
  • Separação do código em camadas com responsabilidades únicas
  • Maior facilidade para estruturar os testes

Pontos fracos

  • Necessidade de mais escrita de código (mais boilerplate)
  • Curva de aprendizado mais íngreme, pois a quantidade de conteúdos disponíveis em relação a essa arquitetura é menor em comparação a outras.

Um exemplo prático

Mostrando como de fato funcionaria a aplicação de uma arquitetura com estes conceitos explicados na plataforma Android, abaixo temos uma sequência de códigos de cada camada, ilustrando o que foi mostrado acima sobre cada uma delas.

As duas telas da aplicação de exemplo
Código da View da aplicação
Código do Presenter da aplicação
Código do Router da aplicação
Código do Interactor da aplicação
Código do Service da aplicação
Código de uma das entidades da aplicação

Conclusão: e a melhor arquitetura é…

Antes de eu precisar me explicar ou começar a receber uma chuva de pedras, já adianto que o essencial de entender depois de ler e aprender sobre qualquer nova tecnologia, framework, arquitetura, etc, é saber o seu propósito, pois cada uma pode ter um diferencial que se enquadre melhor em determinados contextos.

Android Dev BR

Artigos em português sobre Android, curados pela comunidade Android Dev BR. Junte-se a nós: slack.androiddevbr.org.

Thanks to Ana Coimbra.

Diogo Cabral

Written by

Apaixonado por tecnologia, curioso sobre novidades da área do desenvolvimento mobile e front-end. Atualmente consultor de desenvolvimento mobile @ThoughtWorks

Android Dev BR

Artigos em português sobre Android, curados pela comunidade Android Dev BR. Junte-se a nós: slack.androiddevbr.org.