Nicht verwendeten Code finden [geschlossen]

208

Ich muss eine große C # -Anwendung umgestalten und habe viele Funktionen gefunden, die nie verwendet werden. Wie kann ich nach nicht verwendetem Code suchen, um alle nicht verwendeten Funktionen zu entfernen?

Andre
quelle
Ich bin überrascht, dass dies als nicht zum Thema gehörend gekennzeichnet ist. Ich fand die Frage und die Antworten 11 Jahre nach dem Schreiben der Frage nützlich. Der Off-Topic-Link besagt, dass "... Software-Tools, die häufig von Programmierern verwendet werden und ... sind", definitiv für SO! relevant sind.
Shelbypereira

Antworten:

218

Ja, ReSharper macht das. Klicken Sie mit der rechten Maustaste auf Ihre Lösung und wählen Sie "Code-Probleme suchen". Eines der Ergebnisse ist "Nicht verwendete Symbole". Dies zeigt Ihnen Klassen, Methoden usw., die nicht verwendet werden.

Jarrett Meyer
quelle
20
das ist toll. Nicht genug Leute wissen davon. Sie müssen auch die lösungsweite Analyse aktivieren, damit alles angezeigt wird.
mcintyre321
16
Resharper ist ein großartiges Werkzeug, aber ich fand es für diese Aufgabe unzuverlässig. Ich habe eine öffentliche Methode, bei der ich alle Referenzen entfernt habe. Wenn ich mit der rechten Maustaste auf die Methode klicke und "Verwendungen anzeigen" auswähle, gibt es keine, aber die Codeprobleme von Resharper führen sie nicht als nicht verwendet auf.
user890155
9
Wir verwenden die Abhängigkeitsinjektion. Infolgedessen wird alles zum erneuten Schärfen verwendet, da selbst nicht verwendete Typen immer noch mit Unity registriert werden.
Montgomery 'monty' Jones
11
@ user890155 Da die Methode öffentlich ist, könnte die Bibliothek von einer anderen Anwendung verwendet werden, die nicht in der aktuellen Lösung enthalten ist. Ich glaube, dass interne und private Methoden nur dann als Codeprobleme gekennzeichnet werden, wenn sie nicht verwendet werden.
Lukazoid
3
@elggarc Informationen zur Abhängigkeitsinjektion finden Sie im hier erwähnten Agent Mulder-Plugin: blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins Projekthomepage: hmemcpy.github.com/AgentMulder Agent Mulder - Unterstützung für Abhängigkeitsinjektions-Frameworks wie Autofac, Castle Windsor, Unity. Da ReSharper diese Container nicht kennt, können Klassen häufig als nicht verwendet oder nicht instanziiert markiert werden. Agent Mulder teilt ReSharper mit, wann diese Klassen verwendet werden, und bietet von jeder Klasse aus die Navigation zum Registrierungspunkt.
Grzegorz Smulko
29

Es ist eine gute Frage, aber seien Sie gewarnt, dass Sie hier in gefährlichen Gewässern treten. Wenn Sie Code löschen, müssen Sie sicherstellen, dass Sie häufig kompilieren und testen.

Ein großartiges Werkzeug fällt mir ein:

NDepend - dieses Tool ist einfach unglaublich. Das Grok dauert eine Weile, und nach den ersten 10 Minuten sagen die meisten Entwickler einfach "Screw it!" und löschen Sie die App. Sobald Sie ein gutes Gefühl für NDepend haben, erhalten Sie einen erstaunlichen Einblick in die Kopplung Ihrer Apps. Probieren Sie es aus: http://www.ndepend.com/ . Am wichtigsten ist, dass Sie mit diesem Tool Methoden anzeigen können, für die keine direkten Aufrufer vorhanden sind. Es zeigt Ihnen auch die Umkehrung, einen vollständigen Aufrufbaum für jede Methode in der Assembly (oder sogar zwischen Assemblys).

Welches Werkzeug Sie auch wählen, es ist keine leichte Aufgabe. Insbesondere, wenn Sie mit öffentlichen Methoden für Assemblys vom Typ Bibliothek arbeiten, da Sie möglicherweise nie wissen, wann eine App auf sie verweist.

Jeff Schumacher
quelle
4
Ein weiteres Wort der Vorsicht: Wenn Ihre App asp.net ist, müssen Sie mit NDepend Ihre Site vorkompilieren, damit Sie die Code-Behinds analysieren können, und NDepend kann Aufrufe von den aspx-Seiten nicht abdecken / kennen (dh Methodenaufrufe in ObjectDataSources und dem wie)
Jaime
16

Resharper ist dafür gut, wie andere gesagt haben. Seien Sie jedoch vorsichtig, diese Tools finden keinen Code, der von Reflection verwendet wird. Sie können beispielsweise nicht wissen, ob Code NICHT von Reflection verwendet wird.

mmiika
quelle
15

