Guard Clause ou Early return

No desenvolvimento de software, a legibilidade e a manutenibilidade são vitais para os facilitar o trabalho em equipe e a redução de custo de um software.

Guard Clauses ou Early return são uma forma de escrever funções ou métodos que contribuem significativamente para esses aspectos quando se trata de estruturas condicionais.

O que é?

É um padrão de programação utilizado para melhorar a legibilidade e simplificar a estrutura de controle em um método ou função que serve como uma espécie de saída antecipada. Permite que você trate um caso especial que não requer a execução do restante do bloco de código, reduzindo a necessidade de aninhamentos complexos de instruções if-else.

Resumindo: “Se uma determinada condição for atendida, saia da função ou retorne um valor antecipadamente.”

Como usar?

Aqui está um exemplo simples em Java:

public double divide(double a, double b) {
    if (b == 0) { 
        throw new IllegalArgumentException("Cannot divide by zero"); 
    }
    return a / b;
}

Neste exemplo, o guard clause é if (b == 0) { throw new IllegalArgumentException("Não é possível dividir por zero"); }. Se a condição for atendida (ou seja, se b for zero), uma exceção IllegalArgumentException é lançada, evitando assim a operação de divisão que causaria um erro.

Agora um outro exemplo de refatoração usando essa técnica:

Antes:

public static int getInsuranceDeductible(Insurance insurance) {
    int value = 0;
    if (insurance.covered) {
        if (insurance.majorRepair) {
            value = 500;
        } else if (insurance.mediumRepair) {
            value = 300;
        } else {
            value = 100;
        }
    }
    
    return value;
}

Depois:

public static int getInsuranceDeductible(Insurance insurance) {
    if (!insurance.covered) return 0;
    if (insurance.majorRepair) return 500;
    if (insurance.mediumRepair) return 300;
    
    return 100;
}

Neste exemplo, podemos notar que após a refatoração a função está muito mais curta antes e muito mais fácil de entender, pois toda a lógica é independente e não aninhada uma dentro da outra.

Onde usar?

Você pode usar em qualquer parte do código, mas os casos de uso mais comuns são:

  1. Validação de entrada: Para garantir que as entradas atendam a certas condições antes de prosseguir com a execução adicional.
  2. Autorização: Para verificar se um usuário tem as permissões corretas para acessar um recurso.
  3. Pré-condição de estado: Para garantir que o sistema ou objeto esteja em um estado adequado para que uma operação seja executada.

Guard Clause vs Tratamento de Exceções

Embora possam às vezes servir a propósitos semelhantes, são mais adequados para diferentes tipos de situações.

  • Guard clauses: condições que você espera que aconteçam e fazem parte do fluxo normal do programa
  • Exceções: condições que são verdadeiramente excepcionais e indicam que algo deu errado

Conclusão

Guard clauses é uma ótima ferramenta para qualquer programador que busca escrever um código mais limpo, legível e fácil de manter. Então, da próxima vez que você se encontrar aninhando várias instruções if-else ou lutando com a complexidade de uma função, considere simplificá-la com um guard clause.

Leave a Reply

Your email address will not be published. Required fields are marked *