Refactoring em JavaScript: o padrão guard clause

Refactoring em JavaScript: o padrão guard clause

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

javascript
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

javascript
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.

JavaScriptPHP

Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.