我已经针对我的代码在Eclipse中运行了PMD插件,并且我正在获得类似于下面所示代码的高优先级警告:
if(singleRequest !=null){
// do my work
}else{
// do my other work
}
Run Code Online (Sandbox Code Playgroud)
PMD说`Avoid if (x != y) ..; else ..;
错误的描述如下:
In an "if" expression with an "else" clause, avoid negation in
the test. For example, rephrase:
if (x != y) diff(); else same();
as:
if (x == y) same(); else diff();
Most "if (x != y)" cases without an "else" are often return
Run Code Online (Sandbox Code Playgroud)
但我仍然无法理解对我的代码的影响.如果有人可以用一个例子来指导我,我将不胜感激.
小智 13
PMD是一种工具.PMD基于启发式工作.有人决定使用这种启发式方法; 使用else语句的负面条件不是"好风格".
但是,在这种情况下,正如我在评论中所论述的那样,发布的代码就是我如何写它.(特别是x != null,但不仅限于此构造.)
这是因为我没有看条件(除了它可以简化;例如删除Jim Kin所示的双重否定),而是我看看分支或"流" 的逻辑.
也就是说,我首先放置正分支.在这种情况下,我认为
if (x != null) {
doValid // positive branch
} else {
doFallback
}
Run Code Online (Sandbox Code Playgroud)
在语义上等同于
if (isValid(x)) { // it looks like a "positive conditional" now
doValid // still positive branch
} else {
doFallback
}
Run Code Online (Sandbox Code Playgroud)
因此,首先是积极的分支.
当然,并非所有情况都有这种"明确的"正向流动,并且某些表达方式可能以消极的方式表达得更加容易.在这些情况下,我将"反转"分支 - 类似于PMD建议的 - 通常用注释说明如果正分支 /流量被反转则在块顶部的动作.
可能影响所使用的条件选择的另一个因素是"立即范围退出"分支,如:
if (x == null) {
// return, break, or
throw new Exception("oops!");
} else {
// But in this case, the else is silly
// and should be removed for clarity (IMOHO) which,
// if done, avoids the PMD warning entirely
}
Run Code Online (Sandbox Code Playgroud)
这就是我 一贯地(除了一些偶然的例外)编写我的代码:if (x != null) { .. }.使用可用的工具; 并让它们为你工作.请参阅Steven关于如何在这里将PMD配置为更合适的"品味"的答案.
这是一个可读性问题.考虑
if ( x != y )
{
}
else // "if x doesn't not equal y"
{
}
Run Code Online (Sandbox Code Playgroud)
与
if ( x == y )
{
}
else // "if x doesn't equal y"
{
}
Run Code Online (Sandbox Code Playgroud)
后一个例子更容易识别.请注意,我认为使用底片并没有错...它可以更有意义,考虑一下
if ( x != null )...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9942 次 |
| 最近记录: |