Devriez-vous refactoriser du code existant qui n'est pas cassé dans un projet axé sur de nouvelles fonctionnalités?


11

Étant donné un petit projet qui vise à ajouter de nouvelles fonctionnalités à l'application, les changements introduits touchent du code existant, impliquant la mise à jour de ceux-ci dans certains domaines. Pendant l'implémentation, j'ai trouvé que certains de ces codes qui ont été mis à jour ont des candidats pour une refactorisation.

Est-ce un moment approprié pour refactoriser ce qui nécessiterait à son tour des tests de régression pour les composants affectés (introduisant ainsi éventuellement une portée qui ne faisait pas initialement partie du projet)? Ou devrais-je différer, compléter la fonctionnalité et peut-être avoir un projet distinct pour le refactoring (bien que je sois un peu hésitant car les utilisateurs professionnels peuvent ne pas parrainer entièrement un projet qui n'ajoute aucune fonctionnalité, à moins qu'ils apprécient la maintenabilité du code ...)?


2
Avez-vous les tests en place vous permettant d'effectuer le refactoring souhaité?

2
Vous y avez répondu par vous-même, les clients ne se soucieront pas de la maintenabilité du code à moins que le code lui-même ne soit un livrable. Ils se soucient de l'argent et du temps et assument la qualité comme une donnée. La qualité, le temps et le coût sont directement liés à la dette technique, mais ils sont également liés à ce qu'ils sont prêts à accepter. Si vous n'intégrez pas le refactoring au fur et à mesure, la maintenabilité du code se dégradera et la dette technique montera en flèche sans relâche.
maple_shaft

Réponses:


17

Absolument.

La refactorisation doit se faire sur un projet de travail et de «réussite». Lorsque tous vos tests (au niveau de l'unité, du système et de l'acceptation) réussissent, vous savez que votre produit répond aux exigences. Lorsque vous refactorisez, vous pouvez continuer à confirmer que tous les tests continuent de passer. Si un test commence à échouer, vous avez fait quelque chose de mal et devez le corriger. Si vos tests échouent, vous devez les corriger avant de refactoriser afin de toujours vous assurer que votre refactoring ne modifie pas la fonctionnalité du système.

C'est également un moment idéal pour la refactorisation, en supposant que vous avez le temps et les ressources pour effectuer la refactorisation et toujours respecter les délais et le budget. La refactorisation maintenant facilitera la compréhension et la maintenance de votre système, de sorte que lorsque vous ajoutez encore plus de nouvelles fonctionnalités, cela devient plus facile. Vous devez lutter contre la pourriture du code et l' entropie logicielle .

Comme le souligne Joel Etherton dans les commentaires, vous devez gérer l'étendue de la refactorisation. Concentrez-vous sur la refactorisation des parties du système auxquelles vous allez bientôt ajouter des fonctionnalités, en effectuant des refactorisations qui faciliteront l'utilisation ou l'ajout de nouvelles fonctionnalités. L'utilisation d'analyses statiques, d'outils de métriques et de révisions de code peut vous aider à identifier les domaines les plus critiques. Vous ne voulez pas manquer les délais parce que vous refactorisez - vous devez toujours continuer à ajouter de la valeur au client.

Vous mentionnez que le client ne voit pas la valeur de la refactorisation. En règle générale, le client ne se soucie pas de la qualité du code, mais du produit. La refactorisation vous permettra de maintenir plus facilement une qualité de produit élevée et de continuer à livrer un produit qui répond aux besoins changeants du client. Essayez de négocier du temps pour la refactorisation dans votre calendrier (le client veut des fonctionnalités X dans Y jours, essayez de voir si vous ne pouvez pas obtenir les jours Y + Z ou les fonctionnalités XN afin que vous puissiez passer du temps sur la conception, la refactorisation et la mise en œuvre), si vous pouvez.


1
+1 spécialement pour le paragraphe sur la valeur du refactoring pour les clients.
Marjan Venema

