Pmd静态分析和OnlyOneReturn问题

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2014/05/22/only-one-return/

Pmd是一款静态代码分析工具,可以分析处理一些简单的问题。

和Gradle也可以结合在一起用,运行gradle check就会运行pmdMain和pmdTest。

Pmd的分析基于RuleSet,即预设的规则,我一不留神开了Controversial Rules,然后就是一堆Error。

Pmd和RuleSet

Pmd的分析基于RuleSet,而每一个Rule都是由一个Java文件定义的,一般继承自 AbstractRule。

比如TooManyFields就继承了AbstractRule,然后在规则中判断了field数量,阈值DEFAULT_MAXFIELDS是15。

publicclass TooManyFields extends AbstractRule {
privatestaticfinalint DEFAULT_MAXFIELDS =15;
...
}

而常用的规则有

  • basic
  • naming
  • unusedcode
  • design
  • imports
  • junit
  • string
  • braces
  • codesize

就我个人而言,我觉得unusedcode和imports基本是不需要的了,现在的IDE可以解决这两个问题。

而basic包含了一些基本的,比如catch不为空,同时复写hashcode和equals等等,codesize检测过长的类和方法提示你重构。

Controversial Rules

因为新的项目我是重新配置的pmd,所以随手开了Controversial Rules。

这个规则集文档上就写明了这些都是有争议的观点和规则,所以分开放置。

这里面的规则时间间隔很大,有1.0就存在的,也有3.4加入的,总而言之,就是谨慎使用它们。

OnlyOneReturn问题

我开启Controversial Rule以后的主要错误就是OnlyOneReturn,即一个方法应该只有一个返回点,看这段代码:

publicbooleancheckoutBookById(int bookId) {
for(Book book:bookDao.getBooks()) {
if(book.getId()==bookId) {
book.checkout();
returntrue;
}
}
returnfalse;
}

这段代码有两个返回点,即在集合中找到了对象并执行方法返回true,没有找到最后返回false。

Code Complete一书有些相关描述,如果只有一个返回值,那么它一定在底部,这样就不用担心在此之前的某处退出方法。

但是有多个返回点一般意味着你一直到结果就返回了,这样代码会少一些。比如

publicbooleancheckoutBookById(int bookId) {
boolean checkoutSuccess =false;
for(Book book:bookDao.getBooks()) {
if(book.getId()==bookId) {
book.checkout();
checkoutSuccess =true;
break;
}
}
return checkoutSuccess ;
}

多了两行代码,从可读性上看似乎也没有太多的问题。

stackexchange上有一个很详细的说法,即Single Entry, Single Exit (SESE)这个观点源于C语言,主要为了防止资源泄露。

void f() {
resource res = acquire_resource();// think malloc()
if( f1(res) )return;// leaks res f2(res);
release_resource(res);// think free()
}

但是现代编程语言,比如Java提供了finally,从目的上将要求单返回点的动机已经很小了,而且SESE原则会导致代码复杂,基本上这条规则是不需要的了。

写在最后

一点点个人浅薄的想法,实际中肯定是根据情况操作,也不会有什么统一的原则和规范的。

只是看到了Pmd的报错提示,有点兴趣稍微看了看而已。

参考资料

AbstractRule
Pmd
Code Complete
Where did the notion of “one return only” come from?

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2014/05/22/only-one-return/

发表评论