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?
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?
Réponses:
Oui, ReSharper fait cela. Faites un clic droit sur votre solution et sélectionnez "Rechercher les problèmes de code". L'un des résultats est "Symboles inutilisés". Cela vous montrera les classes, méthodes, etc., qui ne sont pas utilisées.
C'est une excellente question, mais sachez que vous marchez dans des eaux dangereuses ici. 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 grogner, et après les 10 premières minutes, je pense que la plupart des développeurs disent simplement "Vissez-le!" et supprimez l'application. Une fois que vous avez une bonne idée de NDepend, cela vous donne un aperçu incroyable de la façon dont vos applications sont couplées. Découvrez-le: http://www.ndepend.com/ . Plus important encore, cet outil vous permettra de visualiser les méthodes qui n'ont pas d'appel direct. Il vous montrera également l'inverse, une arborescence d'appels complète pour n'importe quelle méthode dans l'assembly (ou même entre les assemblys).
Quel que soit l'outil que vous choisissez, 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.
Comme l'a souligné 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 la règle de code sur LINQ Query (CQLinq) . Environ 200 règles de code par défaut sont proposées, dont 3 dédiées à la détection de code inutilisé / mort
Fondamentalement, une telle règle pour détecter une méthode inutilisée ressemble par exemple à:
// <Name>Dead Methods</Name>
warnif count > 0
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m
Mais cette règle est naïve et renvoie des faux positifs triviaux. Il existe de nombreuses situations où une méthode n'est jamais appelée mais n'est pas utilisée (point d'entrée, constructeur de classe, finaliseur ...) 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 / modifiées directement à l'intérieur de l'IDE . L'outil peut également être intégré à votre processus CI et il peut créer des rapports qui montreront les règles violées et les éléments de code coupables. NDepend a également une 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 méthodes inutilisés, mais également les types et méthodes utilisés uniquement par les types et méthodes morts inutilisés (récursifs).
Il s'agit d' une analyse statique , d'où le préfixe Potentiellement dans les noms de règles. Si un élément de code n'est utilisé que 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 conseille de mesurer la couverture du code par des tests et de vous efforcer d'avoir une couverture complète. Souvent, vous verrez que le code qui ne peut pas être couvert par des tests est en fait du 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.
Avertissement: je travaille pour NDepend.
Je voudrais également mentionner que l'utilisation d'IOC aka Unity peut rendre ces évaluations trompeuses. Je me suis peut-être trompé mais plusieurs classes très importantes qui sont instanciées via Unity semblent n'avoir aucune instanciation pour autant que ReSharper puisse le dire. Si je suivais les recommandations de ReSharper, je me ferais arroser!
La vérité est que l'outil ne peut jamais vous donner une réponse sûre à 100%, mais l'outil de couverture peut vous donner une assez bonne course pour l'argent.
Si vous comptez avec une suite de tests unitaires complète, vous pouvez utiliser l'outil de couverture de test pour voir exactement quelles lignes de code n'ont pas été exécutées pendant l'exécution du test. Vous devrez toujours analyser le code manuellement: soit éliminer ce que vous considérez comme du code mort, soit écrire un test pour améliorer la couverture du test.
Un de ces outils est NCover , avec un précurseur open source sur Sourceforge . Une autre alternative est PartCover .
Découvrez cette réponse sur stackoverflow.
FXCop est un analyseur de code ... Il fait bien plus que trouver du code inutilisé. J'ai utilisé FXCop pendant un certain temps et j'étais tellement perdu dans ses recommandations que je l'ai désinstallé.
Je pense que NDepend ressemble à un candidat plus probable.