本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: 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/