9

我无法弄清楚依赖倒置原则(SOLID 原则之一)和一般的“代码到接口”或分离接口模式之间的区别。他们都主张创建一个抽象层来解耦低层和高层模块。

DI 原则设想创建接口以在较高层和较低层模块之间进行交互,但也坚持接口必须是较高层包的一部分。
为什么这应该是更高级别而不是更低级别的一部分?暴露其行为的是较低级别,所以解耦接口不应该是较低级别的一部分吗?如果有多个更高级别的模块依赖于相同的较低级别怎么办?

不然的话,
为什么不做一个单独的包来放置所有的接口,这样高层和低层都可以使用呢?(这是由分离接口模式设想的。)

我的困境是,我无法弄清楚它们的相对用途和好处。

请不要引用 Derek Greer 或 Robert Martin 的文章。我已经阅读了这些文章,但困惑仍然存在。

4

3 回答 3

4

依赖倒置是一个概念,它是依赖注入框架(如 Spring、Guice 等)的构建块。它所说的是组件不应查找其依赖项,而应从外部注入其依赖项。一个组件的依赖可以是一个接口或另一个类。当依赖项是一个接口时,组件可以灵活地与各种实现一起工作。

举个例子:假设有人正在编写一个需要进行一些服务调用的组件。如果组件开发人员认为必须始终使用 HTTP 进行服务调用,那么她将使 HTTP 客户端成为依赖项。现在,这将组件实用程序限制为只能调用基于 HTTP 的服务。但是,同一个开发人员可能已经创建了一个接口,比如说 GenericExternalServiceInvoker,并实现了两个实现 - 一个使用 HTTP,另一个使用某种排队系统,如 ActiveMQ。接口的使用使组件开发人员能够创建以更广泛的方式有用的组件。

在上面的例子中,我们假设 DI 已经到位。因为依赖项是从外部注入的。组件开发人员可以做出另一种设计选择,并且可以在代码中实例化 HTTP 客户端,因此如果需要,组件的用户很难改变其行为,以使用 HTTP 以外的其他东西。

因此,总而言之,应该使用 DI,这样组件就不会以硬连线的方式依赖于它的依赖。通过使组件的依赖成为接口,组件中内置了进一步的灵活性。第二个原则,代码到接口,是开发人员选择接口作为依赖项而不是具体类的指导因素。

于 2013-12-20T09:28:09.137 回答
1

我想您的意思是依赖注入接口编程之间的区别

接口编程

接口编程是软件开发中的一种实践,其中不同的对象通过公共接口相互交互。这允许更大的灵活性,因为人们可以轻松地从一个接口实现切换到另一个接口实现,只需对代码库进行最少的更改,甚至可以避免重新编译代码。

依赖注入

依赖注入是一种允许由框架而不是开发人员创建对象实例的机制。在大多数情况下,一个对象可能需要一些额外的对象(称为依赖项)已经存在并在当前对象的构造函数中传递,或者传递给该对象的属性,以便它可用。依赖注入是一种机制,它允许框架在构造所需对象(注入它们)时提供设置这些。通常,框架根据外部配置或代码检查知道要做什么。 依赖注入范式依赖对接口的编程
实践(这就是我首先描述它的原因),因为依赖项通常通过它们的公共接口公开。因此,可以仅基于配置更改来使用不同的实现。这可以在测试应用程序的某些方面时轻松使用对象的模拟设置。

通常,依赖注入被称为控制机制的反转,因为它使框架(即应用程序代码)处理对象创建而不是手动实例化(由开发人员完成)。

根据aknon的评论:

依赖注入和依赖倒置一样吗?

不一定。依赖倒置也可以称为倒置两个对象之间依赖关系的重构过程。例如,class A可能依赖于class B 之前的重构之后你可能不得不class B依赖class A,从而反转它们的依赖关系。依赖注入是一种无需显式编写代码即可提供依赖的机制。

更新

有关术语依赖倒置的更多信息,我建议您阅读Rich Newman 的这篇文章。它是解决 Microsoft 智能客户端软件工厂技术(现已过时)的系列文章的一部分,但该文章足够中立,可以独立存在。


也可以看看:

于 2013-12-20T09:31:51.810 回答
0

复杂的依赖注入通常需要针对接口进行编程。我不认为将 API 放在单独的模块中,或者只是放在不同的包中,或者并排实现在原则上可能是对的错的。这取决于:我见过的大多数项目将接口和实现捆绑在一起,但有时 api 二进制文件甚至被放在不同的存档中,比如servlet-api.jaror logging-api.jar.

事实上,我认为在这样一个细节上比较两者没有任何价值。一段时间后,我决定常识是唯一始终适用的原则,并且在阅读方法论/模式/任何人应该考虑到它的作者卖书,在会议上发言,并且通常从中获利时。这并不是说这些阅读材料毫无用处,恰恰相反:它们是从他人的成功和失败中学习的基本方式。但是这些论点应该持保留态度,因为该解决方案可能不适用于特定项目。

该领域唯一的“圣经”是可以以某种方式衡量的事物,例如数据结构和算法以及规范。我不会在乎Bob 叔叔和 Martin Fowler 之间关于将接口放在哪里更正确的问题:把它放在你觉得舒服的地方,放在适合你的地方。一段时间后,如果您做出了错误的决定,您将始终能够重构和移动事物。

于 2013-12-20T09:44:38.740 回答