本帖最后由 Jmhh247 于 2017-5-19 16:58 编辑
作者:在好
链接:
https://www.zhihu.com/question/20925030/answer/102239120
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入
•面向接口编程
那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力。然而,你一定曾为这些“高深术语”感到过困扰。也许时至今日,你仍对它们一知半解。不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心。
5.jpg (16.1 KB, 下载次数: 0)
下载附件
2017-5-19 16:40 上传
比如OMCS网络语音视频框架,它实现了多媒体设备(麦克风、摄像头、桌面、电子白板)的采集、编码、网络传送、解码、播放(或显示)等相关的一整套流程,可以快速地开发出视频聊天系统、视频会议系统、远程医疗系统、远程教育系统、网络监控系统等等基于网络多媒体的应用系统。然而,OMCS直接支持的是通用的语音视频设备,而在某些系统中,需要使用网络摄像头或者特殊的视频采集卡作为视频源,或者其它的声音采集设备作为音频源,OMCS则提供了扩展接口——用户自己实现这个扩展的接口,然后以“依赖注入”的方式将对象实例注入到OMCS中,从而完成对音、视频设备的扩展。
“依赖注入”常常用于扩展,尤其是在开发框架的设计中。从某种意义上来说,任何开发框架,天生都是不完整的应用程序。因此,一个优秀的开发框架,不仅要让开发者能够重用这些久经考验的的卓越的解决方案,也要让开发者能够向框架中插入自定义的业务逻辑,从而灵活自由地适应特定的业务场景的需要——也就是说要具备良好的可扩展性。比如上面提到的OMCS网络语音视频框架可应用于音、视频聊天系统、视频会议系统、远程医疗系统、远程教育系统、网络监控系统等等基于网络多媒体的应用系统;以及ESFramework通信框架能够应用于即时通讯系统,大型多人在线游戏、在线网页游戏、文件传送系统、数据采集系统、分布式OA系统等任何需要分布式通信的软件系统中——这种良好的扩展性都与“依赖注入”的使用密不可分!
•面向接口编程
谈到最后,“面向接口编程”已经是呼之欲出。无论是依赖倒置、控制反转、还是依赖注入,都已经蕴含着“面向接口编程”的思想。面向接口,就意味着面向抽象。作为哲学范畴而言,规定性少称为抽象,规定性多称为具体。而接口,就是程序中的一种典型的“抽象”的形式。面向抽象,就意味着面向事物的本质规定性,摆脱感性杂多的牵绊,从而把握住“必然”——而这本身就意味着自由,因为自由就是对必然的认识。
也许以上的这段论述太过“哲学”,但是“一本之理”与“万殊之理”本身就“体用不二”——总结来看,依赖倒置、控制反转、依赖注入都围绕着“解耦和”的问题,而同时自始至终又都是“面向接口编程”的方法——因此,“面向接口编程”天生就是“解耦和”的好办法。由此也印证了从“抽象”到“自由”的这一段范畴的辩证衍化。
“面向对象”与“面向接口”并非两种不同的方法学,“面向接口”其实是“面向对象”的内在要求,是其一部分内涵的集中表述。我们对于理想软件的期待常被概括为“高内聚,低耦合”,这也是整个现代软件开发方法学所追求的目标。面向对象方法学作为现代软件开发方法学的代表,本身就蕴含着“高内聚,低耦合”的思想精髓,从这个意义上来说,“面向对象”这个表述更加侧重于“高内聚”,“面向接口”的表述则更加侧重于“低耦合”——不过是同一事物的不同侧面罢了。
除此之外,我们也能从“面向接口编程”的思想中得到“世俗”的启迪——《论语》里面讲,不患无位,患所以立;不患人之不己知,患其不能也——就是教导我们要面向“我有没有的本事?”、“我有没有能力?”这样的接口,而不是面向“我有没有搞到位子?”、“别人了不了解我?”这样的具体。依我看,这是莫大的教诲! (完)
知道了背景,你就会知道,为什么天才级别的程序员,对这些玩意嗤之以鼻。
背景是什么? 背景是:尽管这个时代越来越自动化了,可是编写代码这玩意,仍然是人工。而且软件越来越大,要好多人一起来编写。
这么多人,就出麻烦了。 从软件危机后,明白要模块化,可是光模块化都不够,当一堆人的程序都写在一起时,会有各式各样的问题产生。
所以就提出面向对象,其目的在于:1. 自己的错误不会影响到别人;2. 任意模块可以自由改写不会影响别人。针对1,2,可以使得软件出错减少,测试减少,容易发现问题。3. 如果代码写得好,松耦合加模块化,那就可以重复利用。
可是为什么到现在,都没有一个非常成功的经典案例呢? 因为这些玩意是违反天道的:
1. 一个集体内,一个人的错误不会影响他人? are you kidding me?
2. 松耨合松耦合松耦合,怎么也得耦合。没有办法不耦合,所以第一条还是实现不了!
3. 好的软件和其他东西一样,最优的一定是充分利用现实场景的优缺点,可是如此紧密利用就不会是松耦合,而是紧耦合。
4. 重复利用? are you kidding me? 如果我针对这一个场景写得代码可以很简洁,如果是考虑到方方面面,那么我花费的力气以及代码量会以几何级数上升的!那还不如针对另外一个场景再写一个呢!当然,最终一定有很多代码可以重复利用,但是如果以重复利用为己任的代码,那精力和效率又TMD会出问题。
所以,到现在,面向对象都是叫得响,实际应用中却免不了束手束脚。
一周热门 更多>