29

PMDルールセットの背後にある「理由」を説明する優れたリソースはありますか?PMDのサイトには「何」(各ルールの機能)がありますが、PMDにそのルールがある理由と、そのルールを無視すると現実の世界で問題が発生する理由については説明されていません。特に、PMDにAvoidInstantiatingObjectsInLoopsルールとOnlyOneReturnルールがある理由を知りたいと思います(最初のルールはコレクション内の各オブジェクトに対応する新しいオブジェクトを作成する必要がある場合に必要と思われ、2番目のルールは多くの場合必要であるように思われます)いくつかの基準に基づいて値を返します)が、私が本当に求めているのは、PMDのルールの大部分の背後にある「理由」を説明するリンクです。これは、十分な頻度で発生するためです。

明確にするために、私はこれらを無効にできることとその方法を知っています。そもそもなぜそれらがそこにあるのか疑問に思っています。何か明らかなことを見逃してしまったら申し訳ありませんが、これを投稿する前にGoogle検索とSO検索を行いました。また、これらの問題はしばしば「味」の問題であることも理解しています。私が探しているのは、ルールの議論と代替案が何であるかということです。具体的な例を挙げると、ループ内の各オブジェクトをインスタンス化せずに、ループ内のすべてのオブジェクトに対応する1つのオブジェクト(Javaでの一般的な操作)をどのように実装する必要がありますか?

4

4 に答える 4

20

いずれの場合も、ルールは特定の状況の問題、または単に「味」の問題である可能性があります。

反復回数が多く、インスタンス化にコストがかかる場合は、ループ内でオブジェクトをインスタンス化することは避けてください。コードをループの外に移動できる場合は、多くのオブジェクトのインスタンス化を回避できるため、パフォーマンスが向上します。そうは言っても、これが常に可能であるとは限りません。場合によっては、コードの全体的なパフォーマンスに関係がないこともあります。このような場合は、どちらか明確な方を実行してください。

OnlyOneReturnの場合、これを表示する方法はいくつかありますが(それぞれの背後に強力なサポーターがいます)、基本的にはすべて味わうことができます。

あなたの例では、OnlyOneReturnの提案者は次のようなコードを望んでいます。

public int performAction(String input) {
    int result;
    if (input.equals("bob")) {
        result = 1;
    } else {
        result = 2;
    }
    return result;
}

それよりも:

public int performAction(String input) {
    if (input.equals("bob")) {
        return 1;
    } else {
        return 2;
    }
}

ご覧のとおり、ReturnOnlyOnceの追加の明確さについては議論の余地があります。

ループ内のインスタンス化に関連するこのSOの質問も参照してください。

于 2010-03-24T17:20:13.733 に答える
5

この記事「 Java用のバグ検出ツールの比較」、「Nick Rutar、Christian Almazan、およびJeff Fosterによる、Java用のいくつかのバグチェッカーを比較しています...」— <a href="http://findbugs.sourceforge.net/ publications.html "rel =" nofollow noreferrer">FindBugsのドキュメントと出版物。PMDはかなり冗長であるように見えます。

補遺:著者が示唆しているように、

「すべてのツールは、誤検知と誤検知の生成の間で異なるトレードオフを選択します。」

特に、AvoidInstantiatingObjectsInLoopsは、それが意図されている場合、まったくバグではない可能性があります。不要なオブジェクトの作成を回避するために含まれています。同様に、 OnlyOneReturnは本質的に示唆に富むものです。複数の返品はgotoの形式を表し、有害と見なされることもありますが、読みやすさを向上させるために合理的に使用されます。

私の愛玩動物は、誤検知の概念を理解せずにそのようなツールの使用を義務付ける人々です。

ここに記載されているように、 PMDの最新バージョンは、ビルドプロセスに統合されたときに改善されたカスタマイズをサポートします。

于 2010-03-24T17:51:01.450 に答える
1

PMDのホームページを見ることができます。ルールはここで詳細に説明されており、多くの場合、理由が説明されています。このサイトはrules-groups用に構成されています。ここではbasic-rulesへのリンクがあります:http://pmd.sourceforge.net/rules/basic.html

于 2010-03-24T17:20:20.957 に答える
1

各ルールはPMDルールセットに含まれており、ルールの背後にある理由の手がかりを得ることができます(ルールセットページ自体で詳細に説明されていない場合)。

PreventInstantiatingObjectsInLoopsの場合、同様のオブジェクトを何度もインスタンス化するのはコストがかかる可能性があります。ただし、それは頻繁に必要です。私自身のプロジェクトでは、誤検知が多すぎるため、このルールを無効にしました。

OnlyOneReturnの場合、これはControversialと呼ばれるルールセットに含まれていることに注意してください。これは、これらのルールが議論の余地があり、ケースによって異なることを示唆しています。このルールセット全体も無効にしました。

于 2010-03-24T17:32:30.917 に答える