Devrais-je supprimer le code non référencé?

118

Je travaille sur une base de code de taille moyenne (100 000 lignes), elle est relativement récente (moins d'un an) et offre une bonne couverture de tests unitaires.

Je n'arrête pas de rencontrer des méthodes qui ne sont plus utilisées nulle part ou qui ne sont référencées que dans des tests unitaires qui testent uniquement cette méthode spécifique.

Devrais-je supprimer ce code si je suis certain qu'il n'est plus nécessaire?

Raisons pour l'enlever:

  • Moins de code, moins de bugs
  • Moins de code est plus facile à digérer pour les autres
  • Il est toujours sous contrôle de source

Raisons pour le garder:

  • Peut être utilisé comme référence
  • Il peut être utile parfois
  • Il a peut-être été écrit pour "compléter" la fonctionnalité d'une classe
Simon Hutton
la source
22
"Moins de code, moins de bugs" - s'ils ne sont vraiment jamais utilisés, ils ne risquent pas de causer des bugs
Konrad Morawski
19
@ Morawski Mais s'il est laissé dedans, il sera utilisé un jour. Et comme il n'a pas été maintenu, il y aura des bugs qui apparaîtront.
DJClayworth
9
J'avais l'habitude de commenter et les tests qui en dépendent, puis de laisser un commentaire 'TODO' avec une date. Une fois qu'il n'a pas été utilisé pendant un an, je le jette. D'autres recommandent simplement de le supprimer maintenant, mais je trouve cela difficile à faire, surtout s'il semble que le code a déjà été utile.
Job
31
@Job Si je tombe sur du code commenté, il est supprimé. Pas d'excuses. Le code commenté crie juste "Je ne fais pas confiance à notre système de contrôle de source." tome.
Kristof Provost
26
@ Kristof Provost, comment sauriez-vous que du code utile a déjà été inséré dans le fichier source A s'il n'y est plus? Bien sûr, vous pouvez toujours consulter l'historique du fichier sur lequel vous vous trouvez, mais combien de fois pensez-vous vous-même: "Hm ... je dois changer / implémenter une fonctionnalité ici. Ou j'ai besoin de tester son fonctionnement 5 ans Il y a QUICKLY. Je me demande si quelqu'un l'a déjà implémenté et ensuite supprimé ... laissez-moi vérifier l'historique ". Je ne préconise pas le maintien de la merde en désordre, mais dans certaines circonstances, vous n'utilisez pas le code en production, mais vous en avez parfois besoin pour le débogage, etc.
Emploi Le

Réponses:

219

La plupart de vos raisons pour le garder sont totalement hors de propos, en termes simples. Si le code n'est pas utilisé, jetez-le à la poubelle: tout avantage lié à sa conservation peut dériver de manière triviale du contrôle de source. Tout au plus, laissez un commentaire indiquant dans quelle révision le trouver.

Tout simplement, plus tôt vous coupez le code, plus vite vous ne perdez pas de temps à le maintenir, à le compiler et à le tester. Ces avantages dépassent largement les avantages triviaux que vous avez décrits, qui peuvent tous être dérivés du contrôle de source.

DeadMG
la source
30
Je suis d'accord avec l'enlever, mais j'ai eu des cas où j'ai cassé quelque chose parce que quelqu'un utilisait le code "non utilisé" via la réflexion. Donc il faut faire attention quand même.
Falcon
14
@ Falcon, c’est une bonne raison de l’enlever le plus tôt possible avant que les gens ne commencent à l’utiliser ou de découvrir la nécessité de le rendre public.
StuperUser
6
@Falcon: L'OP affirme que le code est inutilisé.
DeadMG
4
@StuperUser: Je suis totalement d'accord. Mais il faut être prudent et se préparer à l'inattendu.
Falcon
18
Si vous le supprimez et que votre unité et les tests de régression réussissent, mais que le produit tombe en panne sur le terrain, cela constitue un argument de poids pour la définition d'un type d'outils de couverture de code.
Andrew T Finnell
43

Toutes les raisons pour l'enlever sont valables.

Raisons pour le garder:

  • Peut être utilisé comme référence
  • Il peut être utile parfois
  • Il a peut-être été écrit pour "compléter" la fonctionnalité d'une classe

Toutes ces raisons pour le garder seront gérées par le contrôle de source. Supprimez-le du code live et vous pourrez le récupérer si nécessaire.

StuperUser
la source
1
Oui, le code non référencé ne doit pas rester dans le code actif.
xdazz
Il me semble que vous bénéficiez également de ces avantages en commentant simplement de gros morceaux.
Steve Bennett
@SteveBennett En effet, mais vous comprenez mal le but de cette réponse. J'énumère les avantages de le garder commenté, le fait est que vous obtiendrez tous ces avantages ET PLUS du contrôle de source (ce que vous verrez dans d'autres réponses).
StuperUser
Je ne suis certainement pas contre VCS. :) (Je note cependant qu'une fois que des éléments sont supprimés de la version actuelle, ils sont beaucoup moins visibles que d'autres méthodes, comme le stocker dans un fichier texte non référencé, sur un wiki, dans des commentaires, etc.)
Steve Bennett
@Steve Bennet - Cela peut paraître "moins visible" que les commentaires dans la version actuelle d'un fichier, mais il est trivial de vérifier l'historique VCS d'un fichier unique, et je dirais bien plus facile que le fichier txt / wiki / etc. .. approches.
Zach Lysobey
23

