312

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

一般的な戦略/手法(特定のツールを除く)の提案も歓迎します。

編集:私たちはすでにコードカバレッジツール(Clover、IntelliJ)を使用していますが、これらはほとんど役に立ちません。デッドコードにはまだ単体テストがあり、カバーされているように表示されます。理想的なツールは、それに依存する他のコードがほとんどないコードのクラスターを識別し、ドキュメントの手動検査を可能にするだろうと思います。

4

21 に答える 21

226

かなりうまく機能する Eclipse プラグインはUnused Code Detectorです。

プロジェクト全体または特定のファイルを処理し、さまざまな未使用/デッド コード メソッドを表示し、可視性の変更を提案します (つまり、保護または非公開にすることができるパブリック メソッド)。

于 2008-10-02T15:14:09.937 に答える
64

CodeProは最近、Eclipse プロジェクトと共に Google によってリリースされました。無料で効果抜群です。プラグインには、1 つまたは複数のエントリ ポイントを持つ「デッド コードの検索」機能があります。かなりうまく機能します。

于 2011-03-29T16:34:01.513 に答える
42

コードの使用状況のログを保持するように実行中のシステムを計測し、数か月または数年使用されていないコードの検査を開始します。

たとえば、未使用のクラスに関心がある場合は、インスタンスが作成されたときにログに記録するようにすべてのクラスをインストルメント化できます。そして、小さなスクリプトでこれらのログをクラスの完全なリストと比較して、未使用のクラスを見つけることができます。

もちろん、メソッド レベルに進む場合は、パフォーマンスを念頭に置いておく必要があります。たとえば、メソッドは最初の使用のみをログに記録できます。Javaでこれを行うのが最善の方法はわかりません。これは、動的言語である Smalltalk で実行したため、実行時にコードを変更できます。すべてのメソッドをロギング呼び出しで計測し、メソッドが初めてログに記録された後にロギング コードをアンインストールします。これにより、しばらくするとパフォーマンスの低下は発生しなくなります。静的ブール値フラグを使用して、Javaでも同様のことができるかもしれません...

于 2008-10-02T14:48:19.343 に答える
32

ProGuardがここで言及されていないことに驚いています。最も成熟した製品の 1 つです。

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

ProGuard のいくつかの用途は次のとおりです。

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

リストデッドコードの例: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode

于 2011-08-22T07:40:14.660 に答える
25

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

しかし、それは非常に手動です。

于 2009-01-28T19:45:32.723 に答える
15

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

EmmaEclemmaは、特定のコード実行で実行されたクラスのパーセンテージに関する優れたレポートを提供します。

于 2008-10-02T16:21:17.917 に答える
13

リファクタリングのために、コードベースのターゲットが豊富な環境でいくつかのファンクを特定するために、Find Bugsの使用を開始しました。また、 Structure 101を使用して、コードベースのアーキテクチャ内で複雑すぎるスポットを特定することも検討します。これにより、実際の沼地がどこにあるかがわかります。

于 2008-10-02T14:47:49.857 に答える
12

理論的には、未使用のコードを確定的に見つけることはできません。これには数学的な証明があります (まあ、これはより一般的な定理の特殊なケースです)。興味がある場合は、停止問題を調べてください。

これは、さまざまな方法で Java コードに現れる可能性があります。

  • ユーザー入力、設定ファイル、データベース エントリなどに基づいてクラスをロードします。
  • 外部コードを読み込んでいます。
  • オブジェクト ツリーをサード パーティのライブラリに渡す。

そうは言っても、私はIDEA IntelliJを選択したIDEとして使用しており、モジュール間の依存関係、未使用のメソッド、未使用のメンバー、未使用のクラスなどを見つけるための広範な分析ツールがあります。呼び出されないプライベートメソッドのように非常にインテリジェントです未使用とタグ付けされていますが、パブリック メソッドにはより広範な分析が必要です。

于 2008-10-02T14:28:07.627 に答える
5

Structure101スライスパースペクティブは、「メイン」クラスターとの間の依存関係がないクラスまたはパッケージの「孤立」または「孤立グループ」のリスト(および依存関係グラフ)を提供します。

于 2009-11-17T13:40:44.653 に答える
5

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

また、コードの量を減らす方法として、重複するコードを見つけようとします。

私の最後の提案は、使用するとコードが単純になるオープン ソース コードを見つけようとすることです。

于 2009-02-23T20:31:11.320 に答える
3

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

PS 以下のコメントで述べたように、プロジェクトは現在GitHubにあります。

于 2012-06-28T08:29:52.990 に答える
2

コードをプロファイリングし、コードカバレッジデータを提供するツールがあります。これにより、(コードの実行時に)呼び出されている量を確認できます。これらのツールのいずれかを入手して、使用している孤立したコードの量を調べることができます。

于 2008-10-02T14:24:38.120 に答える
1

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

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

デッド コードを実際に特定する最善の方法は、ライブ実行環境でカバレッジ ツールを使用してコードを計測し、長期間にわたってコード カバレッジを分析することだと思います。

負荷分散された冗長環境で実行している場合 (そうでない場合はなぜでしょうか?)、アプリケーションのインスタンスを 1 つだけ計測し、ロード バランサーを構成して、ランダムではあるが小さい部分をユーザーはインストルメント化されたインスタンスで実行されます。長期間にわたってこれを行うと (季節変動など、実際の使用シナリオをすべてカバーしていることを確認するため)、実際の使用状況でコードのどの領域がアクセスされ、どの部分がアクセスされているかを正確に確認できるはずです。実際にはアクセスされないため、デッドコードです。

私は個人的にこれが行われたのを見たことがなく、前述のツールを使用して、テスト スイートを介して呼び出されていないコードを計測および分析する方法を知りませんが、できると確信しています。

于 2008-11-26T16:40:09.520 に答える
1

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

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

于 2008-10-02T16:16:09.617 に答える
0

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

于 2008-10-02T14:24:28.697 に答える
0

コードを計測し、使用されているコードと使用されていないコードを強調表示する Clover カバレッジ ツールを見つけました。Google CodePro Analytics とは異なり、WebApplications でも機能します (私の経験によると、Google CodePro については間違っている可能性があります)。

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

于 2011-12-13T10:14:00.663 に答える