PMD规则背后的“原因”

2022-09-01 13:21:11

有没有一个很好的资源来描述PMD规则集背后的“为什么”?PMD的网站有“什么” - 每个规则做什么 - 但它没有描述为什么PMD有这个规则,以及为什么忽略这个规则会让你在现实世界中陷入困境。特别是,我很想知道为什么PMD有避免实例化ObjectsInLoops和OnlyOneReturn规则(如果您需要创建一个与集合中的每个对象相对应的新对象,第一个似乎是必要的,第二个似乎是在许多情况下基于某些标准返回值的必要条件),但我真正想要的是描述大多数PMD规则背后的“为什么”的链接, 因为这经常出现。

为了清楚起见,我知道我可以禁用这些以及如何做到这一点,我只是想知道为什么它们首先在那里。很抱歉,如果有什么明显的东西我错过了那里,但我在发布之前做了一个谷歌搜索和SO搜索。我也明白,这些问题通常是一个“品味”问题 - 我正在寻找的是规则的论据是什么以及有什么替代方案。举一个具体的例子,你应该如何实现一个对应于循环中每个对象的对象(这在Java中是一个常见的操作),而不实例化循环中的每个对象?


答案 1

在每种情况下,规则可以是特定情况的问题,也可以只是“品味”。

如果存在大量迭代并且实例化成本高昂,则应避免在循环中实例化对象。如果可以将代码移出循环,则可以避免许多对象实例化,从而提高性能。话虽如此,这并不总是可能的,在某些情况下,这对代码的整体性能无关紧要。在这些情况下,请以更清晰的方式进行操作。

对于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 问题,它与循环中的实例化有关。


答案 2

这篇文章,A Comparison of Bug Finding Tools for Java,“由Nick Rutar,Christian Almazan和Jeff Foster撰写,比较了Java的几个bug检查器......”——FindBugs Documents and Publications。PMD被认为相当冗长。

附录:正如作者所建议的那样,

“所有工具在生成误报和漏报之间选择不同的权衡。

特别是,如果这是意图,则避免InstantiatingObjectsInLoops可能根本不是一个错误。包含它以帮助避免创建不必要的对象。同样,OnlyOneReturn本质上是暗示性的。多次返回表示一种形式的 goto,有时被认为是有害的,但可以合理地用于提高可读性。

我最讨厌的是那些强制使用此类工具而不了解误报概念的人。

如此处所述,较新版本的 PMD 在集成到构建过程中时支持改进的自定义。


推荐