18

我正在使用 PMD 分析代码,它会产生一些我不知道如何修复的高优先级警告。

1)Avoid if(x!=y)..; else...;但是如果我需要这个逻辑我该怎么办?也就是说,我确实需要检查是否x!=y?我该如何重构它?

2)Use explicit scoping instead of the default package private level.但该类确实只在包内使用。我应该使用什么访问修饰符?

3)Parameter is not assigned and could be declared final.我应该在 PMD 指出的所有地方添加 final 关键字吗?

4

5 回答 5

33

避免否定:而不是if( x!=y ) doThis() else doThat(),首先检查积极的情况,因为人们/人类倾向于喜欢积极的事物而不是消极的事物。在阅读源代码时,它扭曲了大脑,不得不颠倒头脑中的逻辑。因此,改为:

 if ( x!=y ) doThis() else doThat()       // Bad - negation first
 if ( x==y ) doThat() else doThis()       // Good - positive first

明确范围:根据PMD 网站,这是一个有争议的规则。你可能讨厌它,别人喜欢它。您应该做的是将类中的所有字段设为私有。似乎有一个具有包可见性的字段或方法(不是类),例如:

 class Foo {
   /* private missing */ Object bar;
 }

最终参数:方法参数应该是最终的,以避免意外重新分配。这只是一个好习惯。如果您使用的是 Eclipse,内容助手甚至提供了一个名为“Change modifiers to final where possible”的快速修复。只需使用 Ctrl-a 选择编辑器中的所有代码,然后按 Ctrl-1。

于 2011-01-04T23:36:02.957 回答
6

您不需要启用所有规则。选择一些您同意的规则并重构您的代码,直到所有警告都被清除。

1 - 将其重构为if (x == y) ... else ...逻辑。只需避免 if 语句中的否定条件,它们会使代码更难理解

2 - 我不会启用该规则。

3 - 很多人将很多字段和变量声明为 final。尤其是当他们想确保或表达变量的值不应在方法中更改时。如果您不喜欢这样,请禁用该规则。

于 2011-01-04T23:35:24.563 回答
4

这些似乎都是可以关闭的小警告。

1)它希望你翻转逻辑

if(x==y) {
    //old else clause
} else {
    //old if clause
}

2)如果包确实是您想要的正确访问权限,则无需添加访问修饰符。我不够熟悉,不知道是否有办法抑制该特定警告。

3)风格问题。有些人希望对可能发生的所有事情都进行最终处理。其他人则认为它为很少的信息增加了太多的混乱。如果您在后一个阵营,请关闭该警告。

于 2011-01-04T23:33:49.493 回答
4

关于第一项(不等式)有两个问题:

1)双重否定的可读性。

假设你有:

if(x!=y) { false clause } else { true clause }

如果“not x is not equal to y”,则执行第二个子句。

这可以重写为:

if (x==y) {true clause } else {false clause}.

2) 正确性:如果 x 和 y 不是原始的,则使用if(!x.equals(y))更安全。这相当于使用 == 而不是 .equals() 并且可能导致非常严重的错误。

于 2011-01-04T23:34:27.887 回答
1

您也可以// NOPMD在不希望检查 PMD 规则的任何行的末尾使用。

例如,对于上面给出的代码,您可以通过给出来抑制 PMD 检查,

class Foo {
   /* private missing */ Object bar; // NOPMD
 }

请注意,上述评论可能会默默地抑制同一行中的其他警告。

于 2012-06-03T10:05:48.977 回答