2009-10-10 63 views
5

编程非DI系统时隐藏在我身边的一个隐喻是“一个玩他/她的玩具的人”。一个人是一个物体,而这个人的玩具是该物体创造,存储,初始化和操纵的任何东西。玩具可以在达到特定状态时发送事件,但他们对使用它的人一无所知;它们只是带有构成其接口的控制开关的小黑盒子。该人可以收听玩具发出的事件,并通过操纵他们的界面进行回应。这个人可以用他/她的玩具做他/她想做的任何事情,但他/她可能不应该干涉他们的内脏,因为他们可能会破坏他们。什么是依赖注入的好隐喻?

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

WTF ??这听起来很可怕!
他们一直用来思考DI系统如何工作的良好心理隐喻是什么?

回答

3

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

metaphor of the dependency injection principle

+0

链接是否被破坏? – 2013-05-07 05:08:29

+1

@DavidAndreoletti谢谢你的领导。我再次找到它并上传了一份到SO而不是简单的链接。 – Finglas 2013-05-07 08:18:42

1

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

2

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

10

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

或者如果你想让它更接近你的隐喻,你的班级就是孩子,DI框架是妈妈,玩具是其他组件。孩子不关心玩具从哪里来,只要她可以按照自己想要的方式玩耍。

0

这一切都是关于武士和武器。试试看看ninject:http://ninject.org/。去一个有趣的比喻去“访问道场”角色。不知道这是不是你的意思,但它是有创意的。

2

乐高积木。

将乐高积木想象成暴露一个或多个接口(顶部的小颠簸)并具有一个或多个设置者或构造函数参数(底部的孔)的软件组件。

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

我知道...这打破了一点,因为积木很大程度上有一个统一的接口 - 但它为我的作品:-)

2

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

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

1

我被告知的一个DI隐喻是与CD播放器相关联的。玩家不关心你放入了什么CD;不过,每个注入播放器的CD根据播放器对其的要求提供不同的功能。