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?
c#
.net
refactoring
Andre
quelle
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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:
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.
quelle
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!
quelle
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.
quelle
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.
quelle
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.
quelle
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