Le code non référencé revient à conserver ces piles un peu à plat, au cas où vous en auriez besoin un jour pour une lampe de poche.

Tant que vous utilisez une sorte de contrôle de version, je dirais de le supprimer du code dynamique et d'utiliser l'historique des versions au cas où il s'avérerait utile.

Nicholas Smith
la source
40
Pour améliorer légèrement votre analogie, c’est un peu comme si vous gardiez les piles presque mortes collées à votre télécommande, au lieu de les mettre dans une boîte à côté des nouvelles piles dans la réserve intitulée "piles usagées mais pas mortes".
Scott Whitlock
Plus 1 pour la bien meilleure amélioration!
Nicholas Smith
15

La seule bonne raison de garder le code qui n'est pas utilisé actuellement est si cela fait partie d'un module autonome: Bien que certaines parties du code ne soient peut-être pas utilisées pour le moment, il est fort possible qu'elles le soient utilisé à l'avenir.

Cela peut être particulièrement vrai pour une bibliothèque que vous utilisez dans différents projets: vous ne voulez pas continuer à lancer des morceaux de code, selon ce dont vous avez besoin pour un projet spécifique: je trouve cela fastidieux et sujet aux erreurs.

Mon approche est la suivante: (1) si vous l’utilisez une fois, ne gardez que ce dont vous avez réellement besoin; (2) si vous l'utilisez deux fois, copiez-le et adaptez-le à la deuxième utilisation; (3) si vous l'utilisez plus de deux fois, créez-en un module stable et bien défini, et utilisez-le selon vos besoins.

Résumer: je jetterais tout le code inutilisé à moins qu’il fasse partie d’un module généraliste que vous avez conçu en tant que tel et que vous savez que vous allez le réutiliser plusieurs fois.

Remarque : Bien entendu, une solution encore plus propre consisterait à créer un projet distinct pour une bibliothèque et à ajouter une dépendance entre les projets.

Giorgio
la source
1
A titre d'exemple, j'ai quelques routines de bibliothèque qui lisent et écrivent des types de données signés et non signés de différentes tailles dans un tableau d'octets. Il semble plus simple d’avoir un ensemble de telles routines pour tous les types de données, d’en avoir certaines présentes et d’autres non, en fonction de ce qui est demandé par le code à l’heure actuelle.
Supercat
11

En général, je m'inclinerais devant YAGNI à ce sujet. Si "vous n'en avez pas besoin", cela prend simplement de la place dans votre base de code, vos tests unitaires et vos assemblages. Vous en aurez peut-être besoin, mais vous aurez peut-être aussi besoin de le réécrire complètement car, d’ici au moment où vous aurez besoin de quoi que ce soit, beaucoup de choses peuvent changer.

Toutefois, cela change quelque peu lorsque vous écrivez un utilitaire ou une API destinée à la consommation générale. Tout comme vous ne pouvez jamais vous attendre à ce que les utilisateurs finaux du logiciel interagissent avec le logiciel de la manière que vous aviez prévue, vous ne pouvez jamais vous attendre à ce que les utilisateurs de votre code veuillent utiliser votre code exactement comme vous le souhaitez. Dans de tels cas, tant que vous pouvez justifier l'existence d'une méthode avec "c'est un moyen valide de vouloir interagir avec mon objet", alors elle devrait probablement y entrer, car même si vous n'en avez pas besoin, il y a de bonnes chances .

KeithS
la source
8

