【问题标题】:PMD validation for "x!=y"“x!=y”的 PMD 验证
【发布时间】:2014-07-01 20:57:58
【问题描述】:

这是我的代码:

private void showMessageForInvalid(File aFile) {
  if (!aFile.exists()) {
     // show not exists message
  } else if (!aFile.isDirectory()) {
     // show not directory message
  }
}

对于第一个 if 块,我收到 PMD 警告“避免 x!= y else”。我认为,这个警告是正确的,以防万一

if (!aFile.exists()) {
  // do something
} else {
  // do else
}

但在我的情况下,else if 声明并非如此。
这是 PMD 错误还是此警告正确(在这种情况下我应该如何编写代码)?

【问题讨论】:

  • 这可能是因为 pmd 认为积极的结果应该在if else 块中排在第一位。

标签: java pmd


【解决方案1】:

除了@Tim B 的回答:

它在Design rules as 'confusing ternary' 下列出。

在if-else 块中包含!condition 通常是不好的。在大多数情况下,这是由于结构不良:

if(healthy)
     business-logic
else
     error-handling

以上是大多数(诚然不是所有人)人们认为的自然思路,而不是

if(!healthy)
     error-handling first
else
     business-logic later

现在,情况并非总是如此 - 您的函数(在其名称中暗示)显式处理错误情况 - 是可能的异常之一。不幸的是,使用像 PMD 这样的静态代码分析工具,您可以捕获所有案例,也可以不捕获任何案例——在这种情况下,开发人员选择了全部;诚然让它有点过分热心。

无论如何,这就是它被列入 PMD 设计规则的原因。当遇到这样的情况时,我发现最简单的方法是指定a ruleset exclusion as described here,而不是将源代码实际修改为对我来说没有意义的东西。

【讨论】:

  • 感谢您的回答。这就是我想知道的。关于您的示例:它很好且正确,但在某些情况下,当出现问题时我会得到一个空值,并在业务逻辑之前编写错误处理。
【解决方案2】:

先做exists分支:

if (aFile.exists()) {

   if (aFile.isDirectory()) {
       // Do stuff
   } else {
       // show not directory message
   }    
} else {
   // show not exists message
}

这具有相同的实际程序流程和逻辑结构,但“一目了然”发生了什么。

【讨论】:

  • 我觉得你的方法并不比我的好
  • 在您的方法中,“不是目录”消息依赖于现有目录并不是很明显。这就是为什么认为代码可读性较差并且您会收到警告的原因。我建议的结构很可能不会触发 PMD 警告,一旦您将代码放入Do stuff,它就会立即清晰。特别是因为在您的原始示例中,您生成了错误消息,但仍然继续执行您的代码(除非该消息也退出了该方法)。
  • 有争议的不是更好的风格,但 PMD 认为它是。将if (!C) A else B 与if (C) B else A 切换。 PMD 在这里超过了它的目标。
  • @JoopEggen 对于它的价值,我同意它的风格并不多。例如,我不会在代码审查中抱怨原始代码。
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
相关资源
最近更新 更多