用自然语言讲清控制反转(IoC)和依赖注入(DI)

目的

控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),是软件设计中的一种思想,并非特指具体的技术。那么既然只是思想,那么就可以不通过编程语言仍然可以将清楚。

那么,本文将使用日常的自然语言,讲清IoC/DI。

例子

通过具体的例子是讲解思想的最好方法,所以我们就先通过具体的例子来进行下面的讲述。

第一步

现下接近过年,很多公司都会组织年会,所以XX公司的老板让小明负责来组织【XX公司2018年新春年会】。这是我们这个例子的总体背景。

小明没有办法,只能应允,不过随后向老板反映说:“我自己一个人忙不过来,您得找个帮我才行。”

老板觉得有道理,想了一下说:“好,那我去找小刚说一下,你明天找他就可以了。”


到此,逻辑基本成型:老板让小明组织年会,并告诉他让小刚协助他。
那么我们得出的结论是小明此时是依赖小刚的,因为老板直接告诉他让小刚协助他。

如果一切正常当然没问题,但如果出现变数,那么问题就来了!

问题

老板找到小刚,告诉他协助小明去组织年会,但是小刚说他手上有个非常紧急的事情,最近抽不出时间。 /(ㄒoㄒ)/~~

老板看了下确实如此,那没办法,只能另外找人代替;而且需要告诉小明帮助他的人变了,这只是因为刚刚老板直接告诉小明让小刚来帮他。

第二步

究竟让谁来帮小明组织年会,老板现在在心里有几个人选,但是否可以他还不确定。

有了前面的教训,老板就没有直接说人名,而是对小明说:“我另外安排个人来协助你,会让他明天来找你的。”


现在和第一步的区别是什么呢?是老板并没有明确说让谁来协助小明,而是给了一个笼统的概念——有个人,而这个人的属性是“协助组织年会”。

这样的话小明就不依赖具体的人,而只是依赖[协助组织年会]的人。如果说第二天让小红来协助小明组织晚会,那么小红也是依赖[协助组织年会]的人。

上面这样从第一步“小明直接依赖小刚”到第二步“小明依赖[协助组织年会]的人,小红也依赖[协助组织年会]的人”的过程,就是我们常说的“依赖倒置”原则。


除了上面这一点,还有另外一处区别,那就是:第一步里老板是让小明去找小刚,而第二步里老板是让[协助组织年会]的人来找小明。

因为现在小明依赖的只是[协助组织年会]的人,至于具体是谁他并不知道,是由老板去安排的,所以让小明主动去找协助者并不科学,而老板正是让[协助组织年会]的人明天来找小明,这样小明只要等着就可以了。

这个逻辑思想就是叫做控制反转,也就是说本来和谁来一起组织年会,具体的控制权是在小明手里的;而现在控制权跑到了老板的手里,控制权颠倒了一下,所以名字才叫“控制反转”,也就是IoC。

看到这里,是不是觉得老板和封建社会里大权在握的皇帝差不多呢^_^

第三步

第二天小红来找小明,说她是来帮他组织年会的,于是两个人开始了工作,在年会组织过程中需要协调各方面的资源,比如就餐、节目、后勤等等,需要其他的人员配合时,他们都是找老板来协调,由老板来安排。


目前看来进展良好,小明不用管具体的哪项事情由谁来做,只是依赖虚拟的[安排晚餐的人]、[表演节目的人]、[后勤保障的人],至于具体的是谁来做就由老板来安排。

但是这样也会出现问题。

问题

所有的人员安排都由老板拍板,随着事情越来越多,老板也扛不住了。


这个问题也很现实,一场完整的年会,前前后后可能需要几十个人协作,所有人有事情了都找老板,肯定忙不过来。

但是这能怎么办呢?我们上面说了因为现在是“控制反转”状态,所有的人员安排都在老板的手中,其他人不会自己找具体的人。

第四步

最后老板决定使用大招——编制了一个《年会组织工作人员列表》。
1.里面列举了常见的工作种类,比如场地安排,会场布置,会场清理,晚会导演,晚会摄影等等工作;
2.然后让负责具体工作的人把自己的名字填在里面,比如张三负责会场布置,李四负责晚会导演,王五负责晚会摄影;
3.如果人员有变化,就到老板这里修改这个列表;如果有其他的工作新增,就在列表里新增一项,然后把具体的人员名字填上去;
4.其他人员需要让某一人员帮忙时,只需要到这个列表里查找具体的执行人员就可以。


在这一步里面,所有的工作人员依然是满足“依赖倒置”原则的,比如张三依赖的是[会场布置],李四依赖的是[晚会导演],王五依赖的是[晚会摄影];李四如果需要一个人帮忙摄影,那李四也依赖[晚会摄影]。
而且,这一步里面,依然是处于“控制反转”状态的,比如李四现在导演晚会,他需要摄影师来录像,这时候具体是谁来录像他控制不了,仍然是由(《年会组织工作人员列表》和老板)这个整体来控制的。

如果“依赖倒置”和“控制反转”这两项都没有变化,那是什么东西变了呢?

其实区别在于,第三步时,老板是直接去安排具体的人去干具体的事情,所以他需要记住哪些人干哪些事情,也就是说老板直接依赖了张三、李四、王五这些具体的人;而第四步时,老板就不用去记具体的名字,而是让他们到列表里报名,那么老板就没有依赖具体的张三、李四、王五。

这就是说我们把[会场布置]、[晚会导演]、[晚会摄影]这些依赖以及他们具体的执行者,全部注入到《年会组织工作人员列表》里面,其他人只要查询列表就可以了,老板只是提供了这样一个规则,他和具体的人员安排就解脱了。

上面这个过程就是“依赖注入”。

总结

上面的例子就是将依赖倒置–控制反转–依赖注入层层递进地讲述了一遍,其中的关键就是依赖关系的拆分和转移。
依赖倒置前只有小明依赖小刚这一条依赖关系,依赖倒置后成了小明依赖[协助组织年会]的人、小红也依赖[协助组织年会]的人这样两条依赖关系。
控制反转前小明是直接去找小刚,控制反转后,小明依赖[协助组织年会]的人这条依赖关系就交给老板来完成。

依赖注入前老板持有控制权,他依赖王五,也依赖[晚会摄影],依赖注入后老板只是制定规则,他不依赖王五,也不依赖[晚会摄影]了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值