AOP基础

      一篇不错的有关AOP概念的文章[1].

      在典型的OO设计中, 如果一段概念需要在很多地方被反复执行, 我们一般是把这段概念抽象成方法或者类, 然后在需要的地方依次嵌入方法(类)调用. 这样有2方面的缺点: 代码重复(调用处)和附加依赖(需求方法内部嵌套了额外的方法, 有关这类问题参考'修改代码的艺术').

      AOP作为OO思想的延伸, 可以解决上面出现的问题. AOP最大的好处之一就是将核心面与附加面解耦. 比如之前我们编写了某按钮的响应事件, 并生成了组件. 之后需求变化, 要求我们在执行正式方法前必须进行验证, 典型的做法就是开打源代码, 将验证方法嵌入正式方法前, 并重组组件, 但这是在拥有源代码的前提下, 并且如果之后需求又变更, 我们仍需要重复以上步骤. 当然, 这样做也是有优点的, 比如完全的封装. 应用AOP, 我们可以保持原组件不更改, 在更高的层次拦截方法调用, 并嵌入有关功能.

      从面向过程到面向对象, 之后再到面向方面, 软件功能的实现更形象化于一砖一瓦的堆砌大厦.

      当然, AOP既不作为新语言, 又不作为新工具, 而仅作为OO的延伸, 一种新的概念, 在现今语言, IDE完全支持OO的情况下, 任何AOP实现OO都可以做到. 当年OO成功抢走PO(Procedure-Oriented)的大量饭碗, 也正是由于C++, 一门完全支持OO的新语言的出现.

      但是,

      记得很久前我和朋友讨论过C++和JAVA在有关设计模式等方面的支持上的问题, C++相对JAVA实现, 不免有些粗鲁. 一个不太恰当的例子, 在需要拦截方法处理上, JAVA比较倾向于实现Decorator模式, 虽然C++也可以这么实现, 但比较传统的做法是'钩子'拦截, 这需要比较底层的知识, 明显缺少合适的抽象. AOP现今的一种解决之道也是某种较高层次抽象的'拦截'.

      Castle中的DynamicProxy把底层拦截工作都做好了, 我们需要做的工作仅仅只是OO中的重载.

 

      另, [2]中通过作者对AOP的理解, 传达了其对于软件开发的领悟.

-----------------------------------------------------------

Ref:

[1], 什么是AOP, zhugenqiang, http://www.cnblogs.com/zhugenqiang/archive/2008/07/27/1252761.html

[2], AOP(Aspect-Oriented Programming)重要吗, akeen, http://blog.csdn.net/akeen/archive/2006/06/10/786359.aspx

posted @ 2009-06-26 13:24  Tyrael  阅读(410)  评论(0编辑  收藏  举报