【问题标题】:What's a good metaphor for Dependency Injection?什么是依赖注入的好比喻?
【发布时间】:2010-12-05 15:17:22
【问题描述】:

在编写非 DI 系统时一直困扰着我的一个比喻是“一个人在玩他/她的玩具”。人是对象,人的玩具是对象创建、存储、初始化和操作的任何东西。玩具可以在达到某种状态时调度事件,但对使用它们的人一无所知;它们只是带有构成其接口的控制开关的小黑匣子。该人可以监听来自玩具的事件并通过操纵它们的界面做出响应。这个人可以用他/她的玩具做任何他/她想做的事,但他/她可能不应该去干涉他们的内脏,因为它们可能会破裂。

DI 对我的比喻造成的破坏在于,它将玩具变成了有意识的存在,知道它们的主人,使用它们的人。玩具可以操纵这个人,但这个人对它们的工作原理一无所知,甚至不在乎。该人只是拥有玩具,并期望玩具操纵他/她以使玩具自己满意。

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

【问题讨论】:

    标签: oop dependency-injection ooad


    【解决方案1】:

    想想绅士和他的管家。管家(DI 框架)根据需要向绅士提供他需要的任何服务(外部依赖项)(还有一些,如早晨的咖啡,在“初始化”时 :-));绅士(你的班级)只是消费服务而不关心它们来自哪里,只要它们满足他的要求(实现某些接口)。

    或者如果你想让它更接近你的隐喻,你的班级是孩子,DI 框架是妈妈,而玩具是其他组件。孩子不在乎玩具是从哪里来的,只要她能随心所欲地玩就行。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • @DavidAndreoletti 感谢您的提醒。我再次找到它并将副本上传到 SO 而不是简单地链接。
      【解决方案3】:

      在我看来,就您的比喻而言,DI 和非 DI 之间的区别在于非 DI 系统,每个人都制作自己的玩具——他们必须知道如何制作玩具,并且只能使用他们自己的玩具制作。使用 DI,这个人使用他们给的玩具。他们不知道如何制作它们,但只要他们知道玩具的行为方式,他们就可以玩任何给他们的玩具。

      【讨论】:

        【解决方案4】:

        乐高积木。

        将乐高积木视为一种软件组件,它公开一个或多个接口(顶部的小凸起)并具有一个或多个设置器或构造函数参数(底部的孔)。

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

        我知道...这有点崩溃,因为乐高积木在很大程度上有一个统一的界面 - 但它对我有用 :-)

        【讨论】:

          【解决方案5】:

          我使用电脑系统。你有一个系统块,你(一个 DI)连接到它一个显示器、一个键盘和一个鼠标。系统块只知道显示器是 DVI 设备,但并不关心它到底是哪台显示器。它知道如何使用 USB 鼠标,但不知道也不关心它是光学鼠标还是滚珠鼠标。

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              有人告诉我的一个 DI 隐喻是将其与 CD 播放器相关联。播放器不在乎你放入了什么CD;但是,您注入播放器的每张 CD 都会根据播放器的需求提供不同的功能。

              【讨论】:

                【解决方案8】:

                这都是关于武士和武器的。尝试检查 ninject:http://ninject.org/。转到“参观道场”角色以获得有趣的隐喻。不确定这是否是您的意思,但它仍然很有创意。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-13
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-06-08
                  相关资源
                  最近更新 更多