PMDとCheckStyleを比較する質問がありました。しかし、PMDとFindBugsの違い/類似点についての良い内訳を見つけることができません。主な違いは、PMDがソースコードで機能するのに対し、FindBugsはコンパイルされたバイトコードファイルで機能することだと思います。しかし、機能の観点から、それはどちらかまたは両方の選択である必要がありますか、それとも互いに補完し合うのでしょうか?
3 に答える
私は両方を使用しています。それらは互いに補完し合っていると思います。
あなたが言ったように、PMDはソースコードで動作するため、命名規則の違反、中括弧の欠如、nullチェックの置き忘れ、長いパラメータリスト、不要なコンストラクタ、スイッチのブレークの欠落などの問題が見つかります。PMDはCyclomaticについても通知します私が非常に役立つと思うコードの複雑さ(FindBugsはCyclomaticの複雑さについて教えてくれません)。
FindBugsはバイトコードで動作します。FindBugsがPMDで検出しない問題を次に示します。equals()メソッドがサブタイプで失敗する、cloneメソッドがnullを返す可能性がある、ブール値の参照比較、不可能なキャスト、0〜31の範囲外の量だけシフトされた32ビットint、それ自体を含むコレクション、equalsメソッドは常にtrue、無限ループなどを返します。
通常、それらのそれぞれが異なる問題のセットを見つけます。両方を使う。これらのツールは、優れたJavaコードの書き方について多くのことを教えてくれました。
PMD の最も優れた機能は、Rule Designer にバンドルされているXPath Rulesであり、コード サンプルから新しいルールを簡単に作成できます (RegEx および XPath GUI ビルダーに似ています)。FindBugs はそのままでより強力ですが、プロジェクト固有のルールとパターンを構築することが非常に重要です。
たとえば、ネストされた 2 つの for ループに関連するパフォーマンスの問題が発生したため、O(n^2) の実行時間が発生しましたが、これは簡単に回避できました。PMD を使用してアドホック クエリを作成し、ネストされた for ループの他のインスタンスを確認しました - //ForStatement/Statement//ForStatement. これにより、問題のさらに2つのインスタンスが指摘されました。これは一般的なルールではありません。
PMDは
- 有名
- 業界で広く使用されている
- ルールをxmlに追加できます
- エラーレベルと警告レベルで詳細な分析を提供します
- コードをスキャンして「行のコピーと貼り付け」を行うこともできます。重複コード。これにより、Java oops の実装について良いアイデアが得られます。