Refactoring : Le pattern guard clauses

Ce court tutoriel de refactoring explique comment écrire des clauses de garde ( ou guard clauses en anglais ) pour vos instructions if, plutôt que d’utiliser une logique conditionnelle if .. else imbriquée. Cela peut vous aider à créer un code propre et facile à lire. L’exemple est basés sur du JavaScript, mais le même style de programmation peut s’appliquer à n’importe quel langages comme le PHP, le Java, etc…

Qu'est-ce qu'un guard clause ?

Le pattern guard clauses est simplement une technique pour tester rapidement dans une méthode, par exemple dans un constructeur. Si une méthode (ou une instance d’objet) nécessite certaines valeurs pour fonctionner correctement, et que l’application ne devrait jamais essayer d’appeler le code avec des entrées non valides, si les valeurs ne répondent pas favorablement aux conditions successives d’un guard clauses, celui-ci lance des exceptions. Cette techniques permets en autre d’éviter d’imbriquer successivement des conditions If Else pendant l’execution d’une méthode.

Exemple JavaScript de la technique guard clauses

Imaginez que vous devez créer une méthode qui permet de formatter une date en fonction de sa valeur, ça peut être un timestamps, l’objet Date ou une chaine de caractères, si il ne réponds à aucun des 3 critères alors il s’agit d’une erreur, nous serrions tenter d’écrire un code imbriquant des if else if else if else… 

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

Toute de suites, on peut voir qu’avec la technique guard clauses, le code est beaucoup plus lisible, il facilite sa lecture et la maintenance du code pour vous même ou vos collègues.

Conclusion

Les clauses de garde et les tests de validation effectuent tous deux la validation des entrées. La différence se résume à savoir si l’entrée invalide est attendue et fait partie de l’application, ou si elle est inattendue. N’utilisez les exceptions que pour les cas inattendus, et utilisez des tests de validations logique pour les problèmes attendus avec les données entrantes.

Nouvelle vidéo

Newsletter

Ne manquez jamais les nouveaux conseils, tutoriels et autres.

Pas de spam, jamais. Nous ne partagerons jamais votre adresse électronique et vous pouvez vous désabonner à tout moment.