我们的代码库是新老程序员,像我自己一样,为了统一起见,他们很快就学会了按照做事的方式来做。考虑到我们必须从某个地方开始,我自己决定重构一个数据持有者类,如下所示:
- 删除了setter方法,并设置了所有字段
final
(我final
理所当然地认为“ 好”)。事实证明,该二传手仅在构造函数中使用,因此没有副作用。 - 引入了一个Builder类
Builder类是必需的,因为构造函数(首先是提示重构的原因)跨越大约3行代码。它有很多参数。
幸运的是,我的一个团队的成员正在另一个模块上工作,并且碰巧需要设置者,因为他需要的值在流程的不同点可用。因此,代码如下所示:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
我认为他应该改用构建器,因为摆脱设置器可以使字段保持不变(他们之前听说过关于不变性的内容),并且还因为构建器允许对象创建是事务性的。我草绘了以下伪代码:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
如果引发该异常,bar
将有损坏的数据,而使用构建器可以避免:
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
我的队友反驳说,有问题的异常永远不会触发,对于特定的代码区域来说这是公平的,但是我相信缺少树的森林。
折衷方案是恢复到旧的解决方案,即使用无参数的构造函数,并根据需要使用setter设置所有内容。理由是该解决方案遵循了我的违反的KISS原则。
我是这家公司的新手(不到6个月),并且完全意识到我失去了这家公司。我的问题是:
- 是否还有另一个争论来使用Builders而不是“旧方法”?
- 我提出的变更真的值得吗?
但是真的
- 在提倡尝试新事物时,您有什么技巧可以更好地表达这些论点?
setA
?