第二阶段第一次作业:理解IOC和DI

第二阶段第一次作业:理解IOC和DI

1. 概念

控制反转:是一种代理思想,把依赖的控制权交托出去。交托给谁?交托给中心化容器。容器里面放什么?各种你需要依赖的实例。反转就是本来你做的事情交托出去了。

依赖注入:上述思想的一种具体实现方式,即中心化容器,把你需要的外部资源交付给你。


讲个故事:很久很久以前(加上这句有点讲故事又不受限制的赶脚),你(A)穿越到一个村子,你需要一把菜刀(A依赖B)。你找上了王铁匠,王铁匠给了你一把菜刀,拿着菜刀你高兴的回家切菜了。你一刀切下去,坏了,刀柄(C)裂了。你气坏了,找上了王铁匠一顿暴打(修复bug),王铁匠告知,刀柄是李木匠提供的(B依赖C)。你又冲到李木匠家把李木匠暴打一顿。好了,气是消了。但回头一寻思,你发觉这样搞有点累,打了王铁匠又打李木匠,子子孙孙无穷尽也。这时候村长(中心化容器)粉墨登场,村长给你一张清单(配置),并告知你,你照着清单填写需求,后面的事你不用管,你要什么我给你什么。后来你照这个法子订制了一把柴刀,村长很快就交付给你了。这下你乐坏了,再也不用担心王铁匠和李木匠之间的破事儿了,甚至连木匠长啥样家住何方你都不用管,要什么给村长吼一嗓子就搞定。舒适的日子没有持续太久,村中恶龙捣乱,你需要一把神兵屠龙刀。但屠龙刀的设计和材料参数太过复杂,村长给的清单一共800多页,你顿时傻眼了。村长可是万中挑一的聪明人,看到你犯难的神色,马上提议:要不我们达成些默认的协议,屠龙刀的花纹颜色这些,大概率你也不太在意,我给你做成缺省值,你只需要给我填写你最关心的数据。那敢情好啊,800多页就浓缩成1页了(约定大于配置)。你突然茅塞顿开,村长所谓大概率,真乃人生哲学。


2. 为什么

那肯定是有好处啊。解耦解耦解耦。什么组件化、什么复用都是为了解耦。这里有个关键,即中心化容器,一个大黑盒,应用很广泛。npm或者maven这类包管理工具,都是这种思想的应用。你要什么包,你跟npm或者maven吼一嗓子,它都给你处理好了,包与包之间的依赖,版本管理,你都可以忽略了,因为它们有配套的中心化仓库和包管理算法。很方便,不是么。而约定大于配置,lin-ui优雅的默认值不也是一种应用吗?


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

写的挺有意思,但是最后这个组件化和服用都是为了解耦,这个不太赞同。为什么这么认为?

  • 银狐Agfox 提问者 #1
    感谢老师的回复,意见有分歧挺好的,才有思想的碰撞。 解耦这个概念,我个人理解有代码本身层面的,也有业务层面的,是代码灵活或者业务灵活的体现。我猜测反转或者说注入,底层是利用java反射机制实现的。这点扩充了强类型语言的灵活性,保证了java也可以有动态语言的特性。这也是灵活的一种,灵活就可以写出简洁的代码,而不笨重。大道至简,在广义上,我也归于解耦了。 我刚入行时的大师父曾跟我说,要关注变化的地方,凡变化都是变量,优化重构到最后都可归于配置。我想,配置就是他对代码优化到极致的终点。而在此之前,我写代码更喜欢性能优先,能用一个循环遍历的绝不想重复第二遍。老师提出代码自解释性和可维护性,又开启了我更深入的理解。听您的课,很喜欢在你讲思想思路的地方停顿,有共鸣的,相互印证的,也有可辩论的。
    2019-12-27 09:44:11
  • 银狐Agfox 提问者 #2
    补充一点:这里的解耦,有一层对外部资源的依赖并不用关心外部资源其内部的变化的意思,依赖资源的内部变化,并不导致宿主对象的变化
    2019-12-27 11:26:23
  • 7七月 回复 提问者 银狐Agfox #3
    组件化的主要目的就是复用,这个不要想复杂了
    2019-12-29 09:59:18
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师