Se você é desenvolvedor JavaScript deve ter ficado surpreso com a notícia de que a tão amada biblioteca “Moment.js” não receberá mais atualizações. Com certeza a primeira coisa que você deve ter pensado é naquele seu projeto que está utilizando a biblioteca.
Porém isso não é uma novidade no mundo do desenvolvimento. Na realidade bibliotecas e frameworks vem e vão. Então como podemos lidar com bibliotecas e frameworks de terceiros na nossa aplicação?
Uma excelente opção é aplicando o design pattern Adapter.
O que o é Adapter?
Bom o nome “Adapter” é bastante sugestivo (adaptador em português). A ideia desse design pattern é fazer com que duas interfaces/classes diferentes consigam interagir entre si ou até mesmo substituir uma à outra sem causar um efeito colateral no seu código.Para isso, inserimos uma classe adaptadora que intermediará o retorno da nova ou velha interface para o código em produção. Podemos fazer uma comparação bem prática: os adaptadores de tomada. Quando você tem uma tomada que não é compatível com o cabo de força de seu eletrônico é necessário um “adaptador”. É exatamente o mesmo propósito da classe adapter que vamos inserir no nosso código.
Então voltemos ao exemplo do Moment.js que comentamos no início e vamos utilizar ocaso da depreciação da biblioteca. Tente imaginar quão problemático seria ter que instalar uma nova biblioteca e substituir todo o código legado deixado pelo Moment.js. Seria bom adaptador não é mesmo?! Nesse caso veremos na prática como podemos realizar isso.
Aplicando o design adapter
O exemplo que vamos utilizar pode parecer bem trivial. Porém o intuito é exatamente deixa-lo bem simples para assim ficar mais fácil de assimilarmos.
Suponhamos que na nossa aplicação existe uma classe que utilize o Moment.js para converter datas para o formato “dia-mês-ano”. Então a estrutura de nossa aplicação ficaria assim:
Moment.js: classe responsável por executar a conversão de data.
index.js: script para executar nossa função.
Vejamos como nosso código ficou:
Vamos então fazer a migração da biblioteca Moment.js. No nosso exemplo escolhemos a biblioteca date-fns.js para substitui-la. Poderíamos simplesmente reescrever a classe certo? Porém lembre que você está substituindo uma biblioteca. As probabilidades de dar alguma erro e precisarmos voltar para abiblioteca de legada são grandes. Então vamos aplicar o adapter! Começaremos escrevendo duas classes.
A primeira será nossa classe que também realizará a conversão de datas assim como a classeMoment.js: Vamos chamada de Data-fns.js.
Nessa classe temos dois métodos: parseISO e formatToDayMonthYear. ParseIso chama o método com o mesmo nome para transformar o input de string para formatoISO. Já a formatToDayMonthYear realiza a conversão propriamente dita.
Nossa segunda classe se chamará DataAdapter. Ela servirá de adaptador para nossa aplicação:
Nessa classe, nós criamos uma nova instância da classe DataFns dentro do constructor da classe DataAdapter.
Logo em seguida encapsulamos a chamada do nosso método de nossa nova instância em this.dataApi dentro do método formatToDayMonthYear.
Agora vamos modificar nosso index.js para “plugar” nossa classe adapter no nosso script:
Caso precise realizar o rollback e voltar a utilizar o Moment.js basta mudarmos a instância da nossa classe dentro da nossa classe adaptadora.
Conseguiu perceber a função de adaptador de nossa classe DataAdapter?!
Agora a nossa classe adapter será responsável por conectar qualquer mudança na nossa aplicação.
Nesse cenário escolhemos a modificação de uma biblioteca para mostrar como exemplo.Porém adotar esse design pattern desde o início de seu projeto para todas as bibliotecas externas pode lhe poupar muita dor de cabeça.
O código interno do nosso exemplo pode ser encontrado dentro deste repositório.
Caso se interesse mais sobre o assunto e queira se aprofundar recomendo esse artigo Adapter.
E aí, o que achou? Comente aqui qual o design pattern que você tem utilizado para acoplar as bibliotecas externas nos seus projetos.
Aproveite para conferir outros conteúdos como este guia sobre Conventional Commits Pattern!