Clean Code

Le clean code consiste à écrire du code clair, lisible et facile à maintenir.

Un code propre n’est pas seulement un code qui fonctionne. C’est un code qu’on peut comprendre, modifier, tester et améliorer facilement.

L’objectif est de réduire la complexité.

1. Pourquoi écrire du clean code

Un projet évolue constamment. Plus le code est clair, plus il est facile à modifier sans créer de bugs.

Le clean code aide à :

2. Éviter l’imbrication excessive

Plus un code est imbriqué, plus il devient difficile à lire.

if (isLoggedIn) {

    if (isAdmin) {

        console.log("Accès admin");

    }

}

Ici, le code fonctionne, mais il commence déjà à être imbriqué.

3. Early return

Un early return consiste à quitter une fonction rapidement lorsqu’un cas invalide est détecté.

function accessAdmin(user) {

    if (!user) {

        return;

    }

    if (!user.isAdmin) {

        return;

    }

    console.log("Accès admin");

}

Le code principal reste plus plat et plus lisible.

4. Guard clause

Une guard clause est une condition placée au début d’une fonction pour gérer un cas invalide.

function checkout(cart) {

    if (cart.size === 0) {

        return "Votre panier est vide";

    }

    return "Commande validée";

}

On gère d’abord les exceptions, puis on laisse le cas normal respirer.

5. Le happy path

Le happy path représente le déroulement normal du programme.

En clean code, on essaie de garder ce chemin principal le moins imbriqué possible.

function getMessage(user) {

    if (!user) {

        return "Utilisateur invalide";

    }

    return `Bonjour ${user.name}`;

}

6. Supprimer les else inutiles

Lorsqu’un bloc contient déjà un return, le else devient souvent inutile.

function getStatus(isLoggedIn) {

    if (!isLoggedIn) {

        return "Déconnecté";

    }

    return "Connecté";

}

Le return arrête déjà la fonction. Il n’est donc pas nécessaire d’ajouter un else.

7. Éviter les variables mutables inutiles

Une variable déclarée avec let peut être modifiée. Mais si ce n’est pas nécessaire, mieux vaut utiliser const.

// Moins propre

let message;

if (isLoggedIn) {

    message = "Bienvenue";

} else {

    message = "Connexion requise";

}

Une meilleure approche consiste à isoler la logique dans une fonction.

function getMessage(isLoggedIn) {

    if (isLoggedIn) {

        return "Bienvenue";

    }

    return "Connexion requise";

}

const message = getMessage(isLoggedIn);

8. Préférer les fonctions pures

Une fonction pure retourne toujours le même résultat avec les mêmes arguments.

function add(a, b) {

    return a + b;

}

Les fonctions pures sont plus simples à tester, à comprendre et à déboguer.

9. Éviter les effets de bord inutiles

Un effet de bord se produit lorsqu’une fonction modifie quelque chose à l’extérieur d’elle-même.

let total = 0;

function addToTotal(price) {

    total = total + price;

}

Cette fonction dépend d’une variable externe. Elle est donc plus difficile à tester.

Version plus propre :

function add(price, total) {

    return total + price;

}

10. Une fonction = une responsabilité

Une fonction devrait faire une seule chose.

function calculateTotal(price, tax) {

    return price + tax;

}

Si une fonction fait trop de choses, elle devient difficile à lire, tester et modifier.

11. Noms clairs

Un nom doit expliquer l’intention du code.

// Moins clair

const x = 100;

function calc() {

}
// Plus clair

const totalPrice = 100;

function calculateTotal() {

}

Un bon nom réduit le besoin de commentaires.

12. Tester les cas invalides en premier

En clean code, on place souvent les cas invalides au début.

function processUsername(username) {

    if (!username) {

        return "Nom invalide";

    }

    if (username.length < 3) {

        return "Nom trop court";

    }

    return "Nom valide";

}

Cette structure rend le code plus facile à suivre.

13. Éviter la duplication

Répéter le même code plusieurs fois augmente les risques d’erreur.

function displayError(message) {

    console.log("Erreur : " + message);

}

Une fonction réutilisable permet de centraliser la logique.

14. Code plat vs code imbriqué

Code imbriqué Code plat
Difficile à suivre Plus facile à lire
Beaucoup de else Early return
Complexité élevée Flux plus clair

15. Formule mentale

Gérer les cas invalides
↓
Retourner tôt
↓
Garder le cas normal clair

Cette mentalité aide à écrire du code plus propre.

16. Bonnes pratiques

Résumé rapide

Concept Utilité
Clean code Code lisible et maintenable
Early return Sortir rapidement d’une fonction
Guard clause Gérer un cas invalide au début
Happy path Chemin normal du programme
Fonction pure Fonction prévisible et testable
Effet de bord Modification externe à la fonction
Responsabilité unique Une fonction = une tâche
Nommage clair Code plus compréhensible