Wie Jeff sagte, kann das Tool NDepend helfen, nicht verwendete Methoden, Felder und Typen zu finden.

Um ein wenig näher darauf einzugehen, schlägt NDepend vor, Code Rule over LINQ Query (CQLinq) zu schreiben . Es werden rund 200 Standardcode-Regeln vorgeschlagen, von denen 3 der Erkennung von nicht verwendetem / totem Code gewidmet sind

Grundsätzlich sieht eine solche Regel zum Erkennen nicht verwendeter Methoden beispielsweise so aus:

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

NDepend-Regel, um nicht verwendete Methoden zu finden (tote Methoden)

Diese Regel ist jedoch naiv und gibt triviale Fehlalarme zurück. Es gibt viele Situationen, in denen eine Methode nie aufgerufen wird, aber nicht unbenutzt ist (Einstiegspunkt, Klassenkonstruktor, Finalisierer ...). Aus diesem Grund werden die drei Standardregeln ausführlicher beschrieben:

NDepend ist in Visual Studio 2017, 2015, 2013, 2012, 2010 integriert, sodass diese Regeln direkt in der IDE überprüft / durchsucht / bearbeitet werden können . Das Tool kann auch in Ihren CI-Prozess integriert werden und Berichte erstellen , in denen Regeln verletzt und Codeelemente für Schuldige angezeigt werden. NDepend hat auch eine VS Team Services-Erweiterung .

Wenn Sie auf diese 3 Links oben in Richtung des Quellcodes dieser Regeln klicken, werden Sie feststellen, dass diejenigen, die Typen und Methoden betreffen, etwas komplex sind. Dies liegt daran, dass sie nicht nur nicht verwendete Typen und Methoden erkennen, sondern auch Typen und Methoden, die nur von nicht verwendeten toten Typen und Methoden verwendet werden (rekursiv).

Dies ist eine statische Analyse , daher das Präfix Potenziell in den Regelnamen. Wenn ein Codeelement nur durch Reflektion verwendet wird, wird es nach diesen Regeln möglicherweise als nicht verwendet betrachtet, was nicht der Fall ist.

Zusätzlich zur Verwendung dieser drei Regeln würde ich empfehlen, die Codeabdeckung durch Tests zu messen und eine vollständige Abdeckung anzustreben. Oft werden Sie feststellen, dass Code, der nicht durch Tests abgedeckt werden kann, tatsächlich unbenutzter / toter Code ist, der sicher verworfen werden kann. Dies ist besonders nützlich bei komplexen Algorithmen, bei denen nicht klar ist, ob ein Codezweig erreichbar ist oder nicht.

Haftungsausschluss: Ich arbeite für NDepend.

Patrick vom NDepend-Team
quelle
6

Ich würde auch erwähnen, dass die Verwendung von IOC aka Unity diese Einschätzungen irreführend machen kann. Ich habe mich vielleicht geirrt, aber einige sehr wichtige Klassen, die über Unity instanziiert werden, scheinen keine Instanziierung zu haben, soweit ReSharper dies beurteilen kann. Wenn ich den ReSharper-Empfehlungen folgen würde, würde ich abgespritzt werden!

Allen Marshall
quelle
4

ReSharper macht einen großartigen Job beim Auffinden von nicht verwendetem Code.

In der VS-IDE können Sie mit der rechten Maustaste auf die Definition klicken und "Alle Referenzen suchen" auswählen, obwohl dies nur auf Lösungsebene funktioniert.

Mitch Wheat
quelle
1

Die Wahrheit ist, dass das Tool Ihnen niemals eine 100% sichere Antwort geben kann, aber das Coverage-Tool kann Ihnen einen ziemlich guten Lauf für das Geld geben.

Wenn Sie mit einer umfassenden Unit-Test-Suite rechnen, können Sie mithilfe des Testabdeckungstools genau sehen, welche Codezeilen während des Testlaufs nicht ausgeführt wurden. Sie müssen den Code weiterhin manuell analysieren: Entfernen Sie entweder den für tot gehaltenen Code oder schreiben Sie einen Test, um die Testabdeckung zu verbessern.

Ein solches Tool ist NCover mit Open Source-Vorläufer auf Sourceforge . Eine andere Alternative ist PartCover .

Überprüfen Sie diese Antwort auf Stackoverflow.

Dan
quelle
1

Ich bin auf AXTools CODESMART gestoßen. Versuchen Sie das einmal. Verwenden Sie den Code-Analysator im Abschnitt "Überprüfungen". Er listet tote lokale und globale Funktionen sowie andere Probleme auf.

Ramu
quelle
0

FXCop ist ein Code-Analysator ... Es kann viel mehr als nur nicht verwendeten Code finden. Ich habe FXCop eine Weile benutzt und war so in seinen Empfehlungen verloren, dass ich es deinstalliert habe.

Ich denke, NDepend sieht aus wie ein wahrscheinlicherer Kandidat.


quelle