it-swarm.com.de

So finden Sie nicht verwendeten/toten Code in Java-Projekten

Welche Tools verwenden Sie, um ungenutzten/toten Code in großen Java-Projekten zu finden? Unser Produkt befindet sich seit einigen Jahren in der Entwicklung und es ist sehr schwierig, Code, der nicht mehr verwendet wird, manuell zu erkennen. Wir versuchen jedoch, möglichst viel nicht verwendeten Code zu löschen.

Vorschläge für allgemeine Strategien/Techniken (andere als spezifische Werkzeuge) sind ebenfalls willkommen.

Edit: Beachten Sie, dass wir bereits Code-Coverage-Tools (Clover, IntelliJ) verwenden, die aber wenig helfen. Toter Code enthält immer noch Unit-Tests und wird als abgedeckt angezeigt. Ich denke, ein ideales Werkzeug würde Codecluster identifizieren, die sehr wenig anderen Code aufweisen, was die manuelle Prüfung von Dokumenten ermöglicht.

287
knatten

Ich würde das laufende System instrumentieren, um Protokolle der Codeverwendung zu führen, und dann beginnen, Code zu untersuchen, der seit Monaten oder Jahren nicht verwendet wird.

Wenn Sie beispielsweise an nicht verwendeten Klassen interessiert sind, können alle Klassen für die Protokollierung beim Erstellen von Instanzen instrumentiert werden. Und dann könnte ein kleines Skript diese Protokolle mit der vollständigen Klassenliste vergleichen, um nicht verwendete Klassen zu finden.

Wenn Sie sich auf die Methodenebene begeben, sollten Sie natürlich die Leistung im Auge behalten. Zum Beispiel konnten die Methoden nur ihre erste Verwendung protokollieren. Ich weiß nicht, wie das am besten in Java gemacht wird. Wir haben dies in Smalltalk getan, einer dynamischen Sprache, die die Codeveränderung zur Laufzeit ermöglicht. Wir instrumentieren alle Methoden mit einem Protokollierungsaufruf und deinstallieren den Protokollierungscode, nachdem eine Methode zum ersten Mal protokolliert wurde, so dass nach einiger Zeit keine Leistungsstrafen mehr auftreten. Vielleicht kann man in Java mit statischen booleschen Flags etwas Ähnliches machen ...

37
akuhn

Ein Eclipse-Plugin, das einigermaßen gut funktioniert, ist Unused Code Detector .

Es verarbeitet ein gesamtes Projekt oder eine bestimmte Datei und zeigt verschiedene nicht verwendete/nicht verfügbare Codemethoden sowie Vorschläge für Sichtbarkeitsänderungen (d. H. Eine öffentliche Methode, die geschützt oder privat sein könnte).

219
Mikezx6r

CodePro wurde kürzlich von Google mit dem Eclipse-Projekt veröffentlicht. Es ist kostenlos und sehr effektiv. Das Plugin verfügt über eine ' Find Dead Code ' - Funktion mit einem/mehreren Einstiegspunkten. Funktioniert ziemlich gut.

64
Berlin Brown

Ich bin überrascht ProGuard wurde hier nicht erwähnt. Es ist eines der am meisten ausgereiften Produkte.

ProGuard ist ein freier Java-Klassendatei-Verkleinerer, Optimierer, obfuscator, und Preverifier. Es erkennt und entfernt nicht verwendete Klassen, Felder und Methoden und Attribute. Es optimiert den Bytecode und entfernt ungenutzte Anleitung. Es benennt die verbleibenden Klassen, Felder und Methoden um mit kurzen bedeutungslosen Namen. Schließlich werden die verarbeiteten Code für Java 6 oder für Java Micro Edition.

Einige Anwendungen von ProGuard sind:

  • Erstellen Sie kompakteren Code für kleinere Code-Archive, schnellere Übertragung über Netzwerke, schnelleres Laden und kleineren Speicher Fußabdrücke.
  • Erstellen von Programmen und Bibliotheken, die schwieriger zu erstellen sind. 
  • Toter Code auflisten, damit er aus dem Quellcode entfernt werden kann.
  • Bestehende Klassendateien für Java 6 oder höher neu ausrichten und vorbelegen, um das schnellere Laden von Klassen voll zu nutzen.

Hier ein Beispiel für einen Listen-Dead-Code: https://www.guardsquare.com/de/products/proguard/manual/examples#deadcode

27

