Técnica de Programação por Tabelas

Considere uma função que retorna o número de dias em um mês:

int obterDiasNoMes(int mes)
{
    int dias = 0;
    if(mes == 2)
    {
        dias = 28;
    }
    else if(mes == 4 || mes == 6 || mes == 9 || mes == 11)
    {
        dias = 30;
    }
    else
    {
        dias = 31;
    }
    return dias;
}

Esta abordagem utiliza números mágicos e múltiplas condições. Uma solução mais eficiente emprega uma tabela:

const int tabelaDias[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int obterDiasNoMesPorTabela(int mes)
{
    return tabelaDias[mes - 1];
}

A técnica pode ser implementada de três formas principais:

Acesso Direto

O método mais simples, onde o índice é usado diretamente para acessar valores. Exemplo com sistema de informações sobre animais:

class Animal
{
public:
    virtual void exibir() = 0;
};

class Cao : public Animal
{
public:
    void exibir()
    {
        cout << "Animal: Cão" << endl;
    }
};

class Gato : public Animal
{
public:
    void exibir()
    {
        cout << "Animal: Gato" << endl;
    }
};

Animal* tabelaAnimais[] = {new Cao, new Gato};

int main()
{
    cout << "Selecione o animal:" << endl;
    cout << "1. Cão" << endl << "2. Gato" << endl;
    int opcao;
    cin >> opcao;
    tabelaAnimais[opcao - 1]->exibir();
}

Acesso por Índice

Útil quando há repetição de valores. Um índice mapeia para descrições compartilhadas:

const char* descricoes[] = {"Eletrônico", "Vestuário", "Alimentação"};
int indicesProdutos[] = {0, 1, 0, 2, 1}; // Múltiplos produtos apontam para mesma descrição

Acesso por Intervalos

Adequado para classifiacção em faixas de valores. Exemplo com conversão de notas:

const char notas[] = {'A', 'B', 'C', 'D', 'F'};
const int limites[] = {90, 80, 70, 60};

char converterNota(int pontuacao)
{
    for(int i = 0; i < 4; ++i)
    {
        if(pontuacao >= limites[i])
            return notas[i];
    }
    return 'F';
}

Para otimização em intervalos ordenados, pode-se aplicar busca binária:

int buscarClassificacao(int pontuacao)
{
    int inicio = 0;
    int fim = 3;
    while(inicio <= fim)
    {
        int meio = (inicio + fim) / 2;
        if(pontuacao >= limites[meio])
            return meio;
        else if(pontuacao < limites[meio])
            inicio = meio + 1;
        else
            fim = meio - 1;
    }
    return 4;
}

A técnica reduz complexidade ciclomática e possibilita otimizações como busca binária, diminuindo a complexidade temporal de O(N) para O(log N).

Tags: programação por tabelas Estruturas de Dados Otimização de Código algoritmos de busca padrões de desenvolvimento

Publicado em 8-13 01:06