Eliminando magic numbers no Nodejs

Eliminando magic numbers no Nodejs
Photo by Pawel Czerwinski / Unsplash

Nesse artigo vou mostrar como evitar magic numbers usando enums no Nodejs de um jeito bem bacanoso.

Mas o que são Magic Numbers?

Magic numbers (ou magic strings) são números ou textos "perdidos" no meio do código, simples assim. Você tá lá lendo um trecho de código e de repente ele aparece, um número mágico no meio do código. Nesse momento ou você ignora aquele número e segue a leitura (debug mental) ou você saí em busca do último elo perdido pra entender qual seu significado. Ambos os casos são ruins e o Refactor Guru explica em detalhes o problema e uma solução.

Surge os Enums

Nesse momento imagino que você não tenha lido a página do Refactor Guru... E tá aí a sacada! Você sabe que naquele link tem mais detalhes sobre alguma coisa, mas não precisa entende-la profundamente agora. Eu também não coloquei o endereço da página, isso iria atrapalhar sua leitura. Fantástico, não?! É exatamente essa a ideia dos enums.

Cenário real, realístico, verídico de verdade

Vamos aplicar o conceito de enums em um caso real (essa frase dá um impacto/hype a mais). O projeto mflix do curso da Mongo University. Basicamente é um projeto com Nodejs, Express e React. Vamos focar nossa atenção para os controllers, por exemplo comments.controller

Nesse controller (e em todos os outros) podemos ver magic numbers espalhados, sem entrar na discussão de que esses números carregam um significado do contexto do controllers, podemos melhorar as coisas aplicando enums para os status code.

Não foi fornecido texto alternativo para esta imagem

A ideia é tão bacana que existe (pra variar) um pacote no npm: pacote_nem_tao_necessario

Aplicando Enums

Minha sugestão é criar um novo diretório chamado enums, nele iremos salvar os enums pertinentes a camada. Criamos, por exemplo, um arquivo http.js, outra sugestão é chamar o arquivo EHTTP.js, porém existem críticas quanto ao uso do prefixo "E".

Exemplo de enums:  const httpStatusCode = Object.freeze({ BAD_REQUEST: 400 })

Por que usar Object.freeze?

Simples, para garantir a imutabilidade dos enums! "Mas e o const?" Você, caro leitor incrédulo durante o expediente, questiona! A resposta é simples, o const não é tão constante assim. Acompanhe comigo e faça exemplo em qualquer ambiente javascript (se estiver no Chrome pode fazer no console do devtools)

Alterando valores de atributos mesmo sendo const

Note que, mesmo usando const não conseguimos garantir que os valores dos atributos, ou até mesmo novos atributos, serão modificados.

Imagem com exemplo de uso do Object.freeze   cons person = Object.freeze({name: "Le"})

Agora compare com o Object.freezeConseguimos garantir a imutabilidade tanto dos valores quanto para novos atributos. E o melhor, o javascript ignora completamente as tentativas sorrateiras de alterações.

Cada assunto abordado aqui tem suas ramificações e desdobramentos em vários cenários, mas por enquanto é isso.

Esse artigo foi publicado em 2020 no Linkedin.