Récemment, j’ai beaucoup refactorisé de code dans l’entreprise où je travaille actuellement. L’un des problèmes les plus courants que j’ai rencontrés concerne les instructions if/else/else if profondément imbriquées. Elles ont tendance à croître comme un grand arbre emmêlé. Le problème est que ces structures sont difficiles à lire, difficiles à analyser et incluent souvent des vérifications en double si elles ne sont pas gérées avec soin.

Dans ce tutoriel, je vais vous montrer quelques moyens pratiques de refactoriser ce type de code pour le rendre plus lisible et maintenable.

function getDiscount(user) {
  if (user) {
    if (user.isMember) {
      if (user.purchaseHistory && user.purchaseHistory.length > 5) {
        return 0.2;
      } else {
        if (user.coupon) {
          if (user.coupon === 'VIP') {
            return 0.15;
          } else {
            return 0.1;
          }
        } else {
          return 0.05;
        }
      }
    } else {
      return 0;
    }
  } else {
    return 0;
  }
}

Astuce 1 : Prendre “Le Chemin Idéal” (The Happy Path)

Une technique simple mais puissante pour réduire l’imbrication est de retourner le résultat dès que vous avez assez d’informations. Cela se fait en ajoutant des clauses de garde (guard clauses) au début de la fonction.

function getDiscount(user) {
  if (!user) return 0;                      // garde: pas d'utilisateur
  if (!user.isMember) return 0;             // garde: non membre

  if (user.purchaseHistory?.length > 5) return 0.2;
  if (user.coupon === 'VIP') return 0.15;
  if (user.coupon) return 0.1;

  return 0.05;
}

Cette version est plus facile à suivre car la fonction se lit comme une séquence linéaire de règles plutôt que comme un arbre de conditions imbriquées. Chaque vérification est isolée, ce qui rend le code plus simple à analyser et plus facile à tester.

Astuce 2 : Mapper avec un Objet

Une autre excellente façon de remplacer les longues instructions conditionnelles ou switch est d’utiliser une table de recherche d’objet (object lookup table). Cette approche sépare la logique (les règles elles-mêmes) du flux de contrôle.

const roleDiscount = {
  guest: 0,
  member: 0.05,
  vip: 0.15,
  staff: 0.25
};

function getRoleDiscount(role) {
  return roleDiscount[role] ?? 0; // recherche O(1); 0 par défaut
}

Ce code peut remplacer de longues instructions switch qui peuvent ressembler à ceci :

function getRoleDiscountSwitch(role) {
  switch(role) {
    case 'guest': return 0;
    case 'member': return 0.05;
    case 'vip': return 0.15;
    case 'staff': return 0.25;
    default: return 0;
  }
}

L’approche du mappage d’objet rend non seulement le code plus court et plus expressif, mais offre également l’avantage supplémentaire de la complexité O(1) pour les recherches. Ajouter ou modifier un rôle devient aussi simple que de mettre à jour l’objet, sans toucher à la logique de la fonction.

Conclusion

Les conditions sont l’une des sources de complexité les plus courantes dans le code du quotidien. En appliquant des techniques telles que les clauses de garde (« le chemin idéal ») et les recherches d’objets, vous pouvez transformer une logique profondément imbriquée en fonctions propres, testables et extensibles.

Ce ne sont là que quelques-unes de mes techniques de refactoring préférées. Et vous ? Avez-vous d’autres façons de simplifier les conditions complexes en JavaScript ? J’adorerais entendre vos idées — n’hésitez pas à les partager avec moi sur LinkedIn !

🌟 Astuce Bonus

Je viens de trouver quelque chose de vraiment utile pour apprendre le refactoring — 🎧 Five Lines of Code (livre audio). C’est honnêtement la manière la plus simple que j’ai rencontrée de comprendre le refactoring sans se sentir dépassé.

La partie cool est que vous pouvez l’obtenir gratuitement avec l’essai de 30 jours d’Amazon Audible, vous ne payez donc pas un centime si vous annulez avant la fin de l’essai. Voici mon lien d’affiliation si vous voulez y jeter un œil : Five Lines of Code sur Audible — Je peux gagner une petite commission si vous vous inscrivez, sans frais supplémentaires pour vous.