15.5 使用AOP编程的风险

    虽然AOP弥补了OOP水平方向进行模块化的不足,避免代码的重复,但是我们对AOP编程一直持谨慎的态度,这是因为。

    一个类如果被多个切面横切,可能会产生叠加效果,有些叠加效果正是你所需要的,但有些意外的叠加效果可能会带来严重的、无法预知的错误。特别是在使用JPM(Joint Point Model)时,由于很容易加入切入点的规则,所以很容易造成意想不到的结果。

    为了避免因叠加效果而产生的无法预料的问题,AspectWerkz 推荐使用正交的连接模型(Orthogonal weaving model),即切面可以以任一顺序组合使用。然而,这往往并不现实,有时候我们希望多个切面之间存在先后顺序,比如,我们总是希望验证用户安全性的增强在其他操作之前执行,而且很多框架都支持顺序执行,例如拦截器框架会按照配置顺序执行拦截器。

    由于增强逻辑可以横切多个模块,这样,很难让各个模块的开发人员都知道我们为某些连接点织入了增强,由此可能造成相关开发人员不知道究竟执行了哪些逻辑代码。

    在使用AOP编程的过程中,应该规范团队开发,对相关代码进行有效地约束和管理,譬如,所有切入点的定义遵从一定的命名规范,或者在指定的目录下,这样方便开发人员查阅代码。并且在开发过程中,可以完善相关文档,对软件中哪些地方使用了AOP技术一目了然。

    不容易测试和调试。如果你选择生成织入增强的源代码,无论使用编译器织入,还是在类加载期织入,这些代码都不易调试,排错困难。