Le livre Clean Code écrit par Robert C. Martin est une référence pour écrire un code de qualité : lisible, cohérent et facile à maintenir. Je l'ai découvert suite à une recommandation sur une chaßne YT, voyons ensemble ces grands principes !
đïžSommaire
- Lisibilité et clarté
- Petites fonctions, une seule responsabilité
- Limiter la taille des fonctions
- Ăviter la duplication (DRY)
- Commenter, oui, mais coder pour ne pas avoir Ă le faire
- Structure logique du code
- Code modulaire et testable
- Gestion des erreurs
Lisibilité et clarté
Le nommage des variables et fonctions doivent ĂȘtre explicites ! En entreprise, dans un projet coconstruit : le code doit ĂȘtre facilement comprĂ©hensible par un autre dĂ©veloppeur. On laisse les abrĂ©viations et le freestyle pour les projets personnels (et encore..).
â
const d = new Date()
â
const currentDate = new Date()
Petites fonctions, une seule responsabilité
Une fonction doit faire une seule chose et bien la faire (Single Responsibility Principle). C'est plus facile Ă tester et comprendre.
â
function registerUser(user) {
if (!user.email.includes('@')) {
throw new Error('Email invalide')
}
database.save(user)
sendWelcomeEmail(user.email, 'Bienvenue !')
}
â
function isValidEmail(email) {
return email.includes('@')
}
function saveUser(user) {
database.save(user)
}
function sendWelcomeEmail(email) {
sendEmail(email, 'Bienvenue !')
}
function registerUser(user) {
if (!isValidEmail(user.email)) {
throw new Error('Email invalide')
}
saveUser(user);
sendWelcomeEmail(user.email)
}
Ici chaque fonction est correctement nommée, gÚre une chose et est réutilisable.
Limiter la taille des fonctions
On limite le nombre de paramĂštres, on essaie de rĂ©duire le nombre de caractĂšres (đ coucou les ternaires et leurs amis) tant que ça n'entache pas sa lisibilitĂ©. Une fonction doit tenir sur quelques lignes et exprimer une seule intention "lisibles de haut en bas, comme une histoire".
â
function calculateDiscount(price, isMember, code) {
return price * (1 - Math.min((isMember ? 0.1 : 0) + (code === 'VIP' ? 0.2 : 0), 0.3))
}
Ăa tient sur une ligne mais au premier coup d'oeil on ne comprend rien et en plus de ça la fonction gĂšre plusieurs responsabilitĂ©s.
â
function getDiscount(isMember, code) {
const member = isMember ? 0.1 : 0
const promo = code === 'VIP' ? 0.2 : 0
return Math.min(member + promo, 0.3)
}
function calculateDiscount(price, isMember, code) {
return price * (1 - getDiscount(isMember, code))
}
Deux fonctions mais elles sont concises et explicites đ.
Eviter la duplication (DRY)
Le principe DRY (ou** Don't Repeat Yourself*) est distillĂ© tout du long du bouquin. Le concept est simple : **factoriser le code* pour ne pas avoir plusieurs fois la mĂȘme logique. Mais parfois (et surtout sur un grand projet) on ne se rend pas compte de ces duplications. Les signes qui doivent vous alerter sont les suivants :
- vous copiez/collez plusieurs fois le mĂȘme bout de code pour l'intĂ©grer dans diffĂ©rents fichiers.
- certaines fonctions font la mĂȘme chose - Ă une ou deux lignes prĂšs.
- la logique n'est pas centralisée et vous intégrez un bout de code dans plusieurs fonctions.
- l'impression du déjà vu.
â
function getAdminEmails(users) {
return users.filter(u => u.role === 'admin').map(u => u.email)
}
function getUserEmails(users) {
return users.filter(u => u.role === 'user').map(u => u.email)
}
â
function getEmailsByRole(users, role) {
return users.filter(u => u.role === role).map(u => u.email)
}
Commenter, oui, mais coder pour ne pas avoir Ă le faire
Un code bien Ă©crit doit ĂȘtre auto documentĂ©. Les commentaires ne doivent pas compenser un code confus (revoir les points prĂ©cĂ©dents). Un code inutile commentĂ© ? autant le supprimer ! Mea-culpa, je laisse souvent des bouts de code commentĂ©s pour diverses raisons :
- j'ai mis du temps Ă le faire ou Ă comprendre comment le faire et j'ai peur de le perdre.
- c'est le code d'un autre dĂ©veloppeur et j'ai du mal Ă supprimer ce qui n'a pas Ă©tĂ© Ă©crit par moi-mĂȘme.
- comme ma mĂšre j'utilise la carte joker du "au cas oĂč". Mais si besoin, le versionnage de Git est lĂ ! â
// const isDebug = true
â
// Cette fonction vérifie si un utilisateur est admin
function checkUserStatus(user) {
return user.isActive && user.points > 1000
}
â
function isAdminUser(user) {
return user.isActive && user.points > 1000
}
Garder une structure logique du code
Que ce soit au sein du projet et la façon dont sont architecturés les fichiers entre eux et correctement séparer les blocs à l'intérieur d'un fichier. Voici un bon exemple :
â
// constantes
const TAX_RATE = 0.2
// fonctions utilitaires
function applyTax(price) {
return price + price * TAX_RATE
}
function formatPrice(price) {
return `${price.toFixed(2)} âŹ`
}
// fonction principale
function displayTotal(price) {
const taxedPrice = applyTax(price)
console.log(formatPrice(taxedPrice))
}
// export éventuel
export { displayTotal }
Ecrire un code modulaire et testable
Ce chapitre rejoint le point DRY et la taille optimale d'une fonction. En ayant plusieurs unités indépendantes on peut plus facilement comprendre, réutiliser et tester le code.
Gérer les erreurs proprement
Une bonne gestion des erreurs rend le code plus fiable et ça passe par plusieurs bonnes pratiques :
- utiliser des exceptions (interrompt l'exécution du code) à la place de codes d'erreur cachés.
- ĂȘtre explicite : nâattrape pas une erreur pour la faire disparaĂźtre.
- isoler la validation permet de tester les erreurs facilement.
- crĂ©er des erreurs personnalisĂ©es pour les cas mĂ©tier spĂ©cifiques. â
function register(user) {
if (!user.email.includes('@')) return false
}
Ce bout de code est "silencieux", peu clair.
â
function validateEmail(email) {
if (!email.includes('@')) throw new Error('Email invalide')
}
function register(user) {
validateEmail(user.email);
// suite du process..
}
Ici on sépare la validation de l'enregistrement et on a une erreur claire.
Et VoilĂ , tes collĂšgues et ton futur toi te remercient pour ce code de qualitey que tu es prĂȘt Ă programmer; car le clean code sert tout le monde :)
Top comments (0)