Back to blog

Substituindo if/else por HashTable em JavaScript

3 min de leitura
683 palavras

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:

  1. Legibilidade: O código fica mais limpo e intuitivo.
  2. Facilidade de manutenção: Adicionar um novo comando requer apenas uma nova entrada no objeto, sem precisar modificar uma longa cadeia de if/else.
  3. 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! 🚀