29

是否有很好的资源来描述 PMD 规则集背后的“原因”?PMD 的网站有“什么”——每条规则的作用——但它没有描述为什么 PMD 有这条规则以及为什么忽略这条规则会给你在现实世界中带来麻烦。特别是,我很想知道为什么 PMD 有 AvoidInstantiatingObjectsInLoops 和 OnlyOneReturn 规则(如果您需要创建一个与集合中的每个对象对应的新对象,第一个似乎是必要的,第二个似乎在许多情况下是必要的根据某些标准返回一个值),但我真正想要的是一个链接,描述了大多数 PMD 规则背后的“为什么”,因为这经常出现。

为了清楚起见,我知道我可以禁用这些以及如何做到这一点,我只是想知道为什么它们首先存在。抱歉,如果我错过了一些明显的东西,但在发布之前我做了谷歌搜索和 SO 搜索。我也明白这些问题通常是“品味”问题——我正在寻找的是规则的论据是什么以及有什么替代方案。举一个具体的例子,你应该如何在不实例化循环中的每个对象的情况下实现一个与循环中的每个对象对应的对象(这是 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 主页,此处详细解释了规则,并且通常带有原因。该站点是为规则组构建的,这里是基本规则的链接:http: //pmd.sourceforge.net/rules/basic.html

于 2010-03-24T17:20:20.957 回答
1

每条规则都在 PMD 规则集中,它可以为您提供规则背后的推理线索(如果规则集页面本身没有详细解释)。

在 AvoidInstantiatingObjectsInLoops 的情况下,一次又一次地实例化类似的对象可能会很昂贵。然而,它经常是必要的。在我自己的项目中,我禁用了此规则,因为它标记了太多误报。

在 OnlyOneReturn 的情况下,请注意它位于名为Controversial的规则集中,这暗示这些规则是有争议的,并且取决于具体情况。我也禁用了整个规则集。

于 2010-03-24T17:32:30.917 回答