Magic Numbers, String Literals e Concatenação Composta

Olá, leitores, tudo certo?
Já ouviram falar em “mágica” na programação? Embora seja um termo que nos lembre algo positivo, na realidade, é um equívoco que desenvolvedores cometem no código, principalmente quando o projeto é colaborativo. A ideia desse artigo é detalhar um pouco mais sobre Magic Numbers e String Literals e, claro, apresentar sugestões para evitá-los!

Definição

Leitores, as dicas presentes neste artigo são básicas, mas contribuem para um código com mais qualidade e profissionalismo, afinal, é isso que almejamos em nossos projetos.

Magic Numbers e String Literals são, respectivamente, números e textos escritos diretamente no código, dificultando duas atividades: interpretação e manutenção. Considere o código abaixo:

É difícil compreender o que este método retorna. O que significa o número 5? E o número 3 no cálculo do frete? É uma porcentagem? Um tipo de frete? Um valor fixo? Observe que, apesar de simples, o código se torna desnecessariamente complexo. Esse é o problema da interpretação.

A complexidade aumenta um pouco mais quando este mesmo número é utilizado em diferentes partes do sistema:

Essa repetição significa que, caso o valor do tipo da embalagem seja alterado de 5 para 6, todos as ocorrências no código terão de ser modificadas. O que aconteceria se o desenvolvedor esquecesse de alterar um desses locais? Pare um pouco e reflita! 🙂

Evitando Magic Numbers

Magic Numbers podem ser evitados ao serem substituídos por constantes.
Pois bem, sabe o que significa o número 5? Embalagem de madeira, meu amigo! Como adivinharíamos?
Sendo assim, podemos melhorar o código criando duas constantes, transmitindo claramente a finalidade destes números:

Agora, veja a diferença no código:

É outro nível de codificação, concorda? 😉

Quando estudei sobre Magic Numbers, encontrei um desenvolvedor contestando sobre o uso de constantes no Stack Overflow:

“Eu diria que o código fica menos legível com constantes. Por que eu criaria uma constante para um número que não irá mudar? Isso apenas deixa o código mais poluído.”

Seriously??
Pessoal, isso não é nem questão de opinião. É profissionalismo. Eu, particularmente, já perdi muito tempo buscando o significado de Magic Numbers “enterrados” no código, algumas vezes desconhecidos até pelos Analistas de Sistemas. Se constantes fossem utilizadas, estaríamos livres pelo menos desse horror.

Evitando String Literals

O mesmo acontece com as String Literals. Ao utilizar letras em comparações ou atribuições, por exemplo, nos deparamos com as mesmas dificuldades dos números:

Você acha que “A” significa “Ativo”? Não, é “Em Atraso”, meu caro! Imagine se utilizássemos o “A” para isentar o cliente de algumas taxas, julgando que ele estivesse ativo? Prefiro nem pensar…

Novamente, poderíamos criar constantes como solução:

Ah, antes que eu me esqueça, adquira também o hábito de converter o valor de origem para maiúsculo antes de compará-los, evitando um retorno falso em função do Case Sensitivity:

Concatenção composta

Esse termo representa a utilização de vários “+” consecutivos para concatenar um texto, como, por exemplo, uma instrução SQL. Porém, esse excesso de concatenações também pode dificultar a interpretação da linha de código. Quer ver?

A leitura torna-se desconfortável, não é? Além disso, no editor de códigos, será necessário mover a barra de rolagem horizontal até o fim da linha para analisar a instrução por completo. É por isso que algumas IDEs de desenvolvimento exibem uma margem do lado direito do editor de código, com o intuito de impedir que o desenvolvedor escreva linhas extensas.

A grande maioria (ou todas) das linguagens de programação trazem vários recursos para evitar a concatenação composta. No código acima, exemplificado em Delphi, poderíamos separar as partes da instrução SQL com o comando Add da Query:

Embora uma única linha se transforme em várias, a interpretação do código fica bem mais nítida.
Porém, em alguns casos, o caracter “+” é a única alternativa para concatenar um texto, como a montagem de um filtro de consulta composta. Mesmo assim, ainda podemos dividir as concatenações em linhas:

Para mensagens, a concatenação fica ainda mais fácil. O Delphi disponibiliza o comando Format para gerar uma string substituindo parâmetros por valores:

Moleza, né?

Surgiu alguma dúvida sobre os tópicos do artigo? Gostaria de complementar algo? Deixe um comentário! 🙂
Hoje fico por aqui, pessoal. Obrigado e até a próxima!


André Celestino