TDD, refactoring et code propre

R2.03 - Qualité de développement

IUT d'Aix-Marseille - BUT Informatique, 1re année

Au programme de ce CM

TDD approfondi
F.I.R.S.T., stratégies de Beck, ApprovalTests
🥋
Kata et pair programming
Driver, navigator, ping-pong
🧹
Code smells et refactoring
Fowler, characterization tests
Ce CM prépare TP3 - Kata et TP4 - Refactoring.

Où on en est

✓ CM1
Artisanat + Git + TDD intro
📍 CM2 (vous êtes ici)
TDD + Refactoring
TP3
Kata + pair prog
TP4
Refactoring
CC3
Kata sur feuille
Le socle posé en CM1 puis en TP1/TP2 est là. Aujourd'hui, on l'approfondit et on prépare directement TP3, TP4 et la logique du CC3.
🛠️ En CM1 on a vu pourquoi l'artisan prend soin de son code. Aujourd'hui, on voit comment il s'y prend au quotidien : tester avant, refactorer souvent, nommer juste. Les gestes qui transforment l'intention en habitude.

Partie 1 - TDD approfondi

On a vu le cycle RED-GREEN-REFACTOR. Maintenant, comment en tirer le maximum ?

🛠️ Un artisan n'expose jamais un outil qu'il n'a pas essayé lui-même.
Le TDD, c'est exactement ce geste : écrire le test d'abord, c'est s'obliger à savoir ce que l'outil doit faire avant de le forger. La table ne part chez le client qu'une fois essayée sur l'établi.

🔁 Rappel : le cycle RED-GREEN-REFACTOR

RED : j'écris un seul test. Il doit échouer pour la bonne raison (le comportement manque, pas une coquille de syntaxe).
GREEN : je code le minimum pour passer. Je n'ai pas le droit d'anticiper.
REFACTOR : je nettoie (noms, duplication, lisibilité). La suite de tests reste verte.

💰 Pourquoi ce cycle, économiquement

Le CM1 a montré la courbe du coût d'un bug : plus on le découvre tard, plus il coûte cher.

Le TDD attaque cette courbe au moment le moins cher : vous écrivez d'abord la condition qui devra être vraie, puis le code qui la rend vraie.

Autrement dit : au lieu de passer du temps à débugger après, vous investissez quelques secondes à sécuriser avant.

1 test écrit = 1 bug potentiel neutralisé
au moment le moins cher
Le TDD ne supprime pas le travail ; il le déplace vers le moment où il est le moins coûteux.

🚦 Les 3 lois du TDD (Uncle Bob)

  1. Tu n'écriras pas de code de production tant qu'un test échoue ne l'exige.
  2. Tu n'écriras pas plus de test qu'il n'en faut pour échouer (une erreur de compilation compte comme un échec).
  3. Tu n'écriras pas plus de code de production qu'il n'en faut pour faire passer le test qui échoue.
Ces lois semblent extrêmes. Elles sont là pour forcer les baby-steps.
À chaque cycle, vous alternez entre production et test toutes les 30 secondes à 2 minutes.

🎯 Fake it / Triangulation / Obvious : laquelle choisir ?

On les a vues au CM1. Au TP2, vous vous êtes probablement demandé : laquelle appliquer à ce test-là ? Voici la décision rapide :

🎭 Fake it d'abord, toujours
Même quand la solution semble évidente. Pourquoi : fake it vérifie que le test est juste, avant de se soucier du code.
Le test passe avec une constante en dur ? OK, le test est bien formulé.
📐 Triangulation quand...
... le 2e ou 3e test vous force à généraliser. Ajoutez un cas différent, et le comportement commun émerge tout seul.
FizzBuzz : après 3 tests (1, 3, 5), la logique if/else se dessine.
💡 Obvious seulement si...
... la solution tient en une ligne et vous ne pouvez pas vous tromper. Doute = pas obvious.
return a + b; dans un addArithmetique(int, int).
⚠️ Anti-pattern fréquent en BUT1 : "je sais déjà comment coder, je vais directement en obvious." Résultat : le test n'est jamais rouge, vous ne savez pas s'il vérifie vraiment quelque chose. Fake it d'abord, toujours - même 10 secondes, pour voir le test passer du rouge au vert.

