🖥️
Log4think
  • Introduction
  • Archive
  • 2016-12-13 JavaScript 中几种不同的基于 prototype 继承方式的区别
  • 2014-09-02 Facebook的Dalvik运行期补丁
  • 2014-08-19 理解AnguarJS中的模板编译
  • 2014-08-13 在Android中使用OSGi框架(Knopflerfish)
  • 2014-08-13 在Android中使用OSGi框架(Apache Felix)
  • 2014-07-30 3rd-party apt-key list for Ubuntu
  • 2014-07-21 'Failed to clone a large git repository: The remote end hung up unexpectedly'
  • 2014-07-02 genymotion Qt error in Ubuntu
  • 2014-04-30 可自动安装依赖的Ubuntu离线包安装工具 gdebi
  • 2014-04-23 解决搜狗输入法Ubuntu 14.04下黑块状态条
  • 2014-04-08 Setup Ghost blog system on Ubuntu
  • 2014-03-28 Trace a process
  • 2014-03-25 Forecast::IO 599 Internal Exception
  • 2014-03-23 Mac Tips
  • 2014-01-17 LD_LIBRARY_PATH shouldn't contain the current directory
  • 2014-01-10 Python on vim
  • 2013-11-12 ibus-pinyin doesn't work in KUbuntu 13.10
  • 2013-11-11 phpMyAdmin login error to remote server
  • 2013-11-04 Get SNMP(v3) working on Ubuntu 12.04
  • 2013-10-30 Accessing Facebook by LWP
  • 2013-10-17 Log4perl多个Appender重复输出日志的问题解决办法
  • 2013-04-19 How to enable ORMLite internal log on Android
  • 2013-02-20 Bash Shortcuts
  • 2013-02-20 '"adb shell dumpsys" parameter list'
  • 2013-01-27 循环有序数组的二分查找
  • 2013-01-23 为Java运行环境导入根证书解决Eclipse的TFS插件的"PKIX path building failed"错误
  • 2013-01-21 ant 中通过重新定义 project.all.jars.path 在 classpath 中引入外部 jar 文件
  • 2012-09-22 Android的滚动条实现细节
  • 2012-02-05 hostname自动变成bogon的问题
  • 2011-07-09 代码段速记 gist.github.com
  • 2011-07-08 A perl Data.Dumper clone for Python
  • 2011-06-22 魔兽世界私服Trinity,从源码开始
  • 2011-06-13 魔兽世界3.3.5 13930登录数据包分析
  • 2011-06-13 魔兽世界 3.3.5 13930 Trinity 认证补丁
  • 2011-05-20 统一业务模型(UBM) in ERP5
  • 2011-03-08 制作ASCII字符动画
  • 2011-01-14 Ubuntu升级导致的udevd错误修复
  • 2011-01-09 行列有序矩阵求第K个数
  • 2011-01-09 字节按位逆序
  • 2011-01-01 编程之美 1.2 中国相帅问题的一个简洁解法
  • 2010-11-26 为Windows 7/Windows Server 2008添加IPX协议
  • 2010-11-12 How to debug with Android Logging
  • 2010-09-16 利用google-code-prettify做网页内源码的语法高亮
  • 2010-09-05 10 Ways We Hurt Our Romantic Relationships
  • 2010-08-30 利用ipkall+xlite+iptel.org开通google voice
  • 2010-08-27 避免Android开发中的ANR
  • 2010-08-27 在Eclipse中查看Android SDK的源代码
  • 2010-08-18 Git中判断一个commit是否在某个branch中
  • 2010-08-04 修正auto-excerpt产生带格式的摘要
  • 2010-03-31 Go 编程语言入门教程
  • 2010-03-13 利用外部VPS主机通过ssh隧道穿透防火墙连接内网
  • 2009-12-30 旋转矩阵
  • 2009-02-10 为什么cpio要比tar好
  • 2008-12-11 ThoughtWorks 的一道笔试题
  • 2008-11-18 长距离打车如何省钱?
  • 2007-02-08 ftp后台自动上传下载
  • 2006-06-12 vi cheatsheet
  • 2006-04-19 修正mysqlcc在MySQL 5.0上常报的 Table 'xxx' doesn't exist 错误
  • 2006-04-01 'Perl中不寻常的 ?: 运算符'
  • 2005-09-13 关于IoC、低耦合、配置文件及其本质意义的思考
  • 2005-09-13 Perl与数据库DBI快速入门
  • 2005-09-12 Perl无废话入门指南
  • 2005-07-16 Solaris 下安装Perl的DBD-mysql模块失败的原因以及解决办法
  • 2004-10-15 SharpDevelop的AddInTree View 插件
  • 2004-10-14 SharpDevelop源码分析 (完整版)
由 GitBook 提供支持
在本页

