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



10 Answers

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

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

android studio クラス

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

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

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




私はProGuardがここで言及されていないことにProGuardている。 これは、最も成熟した製品の一つです。

ProGuardは、無料のJavaクラスファイル圧縮ツール、オプティマイザ、難読化ツール、および事前検証ツールです。 未使用のクラス、フィールド、メソッド、および属性を検出して削除します。 バイトコードを最適化し、未使用の命令を削除します。 短い無意味な名前を使用して、残りのクラス、フィールド、およびメソッドの名前を変更します。 最後に、Java 6またはJava Micro Editionの処理済みコードを事前に検証します。

ProGuardの用途は次のとおりです。

  • よりコンパクトなコードの作成、より小さなコードアーカイブ、より速いネットワーク間の転送、より高速なローディング、小さなメモリフットプリント。
  • プログラムやライブラリをリバースエンジニアリングすることを難しくしています。
  • デッドコードをリストアップするので、ソースコードから削除することができます。
  • Java 6以上の既存のクラスファイルのターゲットを絞って事前検証し、より高速なクラスロードを最大限に活用します。



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

EmmaEclemmaは、コードの任意の実行に対してどのクラスが実行されているかについての良い割合のレポートを提供します。




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

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

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

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




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

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

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




DCDはIDEのプラグインではありませんが、antまたはスタンドアロンから実行できます。 これは静的ツールのように見え、 PMDとFindBugsでできないものを実行できます 。 やってみます。

PS下記のコメントで述べたように、プロジェクトは現在GitHub住んでいGitHub




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

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




Emma、Cobertura、Cloverなどのコードカバレッジツールは、コードを計測し、一連のテストを実行してコードのどの部分を呼び出すかを記録します。 これは非常に便利で、開発プロセスの不可欠な部分でなければなりません。 テストスイートがコードをどの程度うまくカバーしているかを確認するのに役立ちます。

しかし、これは実際のデッドコードを特定するのと同じではありません。 テストでカバーされる(またはカバーされない)コードだけを識別します。 これにより、偽陽性(テストがすべてのシナリオをカバーしていない場合)および偽陰性(実際のシナリオでは実際に使用されていないコードにアクセスするテスト)が得られます。

デッドコードを実際に識別する最良の方法は、実行中の環境でカバレッジツールを使用してコードをインストルメントし、長時間にわたってコードカバレッジを分析することです。

ロードバランスされた冗長環境で実行している場合(そうでない場合は、なぜですか?)、アプリケーションのインスタンスを1つだけインストルメントし、ロードバランサを構成して、ユーザーは計測されたインスタンス上で実行されます。 これを長時間にわたって行う場合(現実世界の使用シナリオ(季節変動など)をすべて網羅していることを確認するために)、現実世界でどの部分がアクセスされているのか、実際には決してアクセスされず、したがってデッドコードです。

私はこれを個人的に見たことはありませんし、上記のツールをテストスイートを通して呼び出されていないコードを計測し分析するためにどのように使用できるのか分かりませんが、確信しています。







私はCloverカバレッジツールを見つけました。このツールは、使用されているコードと使用されていないコードを強調表示します。 Google CodePro Analyticsとは異なり、Webアプリケーションでも動作します(私の経験によれば、私はGoogle CodeProについて間違いかもしれません)。

私が気づいた唯一の欠点は、Javaインターフェイスを考慮しないことです。




Related