依赖倒置就是每一个实现都要抽一个接口出来吗?
依赖倒置就是每一个实现都要抽一个接口出来吗?
本文的标题实际上来自于一次与项目上同事中午吃饭时的讨论:
A: 我觉得我们现在的抽象有点多,infra 层里面每一个类都抽取了接口,这些被调用的类多半只有一个实现, 我们是不是做的太细了?
B: 从依赖倒置的角度讲,domain 层和 service 层并不应该直接调用 infra 层的实现,因此我们确实是需要每一个实现都抽一个接口出来。
A: 那依赖倒置就是每一个实现都要抽一个接口出来吗?
B: 这个...
看来小伙伴 A 不经意间触碰到了 S.O.L.I.D. 的深水区...
相比于单一职责、开闭、接口隔离等原则,依赖倒置与里氏替换类似,属于更偏向操作指导的一类原则,比如从依赖倒置的定义来看:
依赖倒置:高层模块不应直接依赖低层模块,他们都应该依赖于彼此间的抽象。
以开发的角度理解:高层不要直接调用低层,而是调用抽取出来的接口。
那这么说,依赖倒置就是每一个实现都要抽一个接口出来吗?
为了解释这个问题,我们尝试来提出一个新的问题:为啥要依赖倒置?