再谈如何优雅修改代码-策略 1:方法新增

时间:2024-10-07 22:53:56
通过新增方法来隔离旧逻辑,即:在旧方法里横切“缝隙”,注入新的业务逻辑被调用;

拿之前的 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());
}

可以看到优点很明显:新老代码清晰隔离;当然为了更加职责分明,使用新增类隔离会更好;