DEV Community

Dário Prazeres
Dário Prazeres

Posted on

O que fazer se o teu código tiver vários if's?

Já olhou para o seu código e notou muitos if...else if...else, e se perguntaste como posso resolver isso de forma mais elegante?

Todos sabemos que a estrutura de condição é algo que esta presente em 99,99% de todos os códigos, mas as vezes nos perguntamos se realmente tais estruturas deveriam ser implementada deste jeito, as vezes de forma imediata acabamos por não pensar em outras formas que seriam mais elegante para o nosso código (confesso que já fiz e as vezes faço).

Mas o que é Ifs e Else?

If's e Elses como digo, são na verdade estruturas de condições. Tais estruturas permitem a escolha de um grupo de ações e estruturas que serão executados, quando certa condição é verdadeira.

if(BomHumor == true)
{
   Console.WriteLine("Bom dia!");
}else
{
   Console.WriteLine("Quero Café!");
}
Enter fullscreen mode Exit fullscreen mode

Complexidade ciclomática

A solução está em entender sobre a complexidade ciclomática do seu código, o que lhe permitirá saber quais estruturas e padrões deverás usar. Mas o que é a Complexidade Ciclomática?

A complexidade ciclomática é uma métrica de software que indica a complexidade de um programa de computador com base na estrutura do seu código-fonte. Foi desenvolvida por Thomas J. McCabe em 1976 e é frequentemente usada para avaliar a facilidade de manutenção e sustentabilidade de um programa. A complexidade ciclomática ajuda a identificar partes do código que podem ser difíceis de entender e manter.

A complexidade ciclomática é calculada contando o número de caminhos independentes no código, o que está relacionado ao grau de aninhamento e às estruturas de controle de fluxo, como condicionais (if, else), loops (for, while), e switches (switch-case). A fórmula para calcular a complexidade ciclomática é a seguinte:
M = E - N + 2P
onde:

  • M é a complexidade ciclomática.
  • E é o número de arestas no grafo de controle de fluxo.
  • N é o número de nós no grafo de controle de fluxo.
  • P é o número de componentes conectados (como número de partes independentes do código).

Depois de falarmos tanto vamos para um exemplo em C# que usaremos o Padrão de Estratégia(falaremos em outra ocasião com mais detalhes):

public class CalculadoraDesconto
{
    public decimal CalculoDesconto(Cliente cliente, Pedido pedido)
    {
        decimal desconto = 0;

        if (cliente.IsPremium)
        {
            if (pedido.QuantiaTotal > 100)
            {
                desconto = pedido.QuantiaTotal * 0.1m;
            }
            else
            {
                desconto = pedido.QuantiaTotal * 0.05m;
            }
        }
        else
        {
            if (pedido.QuantiaTotal > 200)
            {
                desconto = pedido.QuantiaTotal * 0.15m;
            }
            else
            {
                desconto = pedido.QuantiaTotal * 0.1m;
            }
        }

        return desconto;
    }
}
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo temos uma classe que calcula o desconto de um cliente normal e um premium e isso em função do seu pagamento "QuantiaTotal".

Vamos aplicar a mesma fórmula para calcular a complexidade ciclomática:

Número de nós (N): Neste código, temos os seguintes pontos de decisão:

A primeira decisão, que verifica se o cliente é premium.
A segunda decisão, que verifica se o valor total da ordem é maior que 100.
A terceira decisão, que verifica se o valor total da ordem é maior que 200.

Número de arestas (E): O número de arestas no grafo de controle de fluxo é igual ao número de transições entre os pontos de decisão. Cada ponto de decisão cria dois caminhos (um verdadeiro e outro falso), exceto o primeiro ponto de decisão que cria apenas um caminho. Portanto:

A primeira decisão cria 2 caminhos.
A segunda decisão cria 2 caminhos.
A terceira decisão cria 2 caminhos.

Número de componentes (P): Este código tem um único componente, pois não há partes desconectadas no fluxo de controle.
M = E - N + 2P
M = (2 + 2 + 2) - (3) + 2(1) = 6 - 3 + 2 = 5

A complexidade ciclomática do código é 5. Isso significa que o código tem 5 caminhos independentes possíveis, o que indica um nível moderado de complexidade. Manter a complexidade ciclomática baixa é importante para facilitar a manutenção e os testes do código.

Como vimos no exemplo acima temos uma complexidade de 5, o que não é um caso de insatisfação. Mas ainda não respondemos a pergunta "Como Diminuir os Ifs e elses?"

Como Diminuir os ifs e elses?
Existem várias formas de fazer isso, levando em conta a tua disposição e o tempo de entrega do projecto. Falaremos de 4 estratégias, mas tais estratégias são muito abrangentes.

1. Early return: Elimina ramificações desnecessárias.
2. Tabelas de decisão: Substitui condições por dicionários ou regras.
3. Polimorfismo: Divide a lógica por tipo de cliente.
4. Delegação de funções: Encapsula a lógica de desconto, tornando o código mais modular.

Descreveremos cada estratégia nos próximos posts, e será apresentados código moldados do exemplo acima.

Top comments (0)