Eliminando magic numbers no Nodejs
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.
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".
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)
Note que, mesmo usando const não conseguimos garantir que os valores dos atributos, ou até mesmo novos atributos, serão modificados.
Agora compare com o Object.freeze. Conseguimos 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.