通过新增方法来隔离旧逻辑,即:在旧方法里横切“缝隙”,注入新的业务逻辑被调用;
拿之前的 Case 举例,一个历史老方法,需要对返回的数据集合过滤掉空对象:
public class Foo {
private Bar bar;
public Foo() {
bar = new Bar();
}
public List<Data> doSomething(int key) {
//依赖三方服务,RPC 调用结果集
List<Data> result = bar.getResult(key);
//过滤掉空对象
return result.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
}
此处逻辑很简单,使用了Java Lambda 表达式做了过滤,但这样的写法无疑雪上加霜:确实原先方法已经很 Low了,也无法单侧。本次只是在最后加了一段简单的逻辑。已经驾轻就熟了,可能不少人都会这样搞;
但作为好的程序员,眼前现状确实我们只能妥协,但后续的每一行代码,需要做到保质保量,努力做到不影响原有业务逻辑下做到可测试;
“方法新增”:通过新增方法 getDataIfNotNull 来隔离旧逻辑:
public List<Data> doSomething(int key) {
//依赖三方服务,RPC 调用结果集
List<Data> result = bar.getResult(key);
return getDataIfNotNull(result);
}
如下 getDataIfNotNull 作为新增方法,很容易对其进行独立测试,同时原有的方法 doSomething 也没有继续腐化
public List<Data> getDataIfNotNull(List<Data> result) {
return result.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
可以看到优点很明显:新老代码清晰隔离;当然为了更加职责分明,使用新增类隔离会更好;