1
En supposant que vous disposez d'un bon ensemble de tests unitaires pour valider la refactorisation ne change pas le comportement observé. Étant donné le choix du refactoring ou des tests unitaires. Ajoutez d'abord des tests unitaires.
Martin York

5
@Thomas Owens: +1 Je suis d'accord, mais j'ajouterais également une note de prudence sur le refactoring. Il est très facile pour le refactoring de lancer une cascade de refactoring qui peut alourdir le travail réel nécessaire et provoquer un zoom sur les délais.
Joel Etherton

@Joel C'est un bon point. Vous devez garder la refactorisation de portée limitée pour respecter les délais.
Thomas Owens

3

Pensez à répondre aux questions ci-dessous, il vous serait alors facile de prendre la décision. La sagesse «ne le répare pas s'il n'est pas brisé» est tentante mais pas toujours vraie pour le travail professionnel.

0-Y a-t-il une réclamation client concernant ce code?

1-Est-ce nécessaire pour la fonctionnalité de l'application

2-Le code actuel est-il dangereux?

3-Le coût du changement en vaut-il la peine?

4-Pourriez-vous vous permettre le coût?

5-Est-ce la meilleure utilisation de vos compétences pour l'organisation

6-Vos modifications obligeraient-elles votre utilisateur à réinstaller la nouvelle modification - Pourriez-vous justifier cela auprès du client?

7-Pourriez-vous tolérer le risque d'une mauvaise solution?

8-La modification affecte-t-elle un autre code en dehors de votre projet?

9-S'agit-il d'un produit évolutif ou stable? Si elle évolue, pourriez-vous inclure les modifications dans la prochaine version?


Vous avez lu mon esprit! Je pensais exactement à cette fameuse règle "ne la corrige pas si elle n'est pas brisée" pour justifier le report du refactoring!
Carlos Jaime C. De Leon

3

Refactorisez bientôt, refactorez souvent.

Si vous pouvez vous le permettre (temps, argent, etc.), vous devriez le faire.

Je dis cela parce que parfois vous pouvez manquer de temps, ou comme vous dites ne pas obtenir d'argent pour une intervention de maintenance de code, ou vous voulez terminer votre projet le plus tôt possible, et plus généralement parce que la refactorisation a besoin de ressources. Mais à part ça, c'est toujours un bon moment pour refactoring.

Vous voulez un code à jour, et si vous pensez que votre code a réellement besoin de quelques changements, en particulier lors de l'ajout de nouvelles fonctionnalités, vous devez le changer.

N'oubliez pas qu'avec un système de contrôle de version, vous pouvez réellement bifurquer votre projet dans une nouvelle branche, de sorte que vous n'affecterez pas du tout votre code actuel.


2

Si la refactorisation est nécessaire pour implémenter la nouvelle fonctionnalité, elle doit être effectuée et prise en compte dans le cadre du nouveau développement.

Avoir du code dupliqué vous coûtera (à la fois personnellement et à l'entreprise) plus à long terme, car les modifications sont effectuées à un endroit et non à un autre.

Vous devez disposer d'un ensemble de tests - soit des tests unitaires automatisés ou des tests de régression que vous pouvez exécuter pour prouver que vous n'avez pas introduit de problèmes dans la fonctionnalité existante.

Si le refactoring est juste "agréable à faire" - c'est-à-dire qu'il n'est pas directement dans le code affecté par la nouvelle fonctionnalité, alors je le laisserais tranquille. Vous introduisez un changement pour le plaisir de changer.


0

Il semble que la refactorisation du code facilitera l'ajout des nouvelles fonctionnalités; c'est la théorie. Inclure cela dans la portée des nouvelles fonctionnalités. Vous êtes plus susceptible d'obtenir l'adhésion des utilisateurs professionnels de cette façon. Dans ce cas, vous devriez pouvoir faire un argument contraignant et justifier le temps de refactoring. J'espère qu'ils comprendront que c'est une partie nécessaire du processus de développement et qu'ils auront moins d'objections. Il se peut que vous ne puissiez pas toujours démontrer cet avantage direct.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.