什么是依赖注入的一个很好的比喻?

时间:2009-10-10 17:47:47

标签: oop dependency-injection ooad

在编写非DI系统时,一个坚持我的比喻是“一个人玩他/她的玩具”。作为对象的人和人的玩具是对象创建,存储,初始化和操作的任何东西。玩具可以在达到特定状态时发送事件,但他们对使用它们的人一无所知;它们只是带有控制开关的黑色小盒子,构成了它们的接口。该人可以从玩具中听取事件并通过操纵他们的界面进行响应。这个人可以用他/她的玩具做任何他/她想做的事情,但是他/她可能不应该干涉他们的内脏,因为他们可能会破坏。

DI对我的比喻造成的破坏是它将玩具变成有意识的生物,知道它们的主人,使用它们的人。玩具可以操纵这个人,但是这个人对他们的工作方式一无所知,甚至不关心。这个人只拥有玩具,并期望玩具操纵他/她自己满意的玩具。

WTF ??听起来很糟糕!!
他们一直在使用什么样的心理隐喻来思考DI系统是如何工作的?

8 个答案:

答案 0 :(得分:10)

想一个绅士和他的管家。管家(DI框架)向绅士提供他需要的任何服务(外部依赖)(以及一些,如早晨咖啡,“初始化”:-));绅士(你的班级)只是消费服务而不关心他们来自哪里,只要他们符合他的要求(实施某些界面)。

或者如果你想让它更贴近你的比喻,你的班级就是孩子,DI框架是妈妈,玩具是其他组成部分。孩子不关心玩具的来源,只要她能按照自己想要的方式玩耍。

答案 1 :(得分:3)

SOLID motivational images是一个很好的来源。

metaphor of the dependency injection principle

答案 2 :(得分:2)

从我的角度来看,DI和非DI之间的区别在于你的隐喻是非DI系统,每个人都制作自己的玩具 - 他们必须知道如何制作它们,他们只能使用他们的玩具使。使用DI,该人使用他们给予的玩具。他们不知道如何制作它们,但只要知道玩具的行为,他们就可以玩任何玩具。

答案 3 :(得分:2)

积木。

将乐高积木视为一个暴露一个或多个界面(顶部的小凹凸)的软件组件,并且有一个或多个setter或构造函数参数(底部的洞)。

当您购买一盒乐高积木时,这些积木不会预组装(硬连线)。它们是独立的组件。然后通过将接口(凸块)连接到设置器/构造器(孔)来组装它们(连接它们)。每个块直接对其他块一无所知。除了块之外还需要一些东西来组装它们 - 即你(或main()或Spring配置文件等)。

我知道......这有点分解,因为乐高积木主要有一个统一的界面 - 但它对我有用: - )

答案 4 :(得分:2)

我使用计算机系统。你有一个系统块,你(一个DI)连接一个显示器,一个键盘和一个鼠标。系统块只知道监视器是DVI设备,但不关心它是哪个监视器。它知道如何使用USB鼠标,但不知道或关心它是光学还是滚球鼠标。

你 - DI框架。
系统块 - 正在服务的系统 监视器/鼠标/键盘 - DI(您)提供给系统块的服务。

答案 5 :(得分:1)

玩具没有意识。他们只是让这个人将一些字符串绑在钩子上,当某些事情发生时,钩子会转动,字符串会被拉上,所以这个人知道发生了什么。

答案 6 :(得分:1)

我被告知的一个DI比喻是将它与CD播放器相关联。玩家不在乎你放入什么CD;但是,您注入播放器的每张CD都会根据播放器的要求提供不同的功能。

答案 7 :(得分:0)

所有关于武士和武器。尝试查看ninject:http://ninject.org/。转到“访问道场”角色,获取一个有趣的比喻。不确定这是不是你的意思,但它仍然具有创造性。