web-dev-qa-db-fra.com

Trouver le code inutilisé

Je dois refactoriser une grande application C # et j'ai trouvé beaucoup de fonctions qui ne sont jamais utilisées. Comment puis-je vérifier le code inutilisé afin de pouvoir supprimer toutes les fonctions inutilisées?

204
Andre

Oui, ReSharper le fait. Faites un clic droit sur votre solution et sélectionnez "Trouver les problèmes de code". L'un des résultats est "Symboles non utilisés". Cela vous montrera des classes, des méthodes, etc. non utilisées.

216
Jarrett Meyer

C'est une excellente question, mais sachez que vous marchez dans des eaux dangereuses. Lorsque vous supprimez du code, vous devrez vous assurer que vous compilez et testez souvent.

Un excellent outil me vient à l’esprit:

NDepend - cet outil est tout simplement incroyable. Il faut un peu de temps pour parler, et après les 10 premières minutes, je pense que la plupart des développeurs se contentent de dire "Fous-le!" et supprimez l'application. Une fois que vous avez une bonne idée de NDepend, vous obtenez un aperçu incroyable du couplage de vos applications. Vérifiez-le: http://www.ndepend.com/ . Plus important encore, cet outil vous permettra d’afficher des méthodes qui n’appellent aucun appelant direct. Il vous montrera également l'inverse, un arbre d'appel complet pour toute méthode de l'Assemblée (ou même entre les assemblées).

Quel que soit l'outil que vous choisissiez, ce n'est pas une tâche à prendre à la légère. Surtout si vous avez affaire à des méthodes publiques sur des assemblys de type bibliothèque, car vous ne saurez peut-être jamais quand une application les référence.

28
Jeff Schumacher

Resharper est bon pour cela, comme d’autres l’ont dit. Faites attention cependant, ces outils ne vous trouvent pas le code utilisé par réflexion, par exemple. ne peut pas savoir si du code n'est PAS utilisé par réflexion.

16
mmiika

Comme indiqué Jeff, l'outil NDepend peut aider à trouver des méthodes, des champs et des types inutilisés.

Pour élaborer un peu, NDepend propose d’écrire Code Rule over LINQ Query (CQLinq) . Environ 200 règles de code par défaut sont proposées, 3 d’entre elles étant dédiées à la détection de code inutilisé/mort

Fondamentalement, une telle règle pour détecter une méthode non utilisée ressemble par exemple à:

// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

NDepend rule to find unused methods (dead methods)

Mais cette règle est naïve et renverra des faux positifs triviaux. Il existe de nombreuses situations dans lesquelles une méthode n'est jamais appelée mais qu'elle n'est pas utilisée (point d'entrée, constructeur de classe, finaliseur, etc.), c'est pourquoi les 3 règles par défaut sont plus élaborées:

NDepend s'intègre dans Visual Studio 2017,2015, 2013, 2012, 2010, ainsi ces règles peuvent être vérifiées/parcourues/éditées directement dans l'EDI . L'outil peut également être intégré dans votre processus de CI et il peut construire rapports qui montrera les règles violées et les éléments de code coupables. NDepend a également un extension VS Team Services .

Si vous cliquez sur ces 3 liens ci-dessus vers le code source de ces règles, vous verrez que ceux concernant les types et les méthodes sont un peu complexes. En effet, ils détectent non seulement les types et les méthodes inutilisés, mais également les types et les méthodes utilisés uniquement par des types et des méthodes inutilisés (récursifs).

C'est une analyse statique , d'où le préfixe Potentiellement dans les noms de règles. Si un élément de code est utilisé uniquement par réflexion, ces règles peuvent le considérer comme inutilisé, ce qui n'est pas le cas.

En plus d'utiliser ces 3 règles, je vous conseillerais de mesurer la couverture de code par des tests et de rechercher une couverture complète. Souvent, vous verrez que le code qui ne peut pas être couvert par des tests est en réalité un code inutilisé/mort qui peut être supprimé en toute sécurité. Ceci est particulièrement utile dans les algorithmes complexes où il n'est pas clair si une branche de code est accessible ou non.

Disclaimer: Je travaille pour NDepend.

Je voudrais également mentionner que l'utilisation de IOC alias Unity peut rendre ces évaluations trompeuses. J'ai peut-être commis une erreur, mais plusieurs classes très importantes instanciées via Unity semblent ne pas avoir d'instanciation à ce que ReSharper puisse dire. Si je suivais les recommandations de ReSharper, je me ferais avoir!

6
Allen Marshall

ReSharper fait un excellent travail pour trouver du code inutilisé.

Dans VS IDE, vous pouvez cliquer avec le bouton droit de la souris sur la définition et choisir "Rechercher toutes les références", bien que cela ne fonctionne qu'au niveau de la solution.

4
Mitch Wheat

La vérité est que l'outil ne peut jamais vous donner une réponse certaine à 100%, mais l'outil de couverture peut vous donner une très bonne performance pour votre argent.

Si vous comptez avec une suite complète de tests unitaires, vous pouvez utiliser l'outil de couverture de test pour voir exactement quelles lignes de code n'ont pas été exécutées lors de l'exécution du test. Vous aurez toujours besoin d'analyser le code manuellement: éliminez ce que vous considérez comme un code mort ou écrivez un test pour améliorer la couverture de test.

Un de ces outils est NCover , avec le précurseur open source activé sur Sourceforge . Une autre alternative est PartCover .

Découvrez ceci réponse sur stackoverflow.

1
Dan

J'ai rencontré AXTools CODESMART..Essayez-le une fois. Utilisez l'analyseur de code dans la section critiques. Il répertorie les fonctions mortes locales et globales ainsi que d'autres problèmes.

1
ramu

FXCop est un analyseur de code ... Il fait beaucoup plus que trouver du code inutilisé. J'ai utilisé FXCop pendant un moment, et ses recommandations ont été tellement perdues que je l'ai désinstallé.

Je pense que NDepend semble être un candidat plus probable.

0
Cyril Gupta