Porque decidimos usar o VIPER na XP Inc.

Julio Fernandes
Comunidade XP

--

App XP Investimentos

Quando entrei na XP em 2018, tínhamos como objetivo estruturar uma área de mobile do zero. Tínhamos o sonho grande de ser o maior aplicativo de investimentos do Brasil, e para tornar esse sonho realidade, era necessário pensar em uma arquitetura robusta e escalável, que pudesse suportar nosso crescimento e no futuro permitir que fosse possível modularizar e continuar com um desenvolvimento mais eficiente em nosso app

Na mesma época, muitos desenvolvedores que faziam parte da comunidade do iOS, mais conhecida como Cocoaheads, a cada evento realizado tinha alguma talk falando sobre arquitetura de software e VIPER, foi ai então que decidimos estudar ela mais a fundo.

VIPER, para quem não sabe, é uma abordagem para desenvolvimento de aplicação com base na arquitetura limpa (a Clean Architecture) especialmente para o iOS. A Clean Architecture, de forma bem resumida, divide nosso software em camadas. Seu objetivo é separar a estrutura de lógica da aplicação em diversos caminhos de responsabilidade.

VIPER

De uma forma mais resumida, podemos destacar cada área da seguinte forma:

View: responsável por receber as entradas do usuário e redirecionar a quem sabe de fato lidar com ela, o seu Presenter. A View conceitualmente conhece seu único Presenter.

Presenter: o Presenter não sabe lidar com todo tipo de requisições. Algumas ele de fato vai dar conta de processar por si só, mas outras ele apenas sabe a quem enviar a depender do comando recebido. Essa camada tem conhecimento de quem é sua View, pois ele precisa atualizá-la. Essa camada também conhece a camada de Router e Interactor.

Router: é responsável por manter as funções de trocas de telas e troca de dados entre elas.

Interactor: é a camada responsável por fazer chamadas a fontes de dados, como banco de dados ou API externas. Essa camada conhece a Entity e faz uso da mesma para montar a resposta das requisições.

Entity: camada que contém a estrutura dos dados a ser utilizado na aplicação.

É interessante observar que aqui existe uma liberdade para escolher a forma de isolamento entre as camadas, que pode ser feita sem maiores dificuldades através de protocolos ou observer, porem na XP optamos por usar protocolos

Porem nem tudo são flores, e nenhuma arquitetura pode ser usada como bala de prata, então, mesmo entendendo melhor como o VIPER funciona, buscamos ver suas limitações e benefícios que eram mais comentados na época.

Pontos fracos

  • Necessidade de escrever mais código (muito boilerplate)
  • Curva de aprendizado média para alta, até aquela época não tinha muito material, e cada material trazia alguma visão um pouco diferente.

Pontos fortes

  • Possibilidade de reuso
  • Maior facilidade para testes unitários
  • Separação de código em camadas, com single responsibility
Quebra cabeça, visão de responsabilidade única

Hoje, quatro anos depois, com dezenas de desenvolvedores, seguimos firme nessa arquitetura, trazendo pequenas melhorias para o nosso dia a dia. Além das camadas citadas acima, hoje utilizamos:

  • Configurator que fica com a responsabilidade de fazer o setup do nosso módulo, e cuidar de toda injeção de dependência necessária.
  • EventTracker, dados fazem parte do nosso dia a dia, então tínhamos que ter uma forma clara de manipular e enviar qualquer interação do usuário.

Caso, você tenha ficado interessado em nosso template, da uma conferida no meu GitHub, vou deixar um exemplo prático, e de quebra um script de instalação para o Xcode.

Quer se juntar ao nosso time? Estamos contratando

--

--