Eine Sache, die ich in Eclipse für eine einzige Klasse gemacht habe, ist, alle Methoden auf privat zu ändern und dann zu sehen, welche Beschwerden ich bekomme. Bei Methoden, die verwendet werden, führt dies zu Fehlern und ich kehre zur untersten Zugriffsebene zurück, die ich kann. Bei Methoden, die nicht verwendet werden, werden Warnungen über nicht verwendete Methoden ausgelöst, die dann gelöscht werden können. Und als Bonus finden Sie häufig einige öffentliche Methoden, die privat gemacht werden können und sollten.

Aber es ist sehr manuell.

26
skiphoppy

Verwenden Sie ein Testabdeckungstool, um Ihre Codebase zu instrumentieren, und führen Sie dann die Anwendung selbst aus, nicht die Tests. 

Emma und Eclemma gibt Ihnen Nizza Berichte darüber, wie viel Prozent der Klassen für eine bestimmte Ausführung des Codes ausgeführt werden.

15
jamesh

Wir haben begonnen, Find Bugs zu verwenden, um einige der Funktionen der Zielumgebung unserer Codebase für Refactorings zu ermitteln. Ich würde auch Structure 101 erwägen, um zu komplizierte Stellen in der Architektur Ihrer Codebase zu identifizieren, damit Sie wissen, wo die echten Sümpfe liegen.

13
Alan

Theoretisch können Sie nicht verwendeten Code nicht deterministisch finden. Es gibt einen mathematischen Beweis dafür (nun, dies ist ein Spezialfall eines allgemeineren Satzes). Wenn Sie neugierig sind, schauen Sie nach dem Halteproblem.

Dies kann sich auf vielfältige Weise in Java-Code manifestieren:

  • Laden von Klassen basierend auf Benutzereingaben, Konfigurationsdateien, Datenbankeinträgen usw .;
  • Externen Code laden;
  • Objektbäume an Bibliotheken von Drittanbietern übergeben;
  • usw.

Davon abgesehen verwende ich IDEA IntelliJ als meine IDE - Wahl und es verfügt über umfangreiche Analysewerkzeuge zum Finden von Abhängigkeiten zwischen Modulen, nicht verwendeten Methoden, nicht verwendeten Mitgliedern, nicht verwendeten Klassen usw. intelligent ist wie eine private Methode, die nicht aufgerufen wird, als ungenutzt markiert, eine öffentliche Methode erfordert jedoch eine umfassendere Analyse.

12
cletus

In Eclipse gehen Sie zu Windows> Einstellungen> Java> Compiler> Fehler/Warnungen
und ändern Sie alle in Fehler. Beheben Sie alle Fehler. Dies ist der einfachste Weg. Das Schöne daran ist, dass Sie damit den Code bereinigen können, während Sie schreiben.

Screenshot Eclipse-Code:

 enter image description here

7
smileprem

IntelliJ verfügt über Code-Analyse-Tools zum Erkennen von Code, der nicht verwendet wird. Sie sollten versuchen, möglichst viele Felder/Methoden/Klassen so nicht-öffentlich wie möglich zu gestalten. Dadurch werden mehr nicht verwendete Methoden/Felder/Klassen angezeigt

Ich würde auch versuchen, doppelten Code zu finden, um das Codevolumen zu reduzieren.

Mein letzter Vorschlag ist der Versuch, Open Source-Code zu finden, der Ihren Code vereinfachen würde.

5
Peter Lawrey

Die Struktur101 Slice-Perspektive gibt eine Liste (und Abhängigkeitsgraph) aller "Waisenkinder" oder "Orphan Gruppen " von Klassen oder Paketen an, die keine Abhängigkeiten zum oder vom "Haupt" -Cluster haben. 

DCD ist kein Plugin für einige IDE, sondern kann von ant oder Standalone ausgeführt werden. Es sieht aus wie ein statisches Werkzeug und kann das, was PMD und FindBugs nicht können . Ich werde es versuchen.

P.S. Wie in einem Kommentar unten erwähnt, lebt das Projekt jetzt in GitHub .

3
Heiner

Es gibt Tools, die Code programmieren und Daten zur Codeabdeckung bereitstellen. So können Sie (während der Code ausgeführt wird) sehen, wie viel davon aufgerufen wird. Sie können eines dieser Tools erhalten, um herauszufinden, wie viel Waisenkode Sie haben.

2
Vaibhav
  • FindBugs eignet sich hervorragend für diese Art von Dingen. 
  • PMD (Project Mess Detector) ist ein weiteres Tool, das verwendet werden kann.

Keine der beiden kann öffentliche statische Methoden finden, die in einem Arbeitsbereich nicht verwendet werden. Wenn jemand ein solches Werkzeug kennt, lass es mich wissen.