✅ Qu'est-ce qu'un bon test ? Le principe F.I.R.S.T.

Lettre Signifie Pourquoi
Fast Rapide (quelques ms) On les lance des dizaines de fois par heure
Independent Indépendants entre eux Changer l'ordre ne doit rien casser
Repeatable Reproductible Pas de dépendance au réseau, à l'heure, à un fichier temporaire
Self-validating Auto-vérifiant Rouge ou vert, pas de "regardez le log"
Timely Écrit au bon moment Avant le code, pas après
Robert C. Martin (Clean Code, 2008)
🛠️ F.I.R.S.T., c'est la check-list de l'artisan qui vérifie que son banc de tests reste un banc, pas un gouffre. Un test lent, fragile, dépendant des voisins, c'est un outil émoussé qu'il faut affûter ou jeter.

🧪 La structure AAA d'un test

Arrange
Préparer l'environnement, les données, les dépendances.

Act
Déclencher le comportement testé (UNE seule action).

Assert
Vérifier le résultat (idéalement UNE assertion principale).

@Test
void additionne_deux_entiers_positifs() {
  // Arrange
  Calculatrice c = new Calculatrice();

  // Act
  int resultat = c.additionner(2, 3);

  // Assert
  assertThat(resultat).isEqualTo(5);
}
💡 Astuce nommage : nom_scenario_comportement_attendu ou should_X_when_Y. Un bon nom de test se lit comme une phrase.

📝 Exemple : noms de tests parlants

❌ Pas clair

@Test void test1() { ... }
@Test void testAdd() { ... }
@Test void testCalc() { ... }
@Test void bugFix12345() { ... }

On ne sait pas ce qui est testé, ni quel comportement est attendu.

✅ Clair

@Test void additionne_deux_positifs()
@Test void additionne_avec_zero_retourne_lautre_nombre()
@Test void solde_negatif_leve_exception()
@Test void panier_vide_a_un_total_zero()

On lit le test comme une spécification.

🥋 Ce qu'on vise au TP3 (kata Tennis) : des tests qui racontent une partie, pas des numéros.
@Test void partie_tombe_a_egalite_apres_deux_points_partout()
@Test void le_serveur_gagne_la_partie_apres_quatre_points()
@Test void avantage_au_receveur_apres_egalite_puis_point_receveur()

🥋 Grounding : ces principes sur un vrai kata

Le kata Tennis du TP3 illustre tout ce qu'on vient de voir. Voici 3 tests pris dans leur ordre d'écriture :

Test 1 - Fake it
@Test
void debut_de_partie_est_0_0() {
  assertThat(new Tennis().score())
    .isEqualTo("0-0");
}

// Impl: return "0-0";

Le test passe avec une constante. On sait que le test est juste.
Test 2 - Triangulation
@Test
void apres_point_serveur_15_0() {
  Tennis t = new Tennis();
  t.pointPourServeur();
  assertThat(t.score())
    .isEqualTo("15-0");
}
Force à stocker un état. La constante ne suffit plus.
Test 3 - Triangulation
@Test
void apres_deux_points_serveur_30_0() {
  Tennis t = new Tennis();
  t.pointPourServeur();
  t.pointPourServeur();
  assertThat(t.score())
    .isEqualTo("30-0");
}
Force une vraie table (0, 15, 30, 40). La logique émerge.
Chaque test est un pas. La conception s'invente au fur et à mesure - pas avant.

🎭 Test doubles : à quoi ça sert ?

Quand le code testé dépend d'autre chose (base de données, service externe, horloge), on peut remplacer la vraie dépendance par un double.

🪨 Stub / Fake
Renvoyer une réponse contrôlée ou une implémentation simplifiée.
🎯 Mock / Spy
Observer comment une dépendance est appelée.
Dans ce module, l'outillage vraiment pratiqué est surtout ApprovalTests (TP2) et le pair programming ping-pong (TP3). Retenez surtout l'idée générale : isoler ce qu'on ne contrôle pas.

📸 ApprovalTests : quand la sortie est textuelle

