Skip to main content

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.

Design adapter

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!

Leave a Reply