检测不断变化价值的物体作为参数
-
23-08-2019 - |
题
我现在的工作与代码看起来像这样
public String getName(User user) {
user.setSth(...);
return user.getName();
}
我认为这是糟糕的做法,以改变对象,通过为参数。是有一个工具,用于检测这种代码?我看着置的代pmd和checkstyle,但找不到任何检查。
P.S.对不起不好的例子。
解决方案
我想你已经在正确的轨道上:能够探测到这种代码的最好的工具是几乎可以肯定 FindBugs的。但是,您可能需要编写自己的检测器,这种模式。 这里是你将如何写一个检测器的例子,虽然它不是“T正是你要找的检测器。
买者:我真的不同意,一个副作用的吸气总是不好的风格。但是,如果你真的想找到那种事情,我会建议FindBugs的。
其他提示
你不会找到任何东西,因为,从一个工具的角度来看,"getName"和"setSth"只是方法的呼吁。人说"这是一个吸气"和"这是一个置者",但是工具不。事实上,getName()不是一个吸气,因为吸气不接受参数。
所以,该工具不能看到什么不寻常的,因为方法改变对象是所有的时间。
如果你想要执行这项规则,看看延伸置的代和PMD。两者都允许你来界定其他限制。你在寻找什么可能是:
- 如果方法的名字开始"得到"
- 和方法体呼吁方法的任何物体通过作为参数
然后打印出警告。这应该用不了太长时间。运行这个,你会看到许多"假阳性"你得到的(警告有关的方法实际上确定)。这将帮助你确定是否值得推行这一进一步。加上你就会有一个新项目加入到你的简历:)
您可以让User
不变(声明它final
,声明所有属性final
和远程的制定者,我知道是不是practible无处不在,但在许多地方是好的,你将不得不在没有合格的问题,其它的功能)
如果您有“变”的东西,你可以实现这样的样品中newId
功能:
public final class User {
private final String name;
private final int id;
User(String name, int id) {
this.name = name;
this.id = id;
}
public User newId(int newId) {
return new User(this.name, newId);
}
//getters here;
}
在建于String
,Integer
,......班做了。
可以创建称为仅包含“吸气剂”用户视图的接口,使用户实现它并使用新的用户视图接口作为参数的类型。
interface UserView{
public String getName();
...
class User implements UserView...
public String getName(UserView user) {
user.setSth(...); // Will not compile
return user.getName();
}
实际上这一点是在C ++中是很容易通过const
限定符做。你会定义一个参数作为const
并为参数,你只能调用定义为方法const
- 通常情况下,干将
在Java中,这是不存在的,并坦率地说,我不介意。如所提到的有源代码分析器,其可以检查此行为,以及元编程方法来做到这一点为好。
就个人而言,我相信如果该方法被适当地命名,没有传递一个目的是它使得它改性的问题。
有工具,可以“原因”约在更高的层次比编译器通常做的代码。声明性元编程例如是一门学科,允许编写程序,以检查是否另一个程序符合一定的设计,或者相反,以矿为代码味道和反模式。
某些链接:
http://www.cs.bris.ac .UK /出版物/ pub_master.jsp?ID = 1000273
和用于其余
您正在寻找的东西像C“常量” ++,将强制进行的参数值不变为在经过参考。不可变对象保证,如果你能和他们一起生活。
您会争辩说,这是“坏”,因为副作用,这样才能惊喜的用户。这是有效的,但如果它是一个的不需要的惊喜,这只是有害的。