Étant donné que la base de code a moins d'un an, elle est probablement toujours en pleine mutation (oui?) - de sorte que la notion qu'il faudra peut-être ressusciter certains bits dans un proche avenir n'est pas déraisonnable.

Pour les éléments difficiles à obtenir correctement et qui semblent plus susceptibles d'être ressuscités, je les garderais un peu plus "en direct" que dans le contrôle de source. Les gens ne sauront pas / ne se souviendront pas de leur existence - dire "vous pouvez simplement le trouver dans le contrôle de code source" suppose que vous savez / vous rappelez que c'est là! Dans ce type de cas, envisagez la dépréciation (avec un témoin "assert (false)") ou la mise en commentaire.

Ed Staub
la source
5
+1 pour "dire" vous pouvez simplement le trouver dans le contrôle de source "suppose que vous sachiez / souvenez-vous qu'il est là!" - Parfois, je trouve des rappels de code qui ont été coupés pour être utiles, pour une raison ou une autre.
Steven
3

Si le code est trivial et sans intérêt, je le jette simplement pour éliminer l'inertie inutile du système logiciel.

Pour les cadavres de code intéressants, j'utilise une archivebranche dans mes systèmes de contrôle de version.

phresnel
la source
3

"Peut être utilisé comme référence" Je n’aurais pas tendance à penser que c’est une bonne raison de laisser du code inutilisé. Souvent, seule une petite partie du code inutilisé démontre quelque chose d'intéressant. Il existe plusieurs façons de documenter et de stocker du code utile mais non utilisé.

Bien que le contrôle de version contienne un historique qui vous permettra facilement de restaurer des fonctionnalités particulières si vous décidez ultérieurement que le code est nécessaire, sachant que vous devez consulter l'historique de contrôle de version pour rechercher xy ou z auprès de qui sait quelle révision précédente peut être. un peu fastidieux, et est souvent négligé, sauf si vous avez une idée assez précise de ce que vous recherchez.

Le code peut être commenté avec une note indiquant quand il a été supprimé et pourquoi il n'a pas été simplement supprimé du code. Cependant, ceci est généralement considéré comme un mauvais style, et un code qui n'est pas utilisé ni maintenu correctement peut générer toutes sortes de bogues s'il n'est pas commenté plus tard. C'est donc généralement préférable comme étape de débogage / test temporaire en cours de refactoring à la mi-refonte. une façon de laisser le code de production.

