【问题标题】:Are "Dependency Inversion" and "Design to Interfaces" the same principles?“依赖倒置”和“设计到接口”的原则是一样的吗?
【发布时间】:2009-03-03 12:00:23
【问题描述】:

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

编辑

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

【问题讨论】:

  • 你的意思是依赖注入(又名控制反转)?
  • 我在 Google 上找不到任何关于“接口设计原则”的信息 - 你能解释一下你的意思吗?
  • 您的意思可能是“按合同设计”
  • 正确的引用是“Program to an interface, not an implementation”(来自 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 所著的“设计模式:可重用软件架构的元素”一书)。

标签: oop dependency-inversion


【解决方案1】:

我只是想在another question very similar to this one 上加入并引用 Derek Greer,因为在我看来,它确实很好地回答了这个问题。

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

虽然这将组件与依赖项的具体实现细节解耦,但它不会颠倒消费者和依赖项之间的关系(例如[MyService → IMyServiceLogger] ⇐ Logger)。”

【讨论】:

    【解决方案2】:

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

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

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

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

    依赖倒置与其说是关于接口的设计,但它更多的是关于实现一个服务。换句话说,一种面向服务的设计模式。

    【讨论】:

      【解决方案3】:

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

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

      这些方法往往相互补充。

      【讨论】:

      • 一个(纯)抽象基 class= 接口。
      • DIP 在哪里谈论对象创建/生命周期?也许一些属于“创造”或“生命周期”类别的模式与 DIP 相得益彰,但作为原则,DIP 肯定并不关心这一点,而是完全关于设计。
      • 依赖inversion和依赖injection远不是一回事。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多