Quarante lignes pour une demande de trois
Un assistant de code qui travaille dans votre projet ne rend pas une réponse : il rend un changement. Ce changement s’appelle un diff, la liste des lignes ajoutées et retirées.
Il peut faire bien plus que ce qu’on lui a demandé. Cette leçon apprend à lire un diff face à la demande, et à décider de le garder, de le modifier ou de le jeter.
À la fin de cette leçon
Remarque
Je peux lire le changement d’un assistant et décider de le garder, de le modifier ou de le jeter.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Diff | la liste des lignes ajoutées et retirées |
| Bloc modifié | un groupe de lignes changées au même endroit |
| Hors demande | touché alors que la demande ne le disait pas |
| Test retiré | un test supprimé par le changement |
| Décision | garder, modifier ou jeter le changement |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une demande possible
Voici une demande possible : « Dans remise.js, ajoute une remise de 10 pour cent dès dix articles. Ne touche à aucun autre fichier. Ne renomme rien et ne retire aucun test. »
Ce que l’assistant fait change d’une fois à l’autre. La demande est votre mesure : tout ce que le diff fait en plus est à examiner.
Commencez par la liste des fichiers touchés
Avant de lire une seule ligne, regardez quels fichiers ont changé. Un fichier que la demande ne citait pas est un signal. Un fichier de réglages, un fichier de secrets ou un fichier de tests mérite deux fois plus d’attention.
Les cinq Run suivants écrivent deux dossiers avant/ et apres/ dans demo-diff/. Le second est écrit à la main avec des défauts : ce n’est pas la réponse d’un assistant.
Écrire le code d’avant
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/avant && printf '%s\n' '// Prix de quantite articles, en centimes. Pas de remise.' 'function prix(quantite, centimes) {' ' return quantite * centimes;' '}' 'module.exports = { prix };' > demo-diff/avant/remise.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire les essais d’avant
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/avant && printf '%s\n' 'const m = require(\"./remise.js\");' 'function verifier(nom, vrai) {' ' console.log((vrai ? \"ok : \" : \"echec : \") + nom);' '}' 'verifier(\"un article\", m.prix(1, 150) === 150);' 'verifier(\"neuf articles\", m.prix(9, 150) === 1350);' 'verifier(\"dix articles\", m.prix(10, 150) === 1500);' > demo-diff/avant/essais.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le code d’après
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/apres && printf '%s\n' '// Prix de quantite articles, en centimes, avec 10 pour cent de remise des dix articles.' 'function calculerPrix(quantite, centimes) {' ' const brut = quantite * centimes;' ' if (quantite >= 10) return Math.round(brut * 0.9);' ' return brut;' '}' 'module.exports = { calculerPrix };' > demo-diff/apres/remise.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire les essais d’après
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/apres && printf '%s\n' 'const m = require(\"./remise.js\");' 'function verifier(nom, vrai) {' ' console.log((vrai ? \"ok : \" : \"echec : \") + nom);' '}' 'verifier(\"un article\", m.calculerPrix(1, 150) === 150);' 'verifier(\"neuf articles\", m.calculerPrix(9, 150) === 1350);' > demo-diff/apres/essais.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire un fichier de plus
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/apres && printf '%s\n' '// Reglage ajoute.' 'module.exports = { envoyerStatistiques: true };' > demo-diff/apres/reglages.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lister les fichiers qui ont changé
docker exec -w /home/node/project/demo-diff agent env LC_ALL=C diff -rq avant apresAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lisez ensuite chaque bloc modifié
Dans un diff, < marque une ligne retirée et > une ligne ajoutée. Lisez chaque bloc en vous demandant s’il sert la demande. Un bloc qui renomme une fonction, déplace du code ou retire une ligne de test ne sert pas une remise.
Notez ce qui est dans la demande, ce qui est en plus, et ce qui manque.
Lire le diff complet
docker exec -w /home/node/project/demo-diff agent env LC_ALL=C diff -r avant apresAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un test retiré rend le reste vert
Un assistant qui veut que tout passe peut retirer le test qui gêne. Comparez le nombre de tests avant et après. Puis lancez les deux jeux : s’ils sont verts tous les deux, vérifiez ce que le plus petit ne vérifie plus.
Ici, le test des dix articles a disparu, et c’est le seul qui touchait le bord de la nouvelle règle.
Lancer les essais et compter les tests
docker exec -w /home/node/project/demo-diff agent sh -c "node avant/essais.js; node apres/essais.js; grep -c ^verifier avant/essais.js apres/essais.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent que si la demande est faite et que les tests passent, le diff peut être gardé. Le diff peut aussi faire autre chose : renommer, retirer un test, ajouter un fichier. Lisez toujours ce qu’il fait en plus de la demande.
Exemple travaillé : garder, modifier ou jeter
| Ce que vous voyez | Décision | Pourquoi |
|---|---|---|
| Seulement ce que la demande disait | Garder | Rien à reprocher, vérifié par les tests |
| Un fichier ou un bloc en plus, sans danger | Modifier | On demande de le retirer et on relit |
| Un test retiré ou un fichier sensible | Jeter | On ne peut pas lui faire confiance |
| Trois problèmes ou plus | Jeter | Mieux vaut redemander en plus petit |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Plus loin : essayer sur un autre changement
C’est le bon moment pour essayer ces idées sur un autre changement. Ne touchez pas au bogue du labo, qui est le travail de la leçon 6. Demandez plutôt une petite règle de remise dans une copie du projet.
Écrivez ce que la demande permet de toucher, lisez la liste des fichiers puis chaque bloc, et comptez les tests avant et après. Dites si vous gardez, modifiez ou jetez, et pourquoi.