Refactoring in JavaScript: il pattern delle guard clause

Refactoring in JavaScript: il pattern delle guard clause

Questo breve tutorial di refactoring spiega come scrivere delle guard clause (clausole di guardia) per le tue istruzioni if, invece di annidare la logica condizionale if… else. È un modo per ottenere codice pulito e facile da leggere. L’esempio è in JavaScript, ma lo stesso stile di programmazione vale per qualsiasi linguaggio: PHP, Java e così via.

Che cos’è una guard clause?

Il pattern delle guard clause è semplicemente una tecnica per fare un controllo rapido dentro un metodo, per esempio in un costruttore. Se un metodo (o l’istanza di un oggetto) ha bisogno di certi valori per funzionare correttamente, e l’applicazione non dovrebbe mai chiamare quel codice con input non validi, la guard clause solleva un’eccezione appena uno dei valori non soddisfa le condizioni. Tra le altre cose, la tecnica evita di annidare una serie di if else durante l’esecuzione di un metodo.

Esempio JavaScript della tecnica delle guard clause

Immagina di dover scrivere un metodo che formatta una data a seconda del suo valore: può essere un timestamp, un oggetto Date o una stringa, se non rientra in nessuno dei tre casi si tratta di un errore. La tentazione è scrivere codice che annida if, else if, else if, else… 

Senza guard clause

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();
}

Con guard clause

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);
}

Si vede subito che con le guard clause il codice è molto più leggibile: più facile da rileggere e da mantenere, per te come per i tuoi colleghi.

Conclusione

Le guard clause e i controlli di validazione fanno entrambi la validazione degli input. La differenza sta nel sapere se l’input non valido è previsto e fa parte del funzionamento dell’applicazione, oppure se è inatteso. Usa le eccezioni solo per i casi inattesi, e i controlli di validazione per i problemi previsti sui dati in ingresso.

JavaScriptPHP

Damien Flandrin Sviluppatore web dal 2010, creatore di Gekkode e di Email Impact. Ogni articolo è testato su un progetto reale prima della pubblicazione. Contatti
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.