2
graveca

Code-Coverage-Tools wie Emma, ​​Cobertura und Clover werden Ihren Code instrumentieren und aufzeichnen, welche Teile davon durch Ausführen einer Reihe von Tests aufgerufen werden. Dies ist sehr nützlich und sollte ein wesentlicher Bestandteil Ihres Entwicklungsprozesses sein. Damit können Sie feststellen, wie gut Ihre Testsuite Ihren Code abdeckt.

Dies ist jedoch nicht das Gleiche wie das Identifizieren eines echten toten Codes. Es identifiziert nur Code, der von Tests abgedeckt wird (oder nicht). Dies kann zu falsch positiven Ergebnissen führen (wenn Ihre Tests nicht alle Szenarien abdecken) sowie zu falschen Negativen (wenn Ihre Tests auf Code zugreifen, der in einem realen Szenario niemals verwendet wird).

Ich kann mir vorstellen, dass der beste Weg, toten Code wirklich zu identifizieren, darin besteht, Ihren Code mit einem Coverage-Tool in einer laufenden Umgebung zu instrumentieren und die Codeabdeckung über einen längeren Zeitraum zu analysieren. 

Wenn Sie in einer redundanten Umgebung mit Lastausgleich laufen (und wenn nicht, warum nicht?), Ist es wahrscheinlich sinnvoll, nur eine Instanz Ihrer Anwendung zu instrumentieren und Ihren Lastausgleicher so zu konfigurieren, dass ein zufälliger, aber kleiner Teil von Ihre Benutzer laufen auf Ihrer instrumentierten Instanz. Wenn Sie dies über einen längeren Zeitraum tun (um sicherzustellen, dass Sie alle Anwendungsszenarien der realen Welt (z. B. saisonale Schwankungen) abgedeckt haben, sollten Sie in der Lage sein, genau zu sehen, auf welche Bereiche Ihres Codes unter Verwendung der realen Welt und welche Teile zugegriffen wird sind wirklich nie abgerufen und daher toten Code. 

Ich habe das noch nie persönlich gesehen und weiß nicht, wie die zuvor genannten Tools zur Instrumentierung und Analyse von Code verwendet werden können, der nicht über eine Testsuite aufgerufen wird - aber ich bin sicher, dass dies möglich ist.

1
Vihung

Es gibt ein Java-Projekt - Dead Code Detector (DCD). Für den Quellcode scheint es nicht gut zu funktionieren, aber für die .jar-Datei - es ist wirklich gut. Außerdem können Sie nach Klasse und Methode filtern.

1

Netbeans Hier ist ein Plugin für Netbeans Dead Code Detector

Es wäre besser, wenn der nicht verwendete Code verlinkt und hervorgehoben werden könnte. Sie können hier abstimmen und kommentieren: Fehler 181458 - Suchen Sie nicht verwendete öffentliche Klassen, Methoden und Felder

1
Leon

Tools zur Benutzerabdeckung wie EMMA. Es ist jedoch kein statisches Werkzeug (d. H. Es muss die Anwendung tatsächlich durch Regressionstests und durch alle möglichen Fehlerfälle ausgeführt werden, was durchaus unmöglich ist :))

EMMA ist dennoch sehr nützlich.

1

Ich habe ein Clover-Coverage-Tool gefunden, das die Codes codiert und den verwendeten Code hervorhebt, der verwendet wird und der nicht verwendet wird. Im Gegensatz zu Google CodePro Analytics funktioniert es auch für Webanwendungen (gemäß meiner Erfahrung und ich bin möglicherweise falsch in Bezug auf Google CodePro). 

Der einzige Nachteil, den ich festgestellt habe, ist, dass Java-Schnittstellen nicht berücksichtigt werden.

0
Kashif Nazar

Ich verwende Doxygen, um eine Methodenaufrufzuordnung zu entwickeln, um Methoden zu finden, die niemals aufgerufen werden. In der Grafik finden Sie Inseln von Methodenclustern ohne Aufrufer. Dies funktioniert nicht für Bibliotheken, da Sie immer an einem Haupteinstiegspunkt beginnen müssen. 

0
jbruni

Eclipse kann Code anzeigen/hervorheben, der nicht erreichbar ist. JUnit kann Ihnen die Codeabdeckung anzeigen, Sie benötigen jedoch einige Tests und müssen entscheiden, ob der entsprechende Test fehlt oder ob der Code tatsächlich nicht verwendet wird. 

0
MattW.