接口很多时候听起来很有道理,写的时候会质疑是不是为了接口而接口。一写二抄三重构,前面没有必要的时候不用接口,后面重复的时候可以引入接口。
现象
接口很多时候听起来很有道理,写的时候会质疑是不是为了接口而接口。
实际上,一写二抄三重构:
- 前面没有必要的时候,不用接口;
- 后面重复的时候,可以引入接口;
- 二次重复的时候,就必须要重构了,引入接口是其中一种。
接口作用很大
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 的地方传入新的类型。
接口不是完全避免了新引入类型的工作量,入口处还需要处理,但是依然保证了内部核心流程的稳定性,因为入口处肯定不是核心流程嘛。
小结
- 面向接口,一写二抄三重构;
- 前面没有必要的时候不用接口,后面重复的时候可以引入接口;
- 二次重复的时候,就必须要重构了;
- 条件判断不是问题,重复判断才是问题;
- 接口保证内部核心流程的稳定性,入口处处理新类型即可。