依赖注入如何不仅将复杂性移到一个单独的类中?


9

我本周一直在研究使用Typhoon框架进行依赖注入。我了解到,分离对象的构造对于在单元测试期间用模拟替换任意组件是有好处的,到目前为止,我仅从中看到了好处。

但是我不禁想到,在我拥有一个包含数十个头导入的庞大的视图控制器类之前,现在我有了一个包含数十个头导入的庞大的工厂类。我应该避免参加大量的工厂培训班吗?


6
十年之内,我预计DI将接管Singleton的重拳,但这一次是有充分理由的。它有一些很好的用途,但是我建议要非常小心地评估影响。
2013年

5
我不认为依赖注入是降低复杂度的一种方法,而是避免使用隐式依赖(使用全局符号/自由变量)而使用显式依赖(使用显式参数/绑定变量)的方法。因此,复杂性仍然存在,但是由于在方法/构造函数签名中将其显式指定,因此您不得不对其进行处理。
Giorgio 2013年

7
注意,几乎任何用于组织代码的系统都可以描述为“只是将复杂性移到其他地方”。与其说消除复杂性,不如说是以最合逻辑,最有用的方式组织它。

1
如果必须导入50个标头,则必须在某处进行。DI帮助您以更简单的方式对代码进行单元测试。
2013年

2
那么,您是说现在您的控制器专注于控制,标头导入工厂专注于标头导入吗?无论您是否使用DI框架,那怎么可能是一件坏事?
pdr 2013年

Answers:


16

依赖注入简单地帮助定义一个对象如何知道另一个依赖对象。它不会帮助您降低系统的整体复杂性。如果在DI之前需要数十次导入,则在DI之后仍需要数十次导入。不同之处在于这些导入将位于更有意义的位置(类)(工厂,制造商等)。

通过允许通过构造函数或方法提供依赖关系,可以让您自己灵活地为您的类提供一个不同但仍有效的依赖对象,并通过消除担忧来提高该类的凝聚力。

有几种相似且经常一起使用的原理:依赖注入(DI),控制反转(IoC)和依赖反转原理(DIP)

从本文 http://martinfowler.com/articles/dipInTheWild.html

DI与布线有关,IoC与方向有关,DIP与形状有关


2
+1,最后一个报价。这是人们经常误解的这三个概念的最好澄清。
haylem 2013年

上面的链接文章非常出色。足够深入和清晰的解释。
DemetriKots 2013年

10

依赖注入不会降低复杂性,但是会通过关注点分离和减少耦合来提高可操作性。

但是我不禁想到,在我拥有一个包含数十个头导入的庞大的视图控制器类之前,现在我有了一个包含数十个头导入的庞大的工厂类。我应该避免参加大量的工厂培训班吗?

您应该避免使用“笨拙的”课程。因此,假设您将视图控制器分为较小的,更易于维护的类。现在,所有这些人都有责任掌握其依赖关系。DI帮助您将依赖关系管理从所有这些类移到负责依赖关系管理的工厂/配置类中-请参阅“单一职责原则”。尽管它肯定会比原始的视图控制器少很多,但如果它变得太大,您总是可以选择将其拆分为较小的依赖项管理类,这些类负责应用程序的不同部分。


2

用外行的话来说:

依赖注入将复杂性移到危害较小的地方。

@gnat的编辑:DI不仅将复杂性转移到一个单独的类中,还将其转移到造成较小危害的地方。


这如何回答所提问题?
gnat 2013年

@gnat添加了一个编辑,我的回答在我看来解释了DI不只是将复杂性转移到一个单独的类中。
图兰斯·科尔多瓦2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.