A: 我觉得我们现在的抽象有点多,infra 层里面每一个类都抽取了接口,这些被调用的类多半只有一个实现,我们是不是做的太细了?
B: 从依赖倒置的角度讲,domain 层和 service 层并不应该直接调用 infra 层的实现,因此我们确实是需要每一个实现都抽一个接口出来。
A: 那依赖倒置就是每一个实现都要抽一个接口出来吗?
B: 这个…
看来小伙伴 A 不经意间触碰到了 S.O.L.I.D. 的深水区…
相比于单一职责、开闭、接口隔离等原则,依赖倒置与里氏替换类似,属于更偏向操作指导的一类原则,比如从依赖倒置的定义来看:
依赖倒置:高层模块不应直接依赖低层模块,他们都应该依赖于彼此间的抽象。
以开发的角度理解:高层不要直接调用低层,而是调用抽取出来的接口。
那这么说,依赖倒置就是每一个实现都要抽一个接口出来吗?
为了解释这个问题,我们尝试来提出一个新的问题:为啥要依赖倒置?
为啥要依赖倒置
先说结论:因为依赖倒置能隔离变化,使核心业务更稳定。
代码是由业务需求驱动出来的,而业务驱动路径一定是从高层(较为稳定的核心业务层)逐渐传递至低层(较为多变的外围支撑层)。高层不会去了解低层的实现细节,而只会对低层给出需求的定义。依赖倒置就是要明确需求的定义。
我们引入一个例子,
业务需求如下:
对于某文档管理系统,业务上需要对用户创建的文档进行存取。现有若干 Document 文档对象,