Pourquoi le « code propre » n'est pas une question d'esthétique, mais d'argent et de temps
\n\nImaginez que vous ouvrez un projet JavaScript écrit par quelqu'un d'autre. Les variables s'appellent a, b, x1. Une fonction de 300 lignes. L'imbrication des conditions comme une poupée russe. Cela vous dit quelque chose ? Si vous avez déjà maudit un tel « auteur », alors vous comprenez déjà pourquoi le code propre est nécessaire.
Le code propre en JavaScript n'est pas une mode ni un caprice de perfectionniste. C'est un outil qui économise des heures de débogage, simplifie l'intégration des nouveaux arrivants et réduit le coût de maintenance du projet. Dans cet article, nous allons détailler des règles et techniques concrètes qui vous aideront à écrire un code compréhensible non seulement par la machine, mais aussi par l'humain.
\n\nRègle n°1 : Les noms de variables et de fonctions doivent parler d'eux-mêmes
\n\nL'erreur la plus courante des débutants est d'utiliser des noms courts et insignifiants. Mauvais exemple :
\n\nlet d = new Date();\nlet n = d.getDay();\nlet r = n === 0 || n === 6 ? 'Week-end' : 'Jour de semaine';\nconsole.log(r);\n\n\nBon exemple :
\n\nconst currentDate = new Date();\nconst dayOfWeek = currentDate.getDay();\nconst isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\nconst dayType = isWeekend ? 'Week-end' : 'Jour de semaine';\nconsole.log(dayType);\n\n\nLa différence est évidente. Dans la deuxième version, on comprend immédiatement ce que fait le code, sans commentaires supplémentaires. Conseil : utilisez des noms pour les variables et des verbes pour les fonctions. Par exemple : getUserData(), calculateTotal(), isValidEmail().
Comment éviter les « nombres magiques » ?
\n\nLes nombres magiques sont des chiffres dont le sens est incompréhensible sans contexte. Utilisez des constantes à la place :
\n\n// Mauvais\nif (user.role === 1) { ... }\n\n// Bon\nconst ROLE_ADMIN = 1;\nif (user.role === ROLE_ADMIN) { ... }\n\n\nRègle n°2 : Les fonctions doivent être petites et ne faire qu'une seule chose
\n\nLe principe de responsabilité unique (Single Responsibility) s'applique non seulement aux classes, mais aussi aux fonctions. Si une fonction fait trois choses, elle doit être divisée en trois fonctions. Mauvais exemple :
\n\nfunction processOrder(order) {\n // Validation\n if (!order.items || order.items.length === 0) {\n throw new Error('Panier vide');\n }\n // Calcul de la réduction\n let discount = 0;\n if (order.total > 1000) {\n discount = 0.1;\n }\n // Envoi d'email\n sendEmail(order.email, 'Votre commande est acceptée');\n return order.total - order.total * discount;\n}\n\n\nBon exemple (refactoring) :
\n\nfunction validateOrder(order) {\n if (!order.items || order.items.length === 0) {\n throw new Error('Panier vide');\n }\n}\n\nfunction calculateDiscount(total) {\n return total > 1000 ? 0.1 : 0;\n}\n\nfunction notifyCustomer(email) {\n sendEmail(email, 'Votre commande est acceptée');\n}\n\nfunction processOrder(order) {\n validateOrder(order);\n const discount = calculateDiscount(order.total);\n notifyCustomer(order.email);\n return order.total - order.total * discount;\n}\n\n\nCette structure permet de tester facilement chaque partie séparément et de modifier la logique sans affecter le reste du code.
\n\nRègle n°3 : Évitez les imbrications profondes
\n\nPlus il y a de niveaux d'imbrication (if dans if dans for), plus le code est difficile à lire. Utilisez le retour anticipé (early return) et les clauses de garde.
\n\n// Mauvais\nfunction getUserDisplayName(user) {\n if (user) {\n if (user.name) {\n if (user.name.length > 0) {\n return user.name;\n }\n }\n }\n return 'Anonyme';\n}\n\n// Bon\nfunction getUserDisplayName(user) {\n if (!user || !user.name || user.name.length === 0) {\n return 'Anonyme';\n }\n return use