Concrete Logo
Hamburger button

Usando padrões Decorator e Builder em um APIClient

  • Blog
  • 2 de Novembro de 2018

Quase todos os aplicativos móveis precisam de conexão com a internet para fazer algo como atualizar as informações do usuário, verificar notícias, salvar dados e muito mais. Então podemos dizer que é uma parte importante do nosso aplicativo.

Eu costumo usar Alamofire para fazer esse trabalho e é uma boa prática isolar bibliotecas externas para que possamos alterá-las a qualquer momento e acredite que esta hora vai chegar. Podemos isolar uma biblioteca através de um protocolo. Então, vamos criar um simples APIClient que vai receber os parâmetros, headers e métodos para realizar um request.

Abaixo, você pode ver um exemplo deste APIClient:

Este APIClient faz um monte de coisas, como verificar se há conexão com a internet, lidar com um erro e fazer uma solicitação ao servidor. Ele pode fazer muito mais, como injetar headers personalizados em cada solicitação ou manipular um token inválido para atualizá-lo. Imagine o nosso APIClient fazendo todas essas coisas… ele vai ficar maior, confuso e bem dificíl de dar manutenção.

É comum encontrar uma classe que faz muitas coisas, fazendo mais coisas pelas quais é responsável. E isso vai contra o princípio da responsabilidade única do SOLID.

Assim, podemos usar o padrão Decorator para tornar nosso APIClient menor e mais específico.

O padrão Decorator é um padrão de design que permite que um comportamento seja adicionado a um objeto individual, dinamicamente, sem afetar o comportamento de outros objetos da mesma classe.

No exemplo acima, podemos quebrar nossas funções APIClient em três:

  • Verificar se há conexão com a Internet;
  • Lidar com erro;
  • Fazer a nossa solicitação.

Um Decorator deve ter uma referência para outro objeto do mesmo tipo e esse objeto vai ser ‘decorado’. O objetivo desses padrões é adicionar um comportamento a outro objeto sem a necessidade de modificar a sua classe.

Então podemos refatorá-lo em dois ‘decorators’: um para verificar se há conexão com a internet e o outro para lidar com os erros.

Depois disso, refatoramos o nosso APIClient para um RequestAPIClient:

Nosso último APIClient vai ser uma mistura de Decorators. Nosso ReachabilityAPIClient vai solicitar ao nosso ErrorHandlerAPIClient que, por sua vez, vai solicitar ao nosso RequestAPIClient. Quando o servidor retorna com uma resposta, primeiro ele vai ser manipulado pelo nosso RequestAPIClient depois pelo ErrorHandlerAPIClient e, finalmente, pelo nosso ReachabilityAPIClient.

A forma como construímos o nosso APIClient pode ser um pouco confusa e, facilmente, alguém pode cometer um erro e esquecer de usar um Decorator, por exemplo, esquecer de adicionar o comportamento de lidar com erros. Assim, podemos criar um builder para ajudar os nossos desenvolvedores a decidir qual comportamento eles vão adicionar ao objeto APIClient.

O Builder é um padrão de design projetado para fornecer uma solução flexível para vários problemas de criação de objetos, na programação orientada a objetos. A intenção do padrão de design do Builder é separar a construção de um objeto complexo de sua representação.

PS: Se você gostou deste post, compartilhe-o no Twitter, recomende-o no LinkedIn, ou ambos. =). Isso realmente me ajuda a alcançar mais pessoas. Muito obrigado.

A Concrete é uma empresa da Accenture especializada no desenvolvimento ágil de produtos digitais. No capítulo de iOS temos a oportunidade de viver em uma comunidade prática com dezenas de desenvolvedores iOS, trocando conhecimento e compartilhando informações técnicas e práticas. Além de desafiadores, os projetos têm acompanhamento próximo dos gerentes, que estão sempre buscando entender o momento de cada membro do capítulo, considerando seus próximos desafios e oportunidades de crescimento e visando a melhoria contínua e evolução de todos. Práticas ágeis, lean, visão de produto e engenharia sólida são pilares que serão incorporados desde o primeiro dia até se tornarem quase que uma segunda natureza. Quer fazer parte disso? Acesse: concrete.com.br/vagas