PMD规则背后的“为什么”

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

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

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

如果存在大量迭代且实例化很昂贵,则应避免在循环中实例化Object。 如果您可以将代码移出循环,则可以避免许多对象实例化,从而提高性能。 话虽如此,这并不总是可行的,在某些情况下,它与代码的整体性能无关。 在这些情况下,做哪个更清楚。

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

本文“ 用于Java的Bug查找工具的比较 ”,作者Nick Rutar,Christian Almazan和Jeff Foster,比较了Java的几个bug检查器……“ – FindBugs文档和出版物 。 PMD被认为更加冗长。

附录:正如作者所说,

“所有这些工具都会在产生误报和误报之间选择不同的权衡。”

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

我的烦恼是那些在不理解误报概念的情况下强制使用这些工具的人。

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

您可以查看PMD主页,这里详细解释了规则,并经常说明原因。 该网站是为规则组构建的,这里是基本规则的链接: http : //pmd.sourceforge.net/rules/basic.html

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

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

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