Pour du code qui produit une sortie complexe (grille, JSON, rapport), écrire l'attendu à la main est pénible.

@Test
void grille_demineur_5x5() {
  List<String> entree = List.of(
    " *   ",
    "     ",
    "  *  ",
    "     ",
    "   * "
  );
  List<String> sortie =
    new GrilleDemineur(entree).annotee();
  Approvals.verifyAll("", sortie);
}

Principe

  1. Je lance le test
  2. La sortie va dans ...received.txt
  3. Je vérifie visuellement
  4. Je renomme receivedapproved
  5. Le test compare ensuite received à approved
Utilisé au TP2 exercice 5 (Démineur) - gain énorme sur les grandes grilles.

💡 Règles pour ne pas se planter en TDD

❌ Ne pas écrire plusieurs tests à la suite sans coder.
Un test écrit, un test codé. Sinon vous perdez le filet de sécurité.
❌ Ne pas écrire du code qui n'est pas couvert par un test.
Si vous écrivez une branche if en plus, un test doit l'exiger.
❌ Ne pas sauter le REFACTOR.
Le cycle est à 3 étapes, pas à 2. Sinon la dette technique explose.
✅ Vérifier que le test échoue avant de coder.
Sinon vous risquez un faux positif : un test qui passait déjà.
✅ Commit à chaque GREEN ou REFACTOR.
Chaque état vert est un point de sauvegarde exploitable.
✅ Un seul test qui échoue à la fois.
Focaliser l'attention. Pas 5 rouges en parallèle.

📊 Pyramide des tests

Beaucoup de tests unitaires : rapides, ciblés, relancés tout le temps.
Moins de tests d'intégration : plusieurs briques ensemble.
Encore moins de tests bout-en-bout : lents, fragiles, coûteux.
Dans ce module, on travaille surtout la base : les tests unitaires. C'est là que le TDD vit vraiment.

🧬 Aparté : couverture != qualité des tests

Couverture = "quelles lignes ont été exécutées ?"
Qualité des tests = "est-ce qu'ils détectent vraiment un bug ?"
Une ligne peut être couverte à 100 % avec un test sans assertion. La couverture est utile, mais elle ne suffit pas à dire qu'une suite de tests est bonne.
À retenir sans en faire une obsession : un beau pourcentage de couverture ne prouve pas, à lui seul, qu'une suite de tests est utile.

🌄 Où s'arrête le TDD ?

Ce que le TDD fait bien
  • Cadrer une intention avant de coder
  • Donner un filet pour refactorer sereinement
  • Produire une documentation vivante du comportement
  • Forcer un découplage (sinon le test devient injouable)
Ce que le TDD ne fait PAS
  • Garantir que le produit est utile pour le client
  • Remplacer la revue de code et le pair programming
  • Couvrir les bugs d'intégration, de perf, d'ergonomie
  • Dispenser de penser - un test tautologique passera toujours
🛠️ L'artisan connaît ses outils - et leurs limites. Un marteau ne visse pas une vis, même très bien utilisé. Le TDD est un outil puissant pour le code qui prend en charge une logique claire ; il ne remplace ni les tests d'intégration, ni la relecture humaine, ni l'entretien avec le client qui dira si l'ouvrage correspond à son besoin.

Partie 2 - Le kata et le pair programming

Comment on devient meilleur ? En répétant des gestes simples.

🥋 Qu'est-ce qu'un kata ?

Dans les arts martiaux, un kata est une séquence de mouvements qu'on répète jusqu'à ce que le corps l'exécute sans y penser.

En programmation, un coding kata est un petit exercice qu'on refait plusieurs fois pour :

  • automatiser des gestes (raccourcis IDE, TDD, refactoring)
  • essayer des approches différentes
  • comparer avec d'autres développeurs

Concept popularisé par Dave Thomas (The Pragmatic Programmer, 2003).

🎯 Le but n'est pas de résoudre le problème.
Le problème, vous le connaissez déjà.

Le but, c'est d'améliorer votre façon de le résoudre.

Analogie : un pianiste ne joue pas ses gammes pour "réussir les gammes". Il les joue pour garder la main.

🥋 Quelques kata célèbres

