Clean Code sur JavaScript : principes et exemples
Le Clean Code n'est pas simplement un terme à la mode, mais une approche fondamentale du développement qui rend le programme compréhensible, facile à maintenir et à étendre. Dans l'univers de JavaScript et Node.js, où les projets grandissent rapidement et nécessitent des changements fréquents, les principes du Clean Code deviennent particulièrement importants. Dans cet article, nous allons analyser les pratiques clés pour écrire du code propre en JavaScript avec des exemples concrets qui vous aideront à améliorer la qualité de vos projets.
1. Nommage correct des variables et des fonctions
Le nom d'une variable ou d'une fonction doit répondre aux questions "qu'est-ce que c'est ?" et "que fait-elle ?". Évitez les noms d'une seule lettre (sauf pour les compteurs de boucles) et les abréviations qui ne sont pas évidentes.
Mauvais exemple :
const d = new Date();const a = [];const fn = (x, y) => x + y;Bon exemple :
const currentDate = new Date();const userList = [];const calculateSum = (firstNumber, secondNumber) => firstNumber + secondNumber;Règles de nommage :
- Utilisez le
camelCasepour les variables et les fonctions. - Pour les valeurs booléennes, utilisez des préfixes :
is,has,should(par exemple,isActive,hasPermission). - Nommez les fonctions avec des verbes :
getUser,sendEmail,validateInput. - Évitez les abréviations :
usr→user,conf→configuration.
2. Fonctions petites et à tâche unique
Chaque fonction doit effectuer exactement une tâche. Si une fonction fait plus d'une action, elle doit être divisée en plusieurs. Cela améliore la lisibilité et la testabilité.
Mauvais exemple (la fonction fait 3 choses à la fois) :
function processUserData(user) { // Validation if (!user.email || !user.password) { throw new Error('Invalid data'); } // Formatage const formattedUser = { email: user.email.toLowerCase(), password: hashPassword(user.password) }; // Sauvegarde en BDD db.save(formattedUser); return formattedUser;}Bon exemple (séparation en fonctions distinctes) :
function validateUserInput(user) { if (!user.email || !user.password) { throw new Error('Email and password are required'); }}
function formatUserData(user) { return { email: user.email.toLowerCase(), password: hashPassword(user.password) };}
function saveUserToDatabase(user) { return db.save(user);}
function processUserData(user) { validateUserInput(user); const formattedUser = formatUserData(user); return saveUserToDatabase(formattedUser);}Cette approche rend le code auto-documenté et simplifie la recherche d'erreurs.
3. Gestion des erreurs et des cas limites
Le Clean Code inclut obligatoirement la gestion des erreurs et prévoit les cas limites. Ne laissez pas de place aux pannes inattendues.
Mauvais exemple (pas de gestion d'erreurs) :
function getUserAge(user) { return user.age; // Si user ou user.age est undefined — erreur}Bon exemple (avec protection) :
function getUserAge(user) { if (!user || typeof user.age !== 'number') { return null; // ou throw new Error('Invalid user data') } return user.age;}Principes de gestion des erreurs :
- Utilisez
try/catchpour les opérations asynchrones (surtout dans Node.js). - Créez vos propres classes d'erreurs pour différentes situations.
- N'avalez pas les erreurs en silence — loggez-les ou transmettez-les plus loin.
class ValidationError extends Error { constructor(message)