“依赖性倒置原则”(DIP)和“设计到接口原理”是否表达了相同的原理?如果没有,会有什么区别?
修改
澄清并缩小上下文:通过接口我的意思是编程接口,如Java interface
或C ++中的纯抽象基类。不涉及其他“合同”。
答案 0 :(得分:3)
我只是想在another question very similar to this one引用并引用Derek Greer,因为在我看来它确实很好地回答了这个问题。
“依赖性倒置原则未提及的是通过使用接口来抽象依赖性的简单实践(例如
MyService → [ILogger ⇐ Logger]
)。”
虽然这会将组件与依赖项的特定实现细节分离,但它不会反转使用者和依赖关系之间的关系(例如[MyService → IMyServiceLogger] ⇐ Logger
)。“
答案 1 :(得分:2)
依赖性倒置确保您的更高级别模块不依赖于更低级别的模块。因此,您的应用程序逻辑不依赖于您的业务模型或业务逻辑。关注点明显分开。
该原则声明您的应用程序定义并拥有业务层必须实现的接口。这样,业务层取决于应用程序定义的接口。因此,依赖性被反转。
扩展这一点,如果您现在有三个应用程序,每个应用程序都有自己的业务层实现的接口,您的业务层可以更改,并且只要它们必须实现接口,那么您的应用程序就更明智了。 / p>
这个原则的一个很好的例子以及如何构建这样的项目可以在我的网站上找到:http://www.jeenisoftware.com/maven-dip-principle-example/
依赖倒置与设计到界面的关系不大,虽然这就是正在发生的事情,但更多的是关于实现服务。换句话说,一种面向服务的设计模式。
答案 2 :(得分:0)
设计到接口(作为design by contract的变体)支持依赖性反转。两者都减少耦合。但是:
这些方法往往相互补充。
答案 3 :(得分:-1)
“按合同设计”和“依赖注入”密切相关,但具有不同的抽象层次。 “按合同设计”是一种非常通用的设计原则,可以通过各种技术支持;在具有类Java类系统的语言中,一种技术是使用接口来避免具体的类依赖。 “依赖注入”是另一种技术,它通常依赖于函数接口的存在(但不必总是这样做 - 它取决于语言)。我会说“依赖注入”支持“按合同设计”的原则。