🗓️ Années bissextiles
Petit kata idéal pour travailler les règles booléennes.
🎾 Tennis scoring
Afficher le score d'un jeu de tennis. Idéal pour les state machines.
🎲 Yahtzee
Scorer les combinaisons d'un jet de 5 dés. Bon terrain pour la stratégie.
🏪 Gilded Rose (Emily Bache)
Kata de refactoring sur du legacy volontairement horrible.
Au TP3, on en fera 5 : Années bissextiles, Tennis, Gestion employés, Pagination, Yahtzee.

🤔 Pourquoi refaire un kata qu'on sait résoudre ?

🏃 1ère fois : je galère, je découvre les règles. Je code "quelque chose qui marche".
2ème fois : je vais plus vite, je vois les pièges. Je soigne le nommage.
3ème fois : je teste une autre approche (fake-it seulement, triangulation seulement).
10ème fois : je suis fluide. Je peux me concentrer sur le style, pas le problème.
Un sportif ne s'entraîne pas le jour du match. Un développeur non plus.

👥 Le pair programming

Deux personnes, un clavier.

🎮 Driver
Celui qui tape. Se concentre sur le comment (syntaxe, IDE, tests qui passent).
🧭 Navigator
Celui qui pense. Se concentre sur le quoi (design, edge cases, lisibilité).
On échange les rôles toutes les 7 à 10 minutes.

Bénéfices

  • Moins de bugs (deux cerveaux sur chaque ligne)
  • Montée en compétences croisée
  • Moins de "bus factor" sur le code
  • Revue de code permanente, en temps réel
  • Effet antisomnolent 😴

⚠ Attention

  • Pas le même que "un qui code, un qui regarde son téléphone"
  • Fatigant - faire des pauses toutes les heures

🏓 Le ping-pong TDD

Un cas particulier très puissant de pair programming :

  1. A écrit un test qui échoue (RED).
  2. B écrit le code qui fait passer (GREEN).
  3. B écrit le test suivant qui échoue (RED).
  4. A écrit le code qui fait passer (GREEN).
  5. À tour de rôle pour REFACTOR.
✅ Avantage 1 : chacun des deux devine l'intention de l'autre. Excellent pour le design.
✅ Avantage 2 : impossible d'écrire du code "en douce" sans test. Le coéquipier impose la discipline.
✅ Avantage 3 : on voit immédiatement si un test est mal écrit - l'autre ne sait pas quoi coder.

🎯 Démo en ouverture du TP3

Au début du TP3, on fera 20 min de kata live en pair programming.

Kata retenu : Tennis scoring
Un état (jeu en cours) + un comportement (marquer un point) → l'affichage du score.
Ce que vous verrez :
- Alternance driver/navigator toutes les ~5 min
- Commit à chaque GREEN
- Pas de shortcut IDE (vous devez suivre)
🥋 Le but : que vous voyiez à quoi ressemble une séance TDD en binôme - pas juste lire le texte d'un kata.

Partie 3 - Code smells et refactoring

Du code qui marche, mais qui pue. On fait quoi ?

🛠️ Un artisan entretient ses outils.
Le menuisier aiguise sa scie entre deux chantiers. Le chef récure ses couteaux en fin de service. Pas par perfectionnisme - parce que demain ils s'en servent encore. Refactorer, c'est exactement ce geste : on ne le fait pas pour faire joli, on le fait pour rester rapide ensuite. Le code qu'on lit cette semaine, c'est celui qu'on modifiera le mois prochain.

👃 Qu'est-ce qu'un code smell ?

Terme inventé par Kent Beck et popularisé par Martin Fowler (Refactoring, 1999).

Un code smell est un indice que quelque chose ne va pas dans votre code. Pas un bug, pas une erreur de compilation - juste un signal qui dit :

"Attention, cette zone devient difficile à maintenir."

Un peu comme un aliment qui sent bizarre : pas forcément périmé, mais il faut regarder de près.

👃
"If it stinks, change it." - Kent Beck

📚 Les smells qu'on va surtout rencontrer au TP4

