Refactoring sûr avec des agents IA
Un agent peut discrètement changer le comportement pendant un refactoring, au lieu de ne changer que la structure – les tests et les petites étapes empêchent ça.
Ce que refactoring signifie vraiment
Refactoring veut dire : améliorer la structure interne du code sans changer son comportement visible de l'extérieur. Le terme a surtout été popularisé par le livre du même nom de Martin Fowler. Le « sans changer le comportement » est la partie essentielle – et c'est justement elle qui se perd facilement avec les agents IA si personne ne l'exige explicitement.
Pourquoi les agents dérapent ici
En restructurant, un agent voit souvent des choses qui lui semblent « fausses » – une condition bizarre, une vérification en double. Sans consigne claire, il « corrige » ça au passage au lieu de seulement restructurer. Un refactoring pur se transforme ainsi, sans qu'on s'en aperçoive, en changement de comportement.
Les trois principales garanties
- Les tests d'abord : avant la restructuration, une suite de tests doit exister pour garantir le comportement actuel. Sans tests, tu ne peux pas vérifier si quelque chose a changé.
- Petites étapes : une modification par étape, exécuter les tests après chaque étape, committer chaque étape verte séparément.
- Exiger explicitement la préservation du comportement : dis clairement « refactore sans changer le comportement » plutôt que juste « améliore ce code ».
Pièges classiques
L'agent change silencieusement une interface publique, supprime du code qui lui semble mort mais qui est en fait appelé dynamiquement, ou mélange refactoring et demandes de fonctionnalités en une seule fois.
EXEMPLE
Prompt : « Extrais la logique de validation de processOrder() dans une fonction séparée validateOrder(). Le comportement ne doit pas changer. Après l'extraction, exécute la suite de tests existante et signale-le si un test échoue, avant de continuer. »
🛠️ EXERCICE — À TOI DE JOUER
Prends une fonction de ton propre projet qui fait trop de choses à la fois, et fais-la refactorer par un agent en petites étapes sécurisées par des tests.
- Vérifie d'abord s'il existe un test qui couvre la fonction. Si non : fais d'abord écrire un test qui capture le comportement actuel.
- Demande explicitement à l'agent : « Extrais [partie X] dans une fonction séparée, le comportement ne doit pas changer. Exécute les tests après chaque étape. »
- Lis le diff avant de committer – cherche spécifiquement des changements qui vont au-delà de la simple restructuration.
✅ AUTO-VÉRIFICATION
- ☐ Tous les tests sont-ils encore verts après le refactoring – et est-ce que ça avait déjà été vérifié avant ?
- ☐ Le diff contient-il une ligne qui ne fait pas que déplacer du code, mais change une condition, une valeur ou un message d'erreur ?
- ☐ Le commit a-t-il été fait d'un seul coup, ou les étapes individuelles peuvent-elles être retracées séparément ?
QUIZ RAPIDE
Quelle est la condition la plus importante avant qu'un agent IA effectue un refactoring important sur du code existant ?
SOURCES
- Martin Fowler: Refactoring (Buchübersicht) ↗ martinfowler.com
- Refactoring.com: Katalog der Refactorings ↗ refactoring.com
- Anthropic: Claude Code Best Practices ↗ code.claude.com
- Claude Code: Manage costs effectively ↗ code.claude.com