DEV Community

Cover image for đŸ§čClean Code de Robert C. Martin - RĂ©sumĂ© express + exemples
MandyTrl
MandyTrl

Posted on

đŸ§čClean Code de Robert C. Martin - RĂ©sumĂ© express + exemples

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é

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()
Enter fullscreen mode Exit fullscreen mode

✅

const currentDate = new Date()
Enter fullscreen mode Exit fullscreen mode


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 !')
}
Enter fullscreen mode Exit fullscreen mode

✅

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)
}
Enter fullscreen mode Exit fullscreen mode

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))
}
Enter fullscreen mode Exit fullscreen mode

Ç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))
}
Enter fullscreen mode Exit fullscreen mode

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)
}
Enter fullscreen mode Exit fullscreen mode

✅

function getEmailsByRole(users, role) {
  return users.filter(u => u.role === role).map(u => u.email)
}
Enter fullscreen mode Exit fullscreen mode


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
Enter fullscreen mode Exit fullscreen mode

❌

// Cette fonction vérifie si un utilisateur est admin
function checkUserStatus(user) {
  return user.isActive && user.points > 1000
}
Enter fullscreen mode Exit fullscreen mode

✅

function isAdminUser(user) {
  return user.isActive && user.points > 1000
}
Enter fullscreen mode Exit fullscreen mode


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 }
Enter fullscreen mode Exit fullscreen mode


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
}
Enter fullscreen mode Exit fullscreen mode

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..
}
Enter fullscreen mode Exit fullscreen mode

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)