这有帮助吗?

2005-09-13 关于IoC、低耦合、配置文件及其本质意义的思考

上一页2006-04-01 'Perl中不寻常的 ?: 运算符'下一页2005-09-13 Perl与数据库DBI快速入门

最后更新于5年前

这有帮助吗?

看了一篇关于IoC的Blog,很是有点感想。

我之前对IoC了解一些但实际大规模应用的机会比较少,感觉它可以通过两种方式来改善耦合度关系:

1,通过"注入"实现功能替换。简单的"注入",可以通过seter或者Constructor来实现。之后可以在运行期的装配阶段把各个注入类和宿主类组合起来。简单"注入"的缺点是,还是要将具体的注入类写死在装配方法中。

2,为了解决简单注入的问题,有人利用反射+配置文件实现了注入,现在只要修改配置文件就可以实现注入类的替换了。

所谓的"注入",可以理解为一个回调的过程:把宿主类中要在运行期决议/替换的功能单独作为一个类来实现,然后把这个类的抽象(抽象类或者接口)作为宿主类的一个接口(通过seter或者constructor来赋值),最后在运行期把一个实现具体功能的实例赋给宿主类。上述的实现,宿主类要显式的标明注入类的接口类型,并且在装配阶段要显式的new出注入类,然后赋给宿主类的对应接口。这种事情,好处自然是有的了,就好像AbstractFactory或者Builder模式:只公开接口,把具体的实现抽离出来,这样可以方便的实现具体实现的替换。可是仔细看一下,这样的实现,耦合度从代码中转移到了装配类中。

而配置文件的方式,把类的装配工作以配置文件的形式实现了,这样不用修改代码、编译就可以实现注入类的替换。这样做的好处更是有的,不管怎么说,能够不修改代码实现功能的替换至少在发布方面是能够带来不错的效果。至于在代码方面能够带来多大程度上的好处,我想可能还是要视环境和应用的场合来定吧。毕竟这样做的复杂程度要比简单实现高很多了。而且这样的实现,事实上是把耦合从装配方法中转移到了配置文件中。

其实在IoC实现中花了很多的力气来做类型的匹配工作......宿主类和注入类的接口对应,这个是强类型语言所不能避免的。既然如此的话,那么无类型的动态语言实现IoC应该是非常的容易并且效果应该是不错的--可是同时负面效果就是运行期才能进行类型的识别和匹配工作容易出错,但目前似乎配置文件的方式也无法避免这个问题。

进一步的,配置文件其实也是可以演变、进化的。首先就是配置文件中的内容是否可以以元数据的形式出现?又或者以一个程序集的形式出现?该程序集其实就是配置文件或者元数据功能上的替代者--虽然修改不方便了,但是同时带来了安全上的保证。可是这样一来,我们又要面对编译的问题。呵呵,两难吧。

当下形形色色的配置文件已经泛滥成灾了,怪不得RoR要火爆起来。其实就配置文件来说,本质上是为了把耦合的位置从不可修改的编译代码中转移到一个可修改的文本文件中,这样就可以在替换部分功能的时候免除掉"编译"这个环节,为的就是这个效果吧(不知道这样说是否正确)。 虽然可以不用修改代码了但还是要修改配置文件,我个人感觉这本人本质上其实还是一回事。话说回来,如果这个趋势发展到极致,我想可能大家可以只用配置文件来写程序了,宿主程序则退化为一个配置文件的解释器--事实上,这个也是可以实现的,Eclipse和SharpDevelop的宿主程序已经是这样的一种东西了。XML的配置文件加一个解释器不就是一个新的语言么?如果不用XML做配置文件,而是用类似脚本的方式来定义配置,那么这个配置文件其实就是一个解释型的语言了。然后,为了提高这种配置方式程序的效率...... 我们兜了一个很大的圈子之后又转回到编译语言上来了。从这个角度上来说,这是一个平衡度的问题。 从更高一点的角度来看,这是一个螺旋式进化、演变、上升的过程。从现实的角度来看,未来二十年应该是解释语言和动态语言的天下。

退后一步来看这一切,我们当初为什么要OO,是为了降低大型软件中面向过程的封装问题导致的复杂性。有了OO之后,发现一切并不是那么的美好,为了降低对象之间的耦合度、增加灵活性,于是有了设计模式。人们应用了设计模式,发现调试不方便了,复杂性又提高了。IoC可以理解为是模式的一种吧,但是换一个角度来看,它不就是一个回调函数的OO方式的实现吗?我们果然是又转回了起点,下一步又要转向哪里呢?

这其实,都是为了解决软件的一种复杂性而导致的另外一种复杂性,所不同的就是人们可以选择自己更能够接收哪种复杂性。

《你真的了解Ioc与AOP吗?》