我现在的工作与代码看起来像这样

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;
}

在建于StringInteger,......班做了。

可以创建称为仅包含“吸气剂”用户视图的接口,使用户实现它并使用新的用户视图接口作为参数的类型。

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://prog.vub.ac.be/DMP/

http://www.cs.bris.ac .UK /出版物/ pub_master.jsp?ID = 1000273

和用于其余

http://www.google.com/search?num = 100&HL = EN&q =声明+元编程

您正在寻找的东西像C“常量” ++,将强制进行的参数值不变为在经过参考。不可变对象保证,如果你能和他们一起生活。

您会争辩说,这是“坏”,因为副作用,这样才能惊喜的用户。这是有效的,但如果它是一个的不需要的惊喜,这只是有害的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top