Mon moyen préféré pour stocker le code supprimé, si cela semble utile à l'avenir, est de créer un document de référence secondaire contenant tous les différents morceaux de code utile supprimé. Chaque bloc de code est étiqueté avec une brève mention de son origine ou de tout autre élément pertinent à retenir, tel que le moment où il a été supprimé ou le numéro de révision où il figurait en dernier dans le code. Tout ce qui est supprimé, sauf "potentiellement utile", se trouve au même endroit, il est facile de le rechercher, mais ne nécessite pas d'effort constant de maintenance et de test continu (ce test est reporté à n'importe quel moment où le code est réintroduit).

Jessica Brown
la source
2

Une bonne raison de conserver les méthodes inutilisées est la suivante: elles pourraient être utilisées sur d'autres branches / tags!

Explorez toutes vos branches et balises actives avant de les supprimer.

Davorp
la source
Cela n’a aucun sens pour moi: si ce n’est pas utilisé dans cette branche, retirez-le de cette branche. Si une autre branche l'utilise, il y restera.
Sleske
1

Si vous utilisez un système de contrôle de version, ne vous inquiétez pas des références futures, vous pouvez simplement voir à travers l'historique de ce code et trouver la partie supprimée. Si vous ne le faites pas et si vous pensez qu'il sera utilisé un jour, laissez-le simplement rester là, mais commentez-le avec une description expliquant pourquoi il est commenté.

Cependant, si vous êtes certain de ne plus l'utiliser, supprimez-le simplement . Je pense que les raisons que vous avez mentionnées sont assez simples pour que le code soit supprimé.

Mais s'il vous plaît avant de le retirer, assurez-vous qu'il n'est pas utilisé nulle part. Visual Studio dispose d'une fonctionnalité appelée Rechercher toutes les références qui recherche dans toute la solution et trouve toute référence à la variable, méthode, propriété, classe, interface, etc. en cours. Je m'assure toujours qu'aucune référence n'est en place avant de supprimer une partie de mon code.

Saeed Neamati
la source
1

J'ai eu assez souvent l'expérience de trouver une fonction qui semble correspondre exactement à ce dont j'ai besoin et de la croire pour fonctionner depuis qu'elle est en production depuis longtemps, seulement pour découvrir qu'elle n'a pas encore été utilisée plusieurs années. Le code qui n'est pas utilisé n'est pas maintenu et, même s'il a déjà fonctionné il y a des années, l'API a suffisamment changé pour que vous ne puissiez plus lui faire confiance.

Au mieux, vous finissez par passer beaucoup de temps à vous assurer qu'il fait toujours ce que vous voulez. Dans le pire des cas, cela semble fonctionner jusqu'à ce que vous obteniez un mauvais bug plus tard, et prenez plus de temps à le localiser car vous supposez que le code "testé en production" fonctionne, le problème doit donc se trouver ailleurs dans votre nouveau code. D'après mon expérience, il est presque toujours plus rapide d'écrire moi-même une nouvelle fonction.

Si vous le supprimez, mais que vous découvrez assez rapidement que vous en avez réellement besoin, cela se trouve dans le contrôle de source. Si vous n'en avez pas besoin jusqu'à ce que le temps soit écoulé et que vous ne vous souveniez plus du contrôle de source, vous feriez probablement mieux de l'écrire à partir de rien.

Karl Bielefeldt
la source
1

Rien ne prend moins de temps que pas de code.

Si vous devez plonger dans une base de code, vous avez besoin d'un peu de temps pour comprendre à quoi sert ce code et s'il ne sert à rien, vous avez besoin de plus de temps.

Ok - cela pourrait être guéri soit un commentaire, mais là encore, tout le monde va se demander pourquoi ce code inutilisé est toujours dans la base de code, qu'il soit supprimé ou non.

S'il n'y a rien, personne ne perdra du temps avec cela.

S'il était difficile de bien faire les choses, vous avez besoin d'une bonne documentation, du fait que ce code existe, mais si la base de code évolue au fil de certaines itérations, peut-être que cela ne fonctionnera plus, s'il est réactivé.

Utilisateur inconnu
la source
1

Supprimez le code inutilisé - moins d'encombrement, meilleure compréhension. Votre système de contrôle de version prendra soin de vous. De plus, si vous utilisez mieux que notepad, votre environnement vous permettra d'utiliser un code plus ancien pour référence.

Les longs commentaires de l'ancien code sont gênants et rendent la navigation difficile.

Cordialement

Luca Botti
la source
1

Suivez cet algorithme simple:

  1. Est-il sauvegardé dans un SCM? Si oui, passez à 3.
  2. Mettre en place un SCM.
  3. Jeter les trucs .

Tous vos points en faveur de la suppression sont valables.

Tous vos arguments en faveur du maintien de l’encombrement ne sont plus valables une fois que vous avez un SCM pour le rechercher ou le restaurer. En fait, votre SCM devrait pouvoir vous aider à déterminer pourquoi ce code est là et n’est pas utilisé, s’il a été utilisé correctement.

Cela s'appelle "code mort" pour une raison. Laissez-le mourir et reposez en paix.

haylem
la source
0

Il restera sous contrôle de source. il ne doit pas rester dans la base de code active.

La seule exception est que si le code termine la conception et que vous n'utilisez pas le code, vous prévoyez éventuellement de le rendre public et les autres utilisateurs souhaiteront peut-être cette fonctionnalité de base. Ensuite, concevez simplement des tests pour vous assurer que ces parties du code fonctionnent de manière à reproduire la manière dont vous proposez à d’autres personnes d’utiliser ces parties du code. Cependant, si vous envisagez même de supprimer le code et que vous ne pouvez pas trouver une raison valable pour le conserver, cela devrait disparaître. Le code inutilisé demande plus de travail à tout le monde (plus difficile à lire; le code peut être cassé; plus de travail à maintenir, etc.)

dr jimbob
la source
0

D'après mon expérience, supprimer le code inutilisé peut aussi se retourner contre nous. Vous pouvez oublier que vous aviez ce code et que vous ne le chercherez pas dans l'historique. Ou vous ne savez peut-être même pas que quelqu'un a implémenté ce code puis l'a supprimé ultérieurement. Encore une fois, vous ne le chercherez pas dans l'histoire ...

Sans doute, avoir du code inutilisé est une mauvaise odeur.

UPDATE: Je viens de remarquer que Ed Staub a donné une réponse très similaire.

Ali
la source