Padrão Facade — Como ele pode te ajudar a estruturar melhor seu código

Iago Machado
3 min readJan 20, 2024

--

Pense no cenário de uma aplicação que agenda eventos. Nesta aplicação é necessário em diversos momentos trabalhar com datas: Cadastrar um evento em um fuso específico, fazer comparativo de quantos dias faltam para algum evento e entre outros cenários possíveis em uma aplicação dessa categoria.

Particularmente eu costumo usar alguma biblioteca que trabalhe com datas (por mais que já tenhamos hoje Intl), para me facilitar na manipulação desses valores. Date Fns, Luxon, Day.js e até mesmo o Moment (hoje depreciado) são uma das opções de mercado que nos ajudam a abstrair um pouco a complexidade de manipular valores do tipo data.

Problema

Quando utilizamos essas biblotecas terceiras diretamente em nossas classes de implementação, pode ser tornar um grande problema visto que:

  • Você facilmente terá diversos trechos dessa biblioteca espalhadas por todo código gerando um grande acoplamento.
  • Dificuldade refatoração, pois caso você queira trabalhar com outra biblioteca terá que alterar todos os pontos que chamam ela na aplicação.
  • Quanto maior o acoplamento maior o risco da sua aplicação acabar se tornando legada se não tiver uma maturidade na atualização das bibliotecas utilizadas.

Solução

Como o nome mesmo já diz, Facade (ou Fachada) é uma classe que irá fornecer uma interface simplificada para uma implementação mais complexa, garantindo uma intermediação entre as duas. Ela também garante que nos preocupemos somente com o que de fato nosso código precisa, sem se preocupar com recursos adicionais que funcionalidades terceiras possam a vir a trazer.

Em cenários práticos é muito comum o seu uso quando precisamos centralizar em um único ponto todas as implementações de uma biblioteca por exemplo. Como no caso acima, caso optemos por utilizar alguma a Date-Fns para trabalhar com datas, podemos facilmente criar uma inteface que irá abstrair toda a complexidade da biblioteca e focando somente no que importa para trabalharmos a nível de aplicação. Isso faz com que o nosso ponto focal seja único, facilitando o desacomplemento com a biblioteca.

Ao invés de ter várias chamadas da biblioteca em meu código eu encapsulo tudo em uma única classe que será responsável por lidar com esta biblioteca.

Implementação

Considerações sobre seu uso

Temos que ter muita cautela quanto ao uso de Facade porque facilmente uma classe fachada pode ser tornar um objeto deus acomplando todas as funcionalidades em um único lugar e gerando problemas de reuso e de segregação de responsabilidades.

Também importante falar que um Facade não é um Adapter. O Facade tem como característica englobar um subsistema inteiro de objetos, enquanto um Adapter envolve apenas um objeto.

Um Facade também não é um Proxy, visto que com Proxy tem interface igual ao seu objeto de serviço o que o torna intermutável.

Conclusão

Para cenários que utilizamos bastante subsistemas dentro da aplicação o Facade se torna uma ótima alternativa, por sua capacidade de intermediar a aplicação com lógicas mais complexas.

Espero ter contribuído pessoal até mais !

--

--