La refactorisation est - et devrait être - un processus continu. Il ne suffit pas de simplement répondre aux exigences avec une implémentation fonctionnelle et testée qui est encore un peu incomplète.
"Faites-le fonctionner, puis faites-le mieux" .
Je ne me souviens pas où j'ai lu cette citation, mais c'est la clé pour bien appliquer la refactorisation, et je considère qu'il n'est pas professionnel de faire autrement.
La refactorisation continue, c'est comme essuyer les déversements pendant que vous cuisinez et nettoyer vos plats après avoir mangé votre repas. La refactorisation ciblée, c'est comme trouver une cuisine sale, mais avoir seulement le temps de laver un verre sale ou deux. Préférez-vous vivre avec une cuisine continuellement sale, ou préférez-vous garder les choses propres au fur et à mesure?
Vous obtenez le code pour fonctionner, puis vous refactorisez votre code pour vous assurer que vous avez la meilleure implémentation que vous pouvez éventuellement utiliser. Si vous faites quelque chose de familier, il se peut que vous implémentiez le meilleur code la première fois, mais il faut prendre un moment pour revérifier votre travail pour en être sûr. S'il semble que vous pourriez améliorer votre code, vous essayez de refactoriser pour vous assurer que votre code est au moins aussi simple et propre que possible. Cela signifie que vous réduisez le montant de la dette technique que vous laissez derrière vous et que vous facilitez la lecture et la refonte la prochaine fois que le code doit être traité. Il s'agit de la valeur fondamentale derrière le mantra TDD "Red-Green-Refactor", sauf que là où dans TDD vous refactorisez principalement pour supprimer la duplication, il est également utile de revoir d'autres éléments qui pourraient être refactorisés, tels que les grandes classes, les méthodes longues,
Si vous vous retrouvez confronté à une refonte majeure, vous pouvez peut-être le reporter pendant un certain temps, en particulier si vous manquez de temps dans votre horaire. Ceci est toutefois fourni à condition que la fonctionnalité de votre code ne soit pas compromise, et à condition que l'implémentation continue de répondre aux exigences. Ce genre de situation devrait être rare, et vous pouvez vous assurer qu'il est encore plus rare si vous refactorisez continuellement au fur et à mesure. Plus important encore, cependant, vous ne pouvez pas risquer de laisser vos modifications majeures trop longtemps, sinon vous finirez par créer une charge de travail encore plus importante plus tard, ce qui pourrait être beaucoup plus coûteux à corriger ou finir par entraîner une charge encore plus coûteuse. échec du projet.
J'ai l'impression que beaucoup de gens ont tendance à confondre les définitions de Refactoring et Re-engineering . Les deux termes décrivent des stratégies pour gérer des situations très différentes. Si vous souhaitez réorganiser, vous vous engagez à effectuer un changement radical qui modifiera le comportement d'un système. Cela invalidera certains tests et nécessitera également de nouveaux tests. Lorsque vous refactorisez, vous vous assurez que votre système continue de se comporter exactementla même chose qu'avant le changement, mais vous vous assurez également que votre code aura une longévité et qu'il sera plus facile à maintenir au fil du temps. Vous n'êtes pas "proxénète" votre code pour le pire, vous vous engagez à une norme professionnelle de code propre qui réduira le risque d'échec et garantira que votre code reste un plaisir de travailler avec, et d'une norme professionnelle .
Pour revenir à l'analogie des fenêtres cassées, si vous cassez la fenêtre, vous devez la réparer immédiatement. Si vous n'avez pas remarqué qu'une fenêtre est cassée, vous devez décider du coût pour vous si vous laissez la fenêtre cassée. Maintenant, répétez les deux phrases précédentes, mais remplacez Bug par la fenêtre. Vous finissez par avoir besoin d'une stratégie différente. Si vous avez créé un bogue pendant que vous codez, vous le corrigez immédiatement, ou vous voyez si les modifications nécessiteront un effort de réingénierie, et vous décidez commercialement quand il sera préférable de régler le problème. Donc, vous ne refactorisez pas pour résoudre un problème, vous refactorisez pour vous assurer qu'il est plus facile de trouver et de résoudre les problèmes. Peu importe à quel point vous pensez que votre code est étonnant, les systèmes complexes auront toujours des problèmes qui devront être résolus au fil du temps. C'est à cela que sert la dette technique, et pourquoi le refactoring doit être un processus continu lorsque vous implémentez votre code , et non pas laissé pour un temps futur arbitraire.
Donc, en bref, la réponse selon laquelle il peut parfois être acceptable de différer des modifications majeures du code afin de fixer un délai, mais il ne devrait pas être considéré comme une pratique normale de traiter le refactoring comme un exercice indépendant de votre travail quotidien de mise en œuvre, et certainement jamais utilisé comme excuse par des équipes qui ne connaissent pas la base de code comme une option pour éviter de s'assurer que leur mise en œuvre est aussi simple et propre que possible dans les circonstances.