Javaプロジェクトで未使用/デッドコードを見つける方法


Answers

合理的にうまく動作するEclipseプラグインは、 Unused Code Detectorです。

これは、プロジェクト全体または特定のファイルを処理し、未使用/デッドコードのさまざまな方法を表示するだけでなく、可視性の変更(つまり、保護される可能性のあるパブリックメソッドまたはプライベート)を示します。

Question

大規模なJavaプロジェクトで未使用/デッドコードを見つけるためにどのツールを使用しますか? 当社の製品は数年間開発されており、もはや使用されていないコードを手動で検出することは非常に困難になっています。 ただし、できるだけ多くの未使用コードを削除しようとします。

一般的な戦略/テクニック(特定のツール以外)の提案も評価されます。

編集:すでにコードカバレッジツール(Clover、IntelliJ)を使用していますが、これらはほとんど役に立ちません。 デッドコードにはまだユニットテストがあり、カバーされているように表示されます。 私は理想的なツールは、それに応じて他のほとんどコードを持っていないコードのクラスターを識別し、マニュアル検査を行うことができると思います。




私がEclipseで行うことが知られていることは、1つのクラスで、すべてのメソッドを非公開に変更してから、どのような苦情が出るかを確認することです。 使用されているメソッドについては、これによりエラーが発生し、できるだけ低いレベルのアクセスレベルに戻します。 使用されていないメソッドについては、未使用のメソッドに関する警告が表示され、それらは削除されます。 そしてボーナスとして、プライベートにすることができ、プライベートにする必要のあるパブリックメソッドを見つけることがよくあります。

しかし、それは非常にマニュアルです。




テストカバレッジツールを使用してコードベースを計測し、テストではなくアプリケーション自体を実行します。

EmmaEclemmaは、コードの任意の実行に対してどのクラスが実行されているかについての素晴らしいレポートをあなたに伝えます。




理論的には、未使用のコードを確定的に見つけることはできません。 これは数学的な証明です(これはもっと一般的な定理の特殊なケースです)。 好奇心が強い場合は、Halting Problemを参照してください。

これは、Javaコードでさまざまな形で現れます。

  • ユーザ入力、設定ファイル、データベースエントリなどに基づいてクラスをロードする。
  • 外部コードを読み込む。
  • オブジェクトツリーを第三者図書館に渡す。

つまり、私はIDEA IntelliJを自分のIDEとして使用し、モジュール、未使用メソッド、未使用メンバー、未使用クラスなどの間のfindign依存関係のための広範な分析ツールを使用しています。パブリックメソッドはより広範な分析を必要とする。




IntelliJには未使用のコードを検出するコード解析ツールがあります。 できるだけ多くのフィールド/メソッド/クラスを非公開にしてください。これは未使用のメソッド/フィールド/クラスをさらに表示します

私はまた、コード量を減らす方法として重複コードを見つけることを試みるでしょう。

私の最後の提案は、もしあなたがコードを簡単にするオープンソースコードを見つけることです。




コードをプロファイルし、コードカバレッジデータを提供するツールがあります。 これにより、呼び出されているコードの量(コードが実行されたとき)が表示されます。 これらのツールのどれかを使って、あなたの孤児コードの量を知ることができます。




EMMAなどのユーザーカバレッジツール。 しかし、それは静的ツールではありません(つまり、実際には回帰テストを通じてアプリケーションを実行する必要があります)

それでもEMMAは非常に便利です。




  • FindBugsはこのようなことに優れています。
  • PMD(Project Mess Detector)は、使用可能な別のツールです。

しかし、どちらもワークスペースで使用されていないパブリック静的メソッドを見つけることはできません。 そのようなツールを知っている人は、私に知らせてください。




Eclipseは、到達できないコードを表示/強調表示できます。 JUnitはコードカバレッジを表示できますが、いくつかのテストが必要であり、関連するテストが欠落しているかコードが実際に使用されていないかを判断する必要があります。




Javaプロジェクト、 Dead Code Detector (DCD)があります。 ソースコードについてはうまく動作していないようですが、.jarファイルでは本当にうまいです。 さらに、クラスごと、および方法ごとにフィルタリングすることができます。