接口很多时候听起来很有道理,写的时候会质疑是不是为了接口而接口。一写二抄三重构,前面没有必要的时候不用接口,后面重复的时候可以引入接口。

现象

接口很多时候听起来很有道理,写的时候会质疑是不是为了接口而接口。

实际上,一写二抄三重构:

  • 前面没有必要的时候,不用接口;
  • 后面重复的时候,可以引入接口;
  • 二次重复的时候,就必须要重构了,引入接口是其中一种。

接口作用很大

def disk_build:
    if PitrixFolder.is_tps_container():
        image_name = ctx.tpsc_mgr.get_head_img(instance_id)
    else:
        image_name = PitrixFolder.get_head_img(instance_id)

就像存储,存储有多种,我们遍地的 if else,太难维护了,扩展性很差。

这个时候,如果我们用的是接口:

  • 那么所有类似 disk_build 的地方,参数都是接口;
  • disk_build 内没有条件判断,只有接口调用;
  • 而调用 disk_build 的时候传入具体的存储类型;
  • 大量的 disk_build,就避免了大量的条件判断。

条件判断不是问题,重复判断才是问题。

而接口,也可以方便的扩展存储,因为不用去调整大量的 disk_build 函数,只需要在调用 disk_build 的地方传入新的类型。

接口不是完全避免了新引入类型的工作量,入口处还需要处理,但是依然保证了内部核心流程的稳定性,因为入口处肯定不是核心流程嘛。

小结

  • 面向接口,一写二抄三重构;
  • 前面没有必要的时候不用接口,后面重复的时候可以引入接口;
  • 二次重复的时候,就必须要重构了;
  • 条件判断不是问题,重复判断才是问题;
  • 接口保证内部核心流程的稳定性,入口处处理新类型即可。