7

“依赖倒置原则”(DIP)和“接口设计原则”表达了相同的原则吗?如果不是,会有什么区别?

编辑

为了澄清和缩小上下文:接口是指编程接口,如 Javainterface或 C++ 中的纯抽象基类。不涉及其他“合同”。

4

4 回答 4

3

我只是想在另一个与这个问题非常相似的问题上加入并引用 Derek Greer ,因为在我看来,它确实很好地回答了这个问题。

‌<em>“依赖倒置原则没有提到的是通过使用接口(例如MyService → [ILogger ⇐ Logger])抽象依赖关系的简单实践。”

虽然这将组件与依赖项的特定实现细节分离,但它并没有颠倒消费者和依赖项之间的关系(例如[MyService → IMyServiceLogger] ⇐ Logger)。”

于 2011-03-03T14:16:57.613 回答
2

依赖倒置确保您的更高级别的模块不依赖于较低级别的模块。因此,您的应用程序逻辑不依赖于您的业务模型或业务逻辑。有明确的关注点分离。

该原则表明您的应用程序定义并拥有您的业务层必须实现的接口。这样,您的业务层取决于您的应用程序定义的接口。因此依赖关系是倒置的。

扩展这一点,如果您现在拥有三个应用程序,每个应用程序都有自己的接口,由业务层实现,您的业务层可以更改,只要它们按照它们必须的方式实现接口,那么您的应用程序就不会更明智。

可以在我的网站上找到这个原理的一个很好的 Java 示例以及如何构建这样的项目:http: //www.jeenisoftware.com/maven-dip-principle-example/

依赖倒置与其说是关于接口的设计,尽管这就是正在发生的事情,但更多的是关于实现服务。换句话说,一种面向服务的设计模式。

于 2013-02-14T23:14:08.537 回答
0

接口设计(作为契约设计的变体)支持依赖倒置。两者都减少了耦合。然而:

  • 接口设计和 DBC 没有说明对象是如何创建的(例如 DIP、抽象工厂工厂方法)。
  • 依赖倒置(dependency injection)一般依赖于接口,但侧重于对象生命周期而不是类设计。如果您愿意,可以将 DIP 与抽象基类一起使用,因此您并不真正致力于纯接口。

这些方法往往相互补充。

于 2009-03-03T12:15:44.610 回答
-1

“契约式设计”和“依赖注入”密切相关,但抽象层次不同。“按合同设计”是一个非常普遍的设计原则,可以通过各种技术来支持;在具有类 Java 类系统的语言中,一种技术是使用接口来避免具体的类依赖关系。“依赖注入”是另一种技术,它通常依赖于接口的存在来运行(但不必总是这样做——这取决于语言)。我想说“依赖注入”支持“按合同设计”的原则。

于 2009-03-03T12:08:00.403 回答