質問

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

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

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

役に立ちましたか?

解決

実行中のシステムをインスツルメントして、コードの使用状況のログを保存し、数か月または数年使用されていないコードの検査を開始します。

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

もちろん、メソッドレベルで行う場合は、パフォーマンスに留意する必要があります。たとえば、メソッドは最初の使用のみを記録できます。これがJavaでどのように行われるのが最適かわかりません。これをSmalltalkで実行しました。Smalltalkは動的言語であるため、実行時にコードを変更できます。すべてのメソッドをロギングコールでインスツルメントし、メソッドが初めてログに記録された後にロギングコードをアンインストールします。したがって、しばらくするとパフォーマンスのペナルティは発生しません。 Javaで静的ブールフラグを使用して同様のことを行うことができます...

他のヒント

合理的に機能するEclipseプラグインは未使用のコード検出器です。

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

CodePro は、GoogleがEclipseプロジェクトとともに最近リリースしたものです。無料で非常に効果的です。プラグインには、1つ/多くのエントリポイントを持つ「 Find Dead Code 」機能があります。 (s)。かなりうまくいきます。

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

  

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

     

ProGuardの使用例:

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

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

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

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

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

Emma および Eclemma は、指定されたコードの実行で実行されるクラスの割合を示す優れたレポートを提供します。

バグを見つけるを使用して、コードベースのターゲットリッチのファンクを特定しやすくしましたリファクタリングのための環境。また、 Structure 101 を使用して、コードベースのアーキテクチャ内の複雑すぎる箇所を特定することを検討します。本当の沼がある場所。

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

これは、さまざまな方法でJavaコードに現れます:

  • ユーザー入力、構成ファイル、データベースエントリなどに基づいてクラスをロードする
  • 外部コードのロード;
  • オブジェクトツリーをサードパーティライブラリに渡す
  • など

そうは言っても、IDEA IntelliJを選択したIDEとして使用し、モジュール、未使用のメソッド、未使用のメンバー、未使用のクラスなどの間の依存関係を見つけるための広範な分析ツールを備えています。 t calledは未使用のタグが付けられていますが、パブリックメソッドにはより詳細な分析が必要です。

Eclipse Goto Windowsの場合>設定> Java>コンパイラ>エラー/警告
すべてをエラーに変更します。すべてのエラーを修正します。これが最も簡単な方法です。美しさは、これにより、作成中にコードをクリーンアップできることです。

スクリーンショットEclipseコード:

ここに画像の説明を入力

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

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

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

Structure101 スライスパースペクティブはリストを提供します(そして「孤児」の依存グラフ)または" orphan グループ" &main;との依存関係のないクラスまたはパッケージのクラスタ。

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

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

コードをプロファイルし、コードカバレッジデータを提供するツールがあります。これにより、(コードの実行中に)どれだけ呼び出されているかを確認できます。これらのツールを使用して、孤立コードの量を確認できます。

  • FindBugsは、この種のものに最適です。
  • PMD(Project Mess Detector)は、使用できるもう1つのツールです。

ただし、ワークスペースで使用されていないパブリックスタティックメソッドは見つかりません。誰かがそのようなツールを知っているなら、私に知らせてください。

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

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

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

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

デッドコードを実際に識別する最良の方法は、稼働中の環境でカバレッジツールを使用してコードを計測し、長期間にわたってコードカバレッジを分析することです。

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

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

Javaプロジェクトがあります- Dead Code Detector (DCD)。ソースコードの場合はうまく機能していないように見えますが、.jarファイルの場合は本当に良いです。さらに、クラスおよびメソッドでフィルタリングできます。

Netbeans は、Netbeansのプラグインですデッドコード検出器

未使用のコードにリンクして、強調表示できるとよいでしょう。ここで投票およびコメントできます:バグ181458-未使用のパブリッククラス、メソッド、フィールドを検索

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

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

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

Doxygenを使用して、呼び出されないメソッドを見つけるためのメソッド呼び出しマップを開発します。グラフには、呼び出し元のないメソッドクラスターの島があります。常に何らかのメインエントリポイントから開始する必要があるため、これはライブラリでは機能しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top