📏 Long Method
Une méthode de 50 lignes qu'on scroll pour la lire.
Solution : Extract Method.
🏢 Large Class
Une classe qui fait trop de choses.
Solution : Extract Class.
📋 Long Parameter List
Une méthode à 7 paramètres, imbuvable à l'appel.
Solution : Introduce Parameter Object.
👯 Duplicated Code
Le même bloc copié-collé en 3 endroits.
Solution : Extract Method / Move Method.
🔢 Magic Numbers
if (age > 65), total *= 1.20.
Solution : Replace Magic Number with Constant.
🔀 Switch Statements
Un switch sur un type, dupliqué en 5 endroits.
Solution : Replace Conditional with Polymorphism.
🧩 Data Clumps / Primitive Obsession
Des données voyagent toujours ensemble sans avoir de vrai type.
Solution : Introduce Parameter Object / Replace Primitive with Object.
Retenez surtout le réflexe : un smell n'est pas une faute, c'est un signal qu'une zone du code va devenir pénible à modifier.

🔧 Qu'est-ce qu'un refactoring ?

Refactoring : modifier la structure interne du code

sans changer son comportement observable.

Martin Fowler, Refactoring: Improving the Design of Existing Code (1999, 2018)
✅ Refactoring
Renommer une variable, extraire une méthode, bouger un champ dans une autre classe.
Les tests existants continuent de passer.
❌ Pas un refactoring
Changer ce que fait une méthode, ajouter une fonctionnalité, corriger un bug.
→ Là, les tests changent (ou en deviennent rouges).
🛡️ Prérequis absolu : une suite de tests qui couvre le comportement. Sinon vous faites du rewriting, pas du refactoring.

📖 Le catalogue de Fowler (70+ refactorings)

🏷️ Rename
Le plus fréquent.
✂️ Extract Method
Pour rendre une intention lisible.
📦 Extract Class
Quand une classe fait trop de choses.
🦎 Polymorphism
Quand un switch devient pénible.
Il existe un vocabulaire commun pour nommer ces transformations. Les TP4 vous font justement pratiquer quelques entrées très classiques de ce catalogue.

🧪 Exemple : Extract Method

Avant (smell : Long Method)

void imprimerFacture(Client c, List<Article> a) {
  // entête
  System.out.println("=== FACTURE ===");
  System.out.println("Client : " + c.nom());
  System.out.println("Date : " + LocalDate.now());

  // lignes
  for (Article art : a) {
    System.out.printf("  %s x%d : %.2f€%n",
      art.nom(), art.qte(), art.prix() * art.qte());
  }

  // total
  double t = 0;
  for (Article art : a) t += art.prix() * art.qte();
  System.out.printf("TOTAL : %.2f€%n", t * 1.20);
}

Après

void imprimerFacture(Client c, List<Article> a) {
  imprimerEntete(c);
  imprimerLignes(a);
  imprimerTotal(a);
}

void imprimerEntete(Client c) {
  System.out.println("=== FACTURE ===");
  System.out.println("Client : " + c.nom());
  System.out.println("Date : " + LocalDate.now());
}

void imprimerLignes(List<Article> a) { /* ... */ }

double calculerTotalHT(List<Article> a) {
  return a.stream()
    .mapToDouble(x -> x.prix() * x.qte()).sum();
}
Code de gauche : on doit tout lire pour comprendre. Droite : on lit imprimerFacture comme un sommaire.

🧪 Exemple : Replace Conditional with Polymorphism

Avant (smell : Switch Statements)

class Animal {
  String type;

  String faireDuBruit() {
    switch (type) {
      case "chien":  return "Wouf !";
      case "chat":   return "Miaou !";
      case "vache":  return "Meuh !";
      case "canard": return "Coin coin !";
      default: throw new IllegalStateException();
    }
  }
}

Chaque nouveau type → modifier cette classe.

Un switch sur le type est souvent dupliqué.

Après

abstract class Animal {
  abstract String faireDuBruit();
}

class Chien extends Animal {
  String faireDuBruit() { return "Wouf !"; }
}

class Chat extends Animal {
  String faireDuBruit() { return "Miaou !"; }
}

class Vache extends Animal {
  String faireDuBruit() { return "Meuh !"; }
}

Nouveau type → nouvelle classe. Pas touche au reste.

