Dependence Inversion Principle

来源:互联网 发布:芒果tv有Mac 版吗 编辑:程序博客网 时间:2024/06/07 02:45

Dependence Inversion Principle(依赖倒置原则),简称DIP,OO设计原则之一。它的原定义是这样的:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.翻译 成中文就是:

1.高级模块不能依赖于低级模块,二者都应该依赖于抽象

2.抽象不应该依赖于细节

3.细节依赖于抽象

低级模块指的是具有原子(简单)逻辑的模块,不能再分,而高级模块就是非原子(复杂)逻辑的模块,是多个原子逻辑模块的组合。

依赖指的是一个模块内部引用了一个外部模块,如:模块M1内部引用了模块M2,则M1依赖于M2。依赖又可以说成是耦合,是一种常见的表达,耦合分为三种:

零耦合:两个类之间没有相互依赖的关系

具体耦合:耦合关系发生在两个具体类之间

抽象耦合:偶然关系发生在类和抽象类之间(是DIP提倡的)

Robert C. Martin 对 “Bad Design”的定义如下:

1.it is hard to change because every change  affects too many other parts of system.

2.when you make a change,unexpected other parts of the system break.

3.it's hard to reuse in another application,because it cannot be disentangled(分离) from the current application.

导致Bad design 原因主要就是因为高级模块过度的依赖于低级的模块,从而使得模块间过于藕和,当对低级的模块进行修改时,就会影响我们的高级的模块。由于高级模块过度的依赖于低级的模块,导致我们的高级模块不利于重用,因为another application 不会配置我们的低级模块。相反一个良好的设计,应该保证各个模块之间是相互独立的,是可以被替换的。打个比方,汽车引擎公司生产的引擎不会只适用于某个品牌的汽车,而是所有的汽车都可以用。原因就是因为引擎对汽车来说是独立的,是可以被替换的,引擎就是一个低级的模型,汽车就是一个高级的模型。

DIP通俗点就是说,要针对抽象编程,而不是具体的实现编程。例如:我们设计一个通用的数据库模块DatabaseModel,其中包含了数据的写入模块WriteModel 和数据的读取模块ReadModel,DatabaseModel就是一个高级模块,WriteModel和ReadModel就是一个低级模块。如果现在我们使用的是mysql数据库,我们的ReadModel,和WriteModel都是针对mysql数据库设计的,DatabaseModel直接使用了针对具体实现(mysql数据库)的低级模块。现在我们换了一个平台,我们的数据库换成了oracle,那么我们的高级模块(DatabaseModel)在新平台上就不能使用了。DIP就为我们提出了一个解决此类问题的方法:在高级模块和低级模块之间添加一个抽象层(这让我想起了一句话,在计算机领域,只要抽象出新的一层就可以解决所有的问题,确实如此),高级模块,低级模块都针对抽象设计。低级模块可以由抽象生成针对mysql,oracle,mssql的WriteModel和ReadModel, 而 DatabaseModel 针对抽象设计,可以适应由不同的低级模块组成的平台。




0 0