AOP之我见

近来研究AOP,在了解其实现如AspectJSpring等之余,也多了些思索.

早晨一觉醒来,顿觉精神气爽,再看时间还早,也就躺床上闭目养神.而思维此时却象脱缰的野马,纵横驰骋,不知不觉就想到我所从事和钟爱的软件上来.忽发奇想:其实软件的最终目标就是模拟真实世界,甚至进一步说就是创造世界(看过Matrix的朋友应该能理解).所以OOP,AOP或今后将出现的什么新的软件思想也都只是这一进程中的小浪花而已,而他们的出现及发展,也就是为了更好的模拟我们的生活.

       OOP的出现之所以被称为一个很大的突破,正因为它很大程度上符合世界的构成.java “Everything is object”之说,正是有了Object这个有利的武器,使得我们在用OOP表现世界的某些方面时能够得心应手.但我们世界除了Object还有很多其它的东西,比如道德,法律,规范,规律……AOP的出现正是模拟这些方面.

       以我们最熟悉的对象作为考察的对象.人做为对象由多个对象组成,如手,眼……我们作为世界的个体,首先守很多规律的制约.如万有引力定律,牛顿三大定律……这些规律是无处不在的,任何人都无法去避免或改变.还有法律,这是人为拟定的对某些个体具有约束性的规范,如果相应个体违法,则会受到法律的制裁.注意这里是某些个体”,各国的法律只在本国范围内有效,不同的法律又有不同的受众.这样对个体而言,你就受到某些法律的约束.你知道法律可以决定去遵守或违背它,而你不知道,法律也是客观存在,你不去违背,可能根本感受不到它,而在你即使毫不知情的情况下违背时,它也会显示它的威力.至于如道德或规范等,其强制性不如法律,但就与个体的相互关系而言其实与法律完全一样.

       如果从程序的角度来实现上面的相互关系.仅用OOP的思想,就会非常的困难.先说这些定律,他们无时不在,无处不在,只是看什么定律对你当前的行为有影响.如你要上上网,听听歌,可能感受不到万有引力定律和牛顿定律的存在,而你要从12层的楼往下跳试试,万有引力定律和牛顿定律直接决定了你的生死.用程序实现上上网,听听歌或跳跳楼都可做到.你听歌可以计算对耳膜的震动量,音乐对你神经的刺激量;上网可以计算你颈部僵硬时间的长短,计算你网上泡mm的兴奋度;跳楼则根据万有引力定律计算你坠地时的速度和对身体触地部位的冲量.在这些行为中,人是同一个人,也就是同一个对象,只是行为不同,也就是方法不同.那执行不同的方法时要遵循不同的定律.如果用OO的思想我们把定律抽象为对象,则定律起作用就是定律对象的方法被调用.同一个对象,在调用不同的方法时,要明确什么定律起主要作用,就必须要把相应定律接口申明到自己方法体中去.这样就形成了耦合!当然使用Design Pattern能将这种耦合变成松耦合,如使用Observer模式,但即使这样也会有很多的问题:如果同时多个定律起作用,或定律起作用有先后顺序,或这些定律没法形成一个统一的父类接口……还有observer模式其实也是主动的模式,它依赖于对象要主动notify这些observer.

更有意思的是,如果一只鸡或一只鸭从楼上掉下去,它也要遵守万有引力定律和牛顿定律,而且计算方式与人完全一样.如果用OOP的思想,一是使用继承,定义一个父类,由它实现高处落下时的逻辑,这样子类就可以自动获得这些逻辑,但这样势必将因为影响行为的定律的复杂性,而带来类层次的复杂性;二是使用代理,东西由高处落下就交给一个delegate对象去处理,而这样需要多少种delegate对象,每用一个delegate对象,就意味着当前对象耦合了一个delegate对象,结果对象的耦合性越来越强.

那么换个角度想,如果真有一个上帝,它监控着所有的对象,只要某一个对象从高处落下,它就把万有引力定律和牛顿定律用到这个对象身上,而不管这个对象是否知道这两个定律.这样对象与这两个定律完全解耦合,它只管做自己的事,比如一个人从窗台跳下去, 万有引力定律和牛顿定律也起作用,但他没有什么损伤,接着就骑辆车上街去了……上街是这个人的主要目的,跳窗台也许是为图一时方便,下次他也许就不跳了.但只要他跳了,就得由上帝用万有引力定律和牛顿定律计算一下,如果窗台很高,计算结果或许就是他骨折了,只能躺医院去.这个上帝就是自然规律.我们可能感觉不到它的存在,但它确实在那里,只要条件被触发,它就会起作用,不依赖于任何个体.

AOP正是这个上帝在程序世界的体现.一个Aspect就是一条定律或规范及其执行策略.对普适定律而言,他对所有系统中的对象起作用.而一些法律,比如未成年人法就只对未成年人起作用,一些规定比如车辆经过收费站要收费,却对公车无效.一个Aspectpointcut就类似这些定律或法律或规定起作用的条件,它能确定对象的范围,对象的行为,并将一些特权阶级,特权行为剔除出去.advice就是他们的执行了.
    对AOP的具体语法,我不想涉及,大家很容易找到资料.我希望的是能有很多的人谈谈自己对AOP的认识,我的观点也许也很片面,希望通过讨论更加的完善.

posted on 2005-08-10 13:59 pesome 阅读(2223) 评论(10)  编辑  收藏 所属分类: AOP

评论

# re: AOP之我见 2005-08-12 01:12 I love java!

哈哈,有意思  回复  更多评论   

# re: AOP之我见 2005-08-12 12:30 haozidong

虽然说得有些多,但很正确的,吼吼  回复  更多评论   

# re: AOP之我见 2005-09-05 23:02 airlink

纠正一下。。 赫赫,万有引力不是被触发的,它总是在那儿的。。。  回复  更多评论   

# re: AOP之我见 2005-09-06 09:16 pesome

呵呵,谢谢阅读。万有引力的确总在这儿,但如果在平地上,重力和地面的弹力抵消,可以看作不起作用。而在空中就只有重力其作用,所以可以看作触发了,呵呵!  回复  更多评论   

# re: AOP之我见 2005-10-03 16:02 greenwater

呵呵,再接再厉!  回复  更多评论   

# re: AOP之我见 2005-10-19 22:02 joovle

不错阿,支持原创。  回复  更多评论   

# re: AOP之我见 2006-01-30 20:11 ihybily

有意思 我也刚刚开始看AOP 加油加油
  回复  更多评论   

# re: AOP之我见 2006-04-15 12:13 一木

恩,说的很有趣!  回复  更多评论   

# re: AOP之我见 2006-12-14 11:49 hellostone

很好很好。我不懂AOP的,如果你说的事正确的。那真是有意思啊。谢谢啦  回复  更多评论   

# re: AOP之我见 2007-02-28 11:13 acer2006@hotmail.com

有好多人说OOP跟AOP一点关系都没有,而你却说关系很大,可能个人站的立场不同.
我认为了面向对象OOP是个通过继承的多条竖线的话,那么AOP其实就是一条横穿这些竖线的一条直线,或者说条直线有交叉的,也有不交叉的.随便说着玩的,呵呵!  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
相关文章:
 
<2005年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

公告

主要记录作者在学习java中的每一步足迹。除非特别说明,所有文章均为本blog作者原创,如需转载请注明出处和原作者,如用于商业目的,需跟作者本人联系。
欢迎大家访问:

常用链接

留言簿(16)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

java技术

人间百态

朋友们的blog

搜索

最新评论

阅读排行榜

评论排行榜