Substituindo if/else por HashTable em JavaScript
O uso excessivo de estruturas condicionais como if/else
pode deixar o código mais verboso, difícil de manter e menos performático. Uma alternativa elegante e eficiente é o uso de HashTables (ou objetos/dicionários em JavaScript). Neste artigo, vamos explorar como substituir múltiplos if/else
por uma abordagem mais limpa e escalável.
O problema com múltiplos if/else
Imagine que você tenha um sistema que precisa executar diferentes ações com base em um comando recebido. Uma implementação comum seria:
function executarAcao(comando) { if (comando === "start") { console.log("Iniciando..."); } else if (comando === "stop") { console.log("Parando..."); } else if (comando === "pause") { console.log("Pausando..."); } else { console.log("Comando inválido."); } } executarAcao("start"); // Iniciando...
Este código funciona, mas conforme o número de comandos aumenta, a estrutura fica difícil de ler e manter. Além disso, esse modelo pode impactar negativamente a performance, pois cada condição precisa ser verificada sequencialmente.
Alternativa: HashTable (ou objeto em JavaScript)
Uma forma mais eficiente de lidar com esse problema é utilizar um objeto como uma estrutura de mapeamento (HashTable). Veja como podemos refatorar o código acima:
const acoes = { start: () => console.log("Iniciando..."), stop: () => console.log("Parando..."), pause: () => console.log("Pausando..."), default: () => console.log("Comando inválido."), }; function executarAcao(comando) { (acoes[comando] || acoes.default)(); } executarAcao("start"); // Iniciando...
Vantagens desta abordagem:
- Legibilidade: O código fica mais limpo e intuitivo.
- Facilidade de manutenção: Adicionar um novo comando requer apenas uma nova entrada no objeto, sem precisar modificar uma longa cadeia de
if/else
. - Melhor desempenho: O acesso a propriedades em um objeto é otimizado, enquanto múltiplos
if/else
podem levar a verificações desnecessárias.
Aplicação prática
Suponha que você esteja lidando com um sistema de notificações e precise exibir mensagens diferentes com base no tipo de notificação:
const notificacoes = { sucesso: () => console.log("Operação concluída com sucesso!"), erro: () => console.log("Ocorreu um erro."), aviso: () => console.log("Atenção: verifique os detalhes."), default: () => console.log("Tipo de notificação desconhecido."), }; function exibirNotificacao(tipo) { (notificacoes[tipo] || notificacoes.default)(); } exibirNotificacao("sucesso"); // Operação concluída com sucesso!
Exemplo mais avançado
Vamos imaginar que temos um sistema de e-commerce onde queremos calcular o desconto com base no tipo de cliente:
const descontos = { comum: (valor) => valor * 0.95, // 5% de desconto premium: (valor) => valor * 0.90, // 10% de desconto vip: (valor) => valor * 0.85, // 15% de desconto default: (valor) => valor, // Sem desconto }; function calcularPreco(tipoCliente, valor) { return (descontos[tipoCliente] || descontos.default)(valor); } console.log(calcularPreco("premium", 100)); // 90 console.log(calcularPreco("vip", 200)); // 170 console.log(calcularPreco("comum", 50)); // 47.5 console.log(calcularPreco("desconhecido", 100)); // 100
Aqui, eliminamos um longo if/else
e tornamos o código mais escalável. Se precisarmos adicionar um novo tipo de cliente, basta incluir uma nova chave no objeto descontos
, sem alterar a lógica principal da função.
Comparação de performance
Embora em pequenos exemplos a diferença seja insignificante, quando lidamos com grandes estruturas de decisão, a abordagem de HashTable é muito mais eficiente. Isso ocorre porque a busca em um objeto tem complexidade O(1)
, enquanto em um if/else
encadeado pode ser O(n)
, dependendo do número de condições.
Podemos visualizar isso testando o tempo de execução das duas abordagens:
console.time("ifElse"); function calcularDescontoIfElse(tipo, valor) { if (tipo === "comum") return valor * 0.95; if (tipo === "premium") return valor * 0.90; if (tipo === "vip") return valor * 0.85; return valor; } calcularDescontoIfElse("vip", 100); console.timeEnd("ifElse"); console.time("hashTable"); calcularPreco("vip", 100); console.timeEnd("hashTable");
Conclusão
O uso de HashTables (objetos em JavaScript) no lugar de if/else
melhora a organização e a eficiência do código. Sempre que você se deparar com múltiplos if/else
, considere essa abordagem para tornar seu código mais limpo, modular e fácil de manter.
Se você quer um código mais escalável e performático, comece a utilizar essa técnica em seus projetos! 🚀