Principe Open/Closed : ouvert à l'extension, fermé à la modification.

🛠️ Votre IDE fait le gros du travail

Un refactoring manuel est risqué. Un oubli, un mauvais remplacement → comportement changé.

Les TP se font dans le Codespace VS Code avec l'extension Java officielle (Red Hat). Les gestes de refactoring passent par deux entrées :

  • Ctrl+. (ou Cmd+. sur Mac) : menu Quick Fix + Refactor contextuel. Propose Extract to method, Extract to constant, Extract to variable / field, Move..., Inline..., Add unimplemented methods selon ce que le curseur touche.
  • F2 : Rename (propage partout, imports + Javadoc inclus).

💡 Règle pragmatique

Si tu peux faire le refactoring avec un raccourci IDE, fais-le avec. Si tu dois le faire à la main, ajoute d'abord des tests.

Au TP4, on abuse de Ctrl+. et F2. Le README liste la correspondance raccourci → refactoring pour chaque exercice.

IntelliJ IDEA fait les mêmes refactorings avec Ctrl+Alt+M, Ctrl+Alt+V, Shift+F6... si vous préférez l'utiliser en dehors des TP.

🛡️ Characterization tests : sécuriser du legacy

Concept de Michael Feathers (Working Effectively with Legacy Code, 2004).

Legacy code = du code sans tests, qu'on doit faire évoluer.

Problème : on veut refactorer, mais sans tests on n'a pas de filet.

Solution : des characterization tests - des tests qui décrivent le comportement actuel du code, qu'il soit "juste" ou non.

Démarche

  1. Je prends le code en entrée.
  2. Je lance le code, j'observe la sortie.
  3. J'écris un test qui attend cette sortie.
  4. Le test passe - je l'ai figé.
  5. Maintenant je peux refactorer : si un test casse, j'ai changé le comportement (donc j'ai un bug, pas un refactoring).
Ces tests ne valident pas que le code est juste - ils le pinnent.

🎯 Le pattern du TP4

Chaque exercice du TP4 suit le même squelette, avec deux familles de tests :

Deux filets de tests, deux rôles :
Caractérisation (active, verte dès le départ) : pin le comportement. Elle doit rester verte après chaque transformation - c'est votre garde-fou anti-régression.
Structure (@Disabled au départ) : vérifie que votre refactoring a produit la bonne extraction (méthode, constante, classe, record). Vous la débloquez au fur et à mesure. Elle prouve que le geste a été fait, pas juste que rien n'est cassé.
⚠️ Si une caractérisation casse, ne la modifiez pas pour la faire passer. Annulez votre dernière transformation (git restore .). Votre "refactoring" était un bug.

🌹 Le kata Gilded Rose

Créé par Terry Hughes, popularisé par Emily Bache.

Un magasin vend des articles qui évoluent tous les jours :

  • Articles normaux (perdent en qualité)
  • Aged Brie (gagne en qualité)
  • Sulfuras (immuable)
  • Backstage passes (complexe)
  • Conjured (à ajouter)

Le code source tient en 35 lignes - mais quelles lignes. if imbriqués, noms cryptiques, duplication partout.

Votre mission :

  1. Comprendre (characterization tests)
  2. Refactorer (sans casser)
  3. Ajouter la fonctionnalité Conjured

Pourquoi ce kata est devenu un classique

C'est exactement la situation d'un développeur qui arrive dans une entreprise :

  • du code qu'il n'a pas écrit
  • sans docs
  • qu'il faut modifier
  • sans casser l'existant

Ajouter Conjured directement dans le code spaghetti est très risqué. Le refactoring d'abord rend le changement trivial.

🎬 Démo live en ouverture du TP4 (20 min).

🌄 Où s'arrête le refactoring ?

Refactorer vaut le coup quand...
  • vous allez toucher cette zone dans les prochains mois
  • le smell ralentit concrètement une feature ou un bug fix
  • vous avez des tests qui prouvent que rien ne casse
  • c'est l'endroit précis où vous intervenez (règle du scout)
Refactorer est un piège quand...
  • le code marche, est stable et personne ne le touche
  • vous le faites juste parce que "c'est pas joli"
  • il n'y a pas de tests pour sécuriser - vous allez casser
  • vous refactorez et ajoutez une feature en même temps
🛠️ L'artisan qui retourne son atelier tous les jours ne travaille plus - il range. Le refactoring a un coût : du temps, un risque résiduel, une PR à relire. On le justifie toujours par un bénéfice concret à venir, pas par un idéal d'esthétique.

Quelques gestes à garder

Trois habitudes simples pour la suite : ranger un peu, nommer mieux, commenter moins.

🏕️ La règle du scout

"Leave the campground cleaner than you found it."

Laisse le campement plus propre que tu ne l'as trouvé.

Adapté du scoutisme par Robert C. Martin (Clean Code, 2008)
Chaque fois que vous touchez un fichier, vous le laissez un peu mieux.
Un nom plus clair, une méthode extraite, un test ajouté.
🛠️ C'est le geste de l'artisan qui range son atelier avant de partir. Pas pour la démonstration, pas pour la photo - parce que demain matin il veut retrouver un atelier où il peut travailler vite. La règle du scout appliquée au code, c'est la même économie : l'artisan soigne son environnement parce que c'est là qu'il vit.
💡 Effet cumulé : 20 développeurs qui améliorent 2 lignes à chaque PR = la base de code s'auto-nettoie. Inverse du cercle vicieux de la dette technique.

🏷️ Le nommage : première victoire

"There are only two hard things in Computer Science: cache invalidation and naming things." - Phil Karlton

❌ int d;

❌ List<Integer> list;

❌ void doStuff() { ... }

❌ boolean flag = true;

✅ int joursRestants;

✅ List<Integer> ageEtudiants;

✅ void envoyerRappel() { ... }

✅ boolean estInscrit = true;

Classe : nom commun
Commande, Facture
Méthode : verbe
calculer, envoyer
Booléen : question
estValide, aPaye

💬 Les commentaires : utiliser avec parcimonie

❌ Commente pour compenser

// Vérifie si l'utilisateur a plus de 18 ans
if (u.getA() > 18) { ... }

→ Renomme plutôt : if (utilisateur.estMajeur()).

✅ Commente le pourquoi

// Le SDK distant exige un id positif strict ;
// 0 provoque un NPE côté serveur.
if (id <= 0) throw ...;

→ Information qui ne peut pas être déduite du code.

Règle : avant d'écrire un commentaire, demandez-vous si un meilleur nom ou une méthode extraite rendrait le commentaire inutile.

Pour la suite

Le prochain cap est simple : mettre ces gestes en pratique, d'abord à deux, puis sur du legacy.

📅 Ce qui vous attend

🥋 TP3
5 kata en pair programming :
années bissextiles, tennis, employés, pagination, yahtzee.

Driver / navigator, ping-pong TDD.
🧹 TP4
6 exercices de refactoring : Facture (Extract Method), CalculPrix (Magic Number), Menu (Extract Class), Animal (Polymorphisme), ServiceNotification (Parameter Object), Gilded Rose.

Caractérisation active et verte + tests de structure @Disabled à débloquer.
💻 CC3
Mini-kata TDD sur feuille, 2 h.

Pas d'IDE, pas de compilateur - juste la démarche TDD appliquée à un problème simple.

Des questions ?

Sébastien Nedjar
IUT d'Aix-Marseille - Département Informatique

🌐 github.com/IUTInfoAix-R203/tp

📧 sebastien.nedjar@univ-amu.fr

🎯 Dès maintenant : dans votre Codespace, essayez F2 pour renommer un identifiant, puis sélectionnez quelques lignes et lancez Ctrl+.Extract to method. Le plus tôt vos doigts connaissent ces deux gestes, le mieux vous vivrez les TP3 et TP4.
🛠️ L'artisan, au fond, c'est vous. Le CM1 a posé le pourquoi - du code dont on peut être fier, qu'on n'a pas peur de relire dans six mois. Ce CM2 a posé les gestes - tester avant, refactorer souvent, nommer juste, ranger en partant. À partir du TP3, le seul objectif est que ces gestes deviennent des réflexes. On n'aiguise pas sa scie le jour où on doit couper la planche ; on l'aiguise la veille.