为什么四人帮中没有包括依赖注入模式?


37

为什么在依赖注入模式不是在incluided 四人帮?GOF是否早于广泛的自动化测试?现在依赖注入被视为核心模式吗?


18
..因为“依赖注入” 不是模式!
2012年


14
重复的一切都会形成重复的模式。 所有设计元素(不是唯一的疯狂想法)都是“模式”。
S.Lott 2012年

3
这些长时间的回答可能会误导人们,因为它们可以验证问题。如前所述,依赖注入不是一种设计模式。它是对象实例化的一种“机制”,通常由框架处理。
纳扎·梅尔扎

1
依赖注入是一种模式。它服务定位器模式相反。阅读创造该词的福勒。我完全不知道有多少人支持这种胡说八道。
詹姆斯

Answers:


101

当《四人帮》一书问世时,我是《软件开发》杂志的编辑,我完全可以肯定地说,在1994 年最初发布《设计模式》时,单元测试并不是一种普遍的做法。

1994年,C ++是最常用的面向对象语言,并且大多数对其编程的人都来自C背景。人们根本不具备的“对象思考”功能之一就是在您的程序中有成百上千个入口点的想法。您想到了main()。如果您从事大型项目,则可能会有一个(通常非常复杂的)makefile来创建基于模块的程序。但是“单元测试”呢?在每个方法的基础上启动一个进程,构建必要的内存上下文,执行它,然后拆掉它?那是非常激进的。

Java使多入口点编程变得更加明显。在最初的Dot-Com繁荣时期,单元测试是一种众所周知的技术,但实际上是JUnit(大约在2001年?)引起了轰动,并成为一种普遍实践。

尽管Strategy和接口编程的一般概念是GoF和90年代中期的时代精神的一部分,但是注入的思想对于该党来说却来得很晚(大约'03 -'05?)。老实说,我的白发对于DI的那部分还是很怀疑的(“下车,你该死的配置文件!”)。


17
我感到遗憾的是,我只能投一票赞成这样有见地的答案。

@Larry OBrien:扫描基于约定的注册会大大简化配置代码,并实际上消除了ioc容器中的xml配置。
2012年

4
我想补充一下,依赖注入的核心根本不依赖配置文件。您可以手动完成所有操作,这使其非常易于使用,并且仍然是一种非常灵活的方法。
marco-fiset 2012年

31

他们称之为战略

他们的策略似乎具有依赖项注入的所有功能,但名称听起来并不复杂。


16
-1。抱歉! 策略模式与依赖注入无关。
Dipan Mehta


14
@Dipan:在对此进行否决之前,您最好考虑五分钟的答案。
Doc Brown

6
确实可以将依赖注入视为与策略模式非常相似,但是当人们说依赖注入时,它们通常表示控制反转,我认为这与策略(尤其是IoC容器)有很大不同。
MattDavey

8
DI更像是一种创造模式。它创建并注入策略。说这是一种策略只是事实的一半。DI更像是一个微内核模式!我不敢相信人们会对此表示支持。策略更像是良好DI的特征,而不是必要条件。
猎鹰

0

我认为依赖注入在分层实现中更为相关。我们考虑依赖注入的另一个领域是单元测试。您的事前建议似乎是正确的。如果该团伙要在2012年收集和隔离模式,那么肯定会有依赖注入。

策略可以在讨论中提出,但是策略没有讨论依赖注入。但是,当在单个项目或dll中使用策略模式时(所有类和接口都保留在一个项目中),看来我们正在进行依赖项注入。实际上我们不是。

现在,如果策略模式中提到的类和接口在不同的项目或层中是分开的,则WE将不得不使用依赖注入技术。我们可以使用统一的配置文件(尽管无法更改运行时)。但是,策略模式没有说明如何注入依赖项。

如果存在与“依赖注入”非常相似的模式,则为“抽象工厂方法”模式。该模式可以在策略模式内部使用以注入依赖性。


2
这不能回答问题。请阅读原始问题,而不要回答其他答案:)
Andres F.

-4

答案策略是100%正确的。我投票赞成,但可以发表评论。

“策略使算法独立于使用它的客户端而有所不同。[1]策略是Gamma等人的有影响力的书《设计模式》中包含的模式之一,该书普及了使用模式来描述软件设计的概念。”

设计模式不取决于其用途。依赖注入是通过使用策略模式实现的。如果我们根据用例命名每个模式,则必须重命名许多模式。

存储库模式不是新模式,而是模板模式。

“在这种设计模式的模板方法中,子类可以覆盖一个或多个算法步骤,以允许不同的行为,同时确保仍然遵循总体算法。”

模式通常是组合并命名的多个模式,例如MVC模式。

GOF没有使用的Pure Abstract类的接口,还利用了C ++从多个类继承的功能。


1
模式的目的在区分中绝对重要。在GoF模式中,Adapter和Proxy是很好的例子-它们具有相同的形式,但用途不同。我也不同意您的说法,即使用策略来实施DI。策略的目的和使用配置对象的方式更加具体,因此可以说策略是使用DI实现的。
Jules
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.