近来研究AOP,在了解其实现如AspectJ和Spring等之余,也多了些思索.
早晨一觉醒来,顿觉精神气爽,再看时间还早,也就躺床上闭目养神.而思维此时却象脱缰的野马,纵横驰骋,不知不觉就想到我所从事和钟爱的软件上来.忽发奇想:其实软件的最终目标就是模拟真实世界,甚至进一步说就是创造世界(看过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就是一条定律或规范及其执行策略.对普适定律而言,他对所有系统中的对象起作用.而一些法律,比如未成年人法就只对未成年人起作用,一些规定比如车辆经过收费站要收费,却对公车无效.一个Aspect的pointcut就类似这些定律或法律或规定起作用的条件,它能确定对象的范围,对象的行为,并将一些特权阶级,特权行为剔除出去.而advice就是他们的执行了.
对AOP的具体语法,我不想涉及,大家很容易找到资料.我希望的是能有很多的人谈谈自己对AOP的认识,我的观点也许也很片面,希望通过讨论更加的完善.