
Este pequeno tutorial de refactoring mostra como escrever cláusulas de guarda (guard clauses, em inglês) nas tuas instruções if, em vez de encadear lógica condicional if… else umas dentro das outras. Ajuda a obter código limpo e fácil de ler. O exemplo é em JavaScript, mas o mesmo estilo aplica-se a qualquer linguagem: PHP, Java e por aí adiante.

O que é uma guard clause?
O padrão guard clause é apenas uma forma de testar cedo dentro de um método, por exemplo num construtor. Se um método (ou uma instância de objeto) precisa de determinados valores para funcionar corretamente, e a aplicação nunca deveria chamar esse código com entradas inválidas, então, quando os valores não satisfazem as condições sucessivas, a guard clause lança uma exceção. Esta técnica evita, entre outras coisas, encaixar condições if/else umas dentro das outras durante a execução do método.
Exemplo em JavaScript da técnica guard clause
Imagina que tens de escrever um método que formata uma data consoante o valor recebido: pode ser um timestamp, um objeto Date ou uma string, se não corresponder a nenhum dos três critérios, é um erro. A tentação é escrever um encadeado de if, else if, else if, else…
Sem guard clauses
function getDate(date) {
let result;
if (!isEmpty(date)) {
if (isTimestamp(date)) {
result = formatWithTimestamp(date);
else if (isDateObject(date))
result = formatWithObject(date);
else if (isString(date))
result = formatWithString(date);
else
throw new DateFormatException(date);
}
return result;
}
return emptyDateError();
}
Com guard clauses
function formatDate(date) {
if (isEmpty($date)) return emptyDateError();
if (isTimestamp(date)) return formatWithTimestamp(date);
if (isDateObject(date)) return formatWithObject(date);
if (isString(date)) return formatWithString(date);
throw new DateFormatException(date);
}Vê-se logo que, com a técnica das guard clauses, o código fica muito mais legível: mais fácil de ler e de manter, para ti e para os teus colegas.
Conclusão
As cláusulas de guarda e os testes de validação fazem ambos a validação das entradas. A diferença está em saber se a entrada inválida é esperada e faz parte do funcionamento da aplicação, ou se é inesperada. Usa exceções apenas para os casos inesperados e testes de validação para os problemas previstos nos dados recebidos.


