2005年一月月 发布的文章

关注,AOP

AOP的核心概念是关注点,我开始关注AOP。

一、Why AOP?
a) AOP一般观点
一般在开发系统时,我们可以大致的把系统的需求分类为核心模块级需求和系统级需求。很多系统级需求一般来说是相互独立的,但它们一般都会横切许多核心级模块。以一个电信领域的短信网关系统为例,系统的核心级需求是短信的收发,话单处理等,而其系统级的需求包括日志,校验以及性能问题等。像日志这种系统级的需求就横切短信收发、话单处理等几乎所有网关核心级需求。虽然横切需求会跨越多个模块,但目前的技术倾向于使用一维的方法学来处理这种横切需求,把对应需求的实现强行限制在一维的空间里。这个一维空间就是核心模块级实现,其他横切需求的实现被嵌入在这个占统治地位的空间,换句话说,需求空间是一个n维空间,而实现空间是一维空间,这种不匹配导致了糟糕的需求到实现的映射。

b) AOP开发过程
AOP(面向方面的编程方式)将上面所述的横切需求和核心需求都通通称为关注点(concerns)。AOP认为每一个复杂的系统都可以看作是由多个关注点来组合实现的。在这样的情况下,利用AOP开发系统的过程就变成了“识别关注点”(方面分解)—〉“实现关注点”—〉“组装关注点”(方面的重组,又叫织入)。

二、AOP和OOP
a)  AOP作为OOP的补充,它提供了另外一种考量程序结构(program structure)的方式。OO将系统分解成一系列具有继承体系关系的objects;而AOP则将系统分解为aspects or concerns。而且AOP可更好地将一些横切concerns模块化,便于复用和维护。

b)  AOP,从其本质上讲,使你可以用一种松散耦合的方式来实现独立的关注点,然后,组合这些松散耦合的、模块化实现的横切关注点来搭建系统。与之对照,用OOP建立的系统则是用松散耦合的模块化实现的一般关注点来实现的。在AOP中,这些良好模块化的横切关注点的实现单元叫方面(aspect),而在OOP中,这些一般关注点的实现单元叫做类(class)。

c)  在AOP里,每个关注点的实现并不知道是否有其它关注点关注它,这是AOP和OOP的主要区别,在AOP里,组合的流向是从横切关注点到核心关注点,而OOP则恰恰相反。

d)  感觉AOP是在OOP后对那些objects重新分类的过程,将被广泛关注的objects(即横切于多个objects中的objects)提取出来,加工后再重新和原来核心objects组合起来。

三、AOP基本概念

下面是一些AOP基本概念的解释,摘录自AspectJ的FAQ和Spring AOP的Online book:
a)  Aspect(方面): A modularization of a concern for which the implementation might otherwise cut across multiple objects。

b)  Joinpoint(连接点): Join points are well-defined points in the execution of a program. Not every execution point is a join point: only those points that can be used in a disciplined and principled manner are。

c)  Advice(通知): Advice is code that executes at each join point picked out by a pointcut There are three kinds of advice: before advice, around advice and after advice. As their names suggest, before advice runs before the join point executes; around advice executes before and after the join point; and after advice executes after the join point. The power of advice comes from the advice being able to access values in the execution context of a pointcut.

d)  Pointcut(横切点): A set of joinpoints specifying when an advice should fire. An AOP framework must allow developers to specify pointcuts: for example, using regular expressions.  A pointcut picks out join points . These join points are described by the pointcut declaration. Pointcuts can be defined in classes or in aspects, and can be named or be anonymous.

e)  Weaving(织入):将Aspects组装成为最终系统。这个织入过程可以在编译期完成,也可以在运行时完成。

我想我们可以如下图理解AOP:
|———————————–|
|        pointcut         |
|    |————————|   |
|    |    advice1      |   |
|    |    |————–|  |   |
|    |    | jointpoint1|  |   |
|    |    |————–|  |   |
|    |                |   |
|    |————————|   |
|                        |
|    |————————|   |
|    |    advice2      |   |
|    |    |————–|  |   |
|    |    | jointpoint2|  |   |
|    |    |————–|  |   |
|    |                |   |
|    |————————|   |
|    …….                |
|————————————|

Boost_1_32_0版源代码编译

著名的C++准标准库boost在2004年末发布了1.32.0版本,作为C++的忠实Fans怎能“袖手旁观”,趁闲暇时download it and build it。[注]:由于没有公司Unix服务器的管理员权限,所以只能在自己的Windows平台上编译了。

1、前提
a) 下载Boost_1_32_0源码包(http://sourceforge.net/project/showfiles.php?group_id=7586 ),由于在Windows平台下编译,我们可以选择下载boost_1_32_0.exe文件;
b) 安装Windows下的GCC版本(这里我们使用开源的GCC作为编译工具,因为其Free),我选择了MinGW-3.2.0-rc-3(http://sourceforge.net/forum/forum.php?forum_id=438862 );
c) 下载Boost专用build工具bjam,在Windows平台下我们可以得到已经编译好的bjam.exe(http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941 ),你可以  下载boost-jam-3.1.10-1-ntx86.zip文件。

2、目录结构
a) 运行下载后的boost_1_32_0.exe文件,选择解压缩到的目录即可。如D:\boost_1_32_0;
b) 将下载的bjam.exe拷贝到上述目录中。

3、设置环境变量
a) 由于默认情况下,MinGW会安装在C:\MinGW下,一旦你选择其他目录,你就需要自己设置Path。将%Your_MinGW_Install_Path%\bin加入到你的系统Path变量中。

4、Build
在命令行下进入到boost源码包存放的目录,如D:\boost_1_32_0,然后运行:
bjam “-sTOOLS=gcc” install

编译由此开始,如果你的系统没有装Python相关的东东,在编译的最开始会提示你一些warnings,无须理它,让它继续吧!默认的boost安装路径为C:\boost,我们这里采用默认路径。

5、Build结果
编译的过程是漫长的(一般配置的机器2小时左右),需要你耐心的等待。
编译后结果:在C:\Boost下生成两个文件夹include和lib,在D:\ boost_1_32_0中则多了一个bin目录。

6、应用boost
a) 设置boost库
如果你使用的IDE(比如Microsoft Visual Studio或者MinGW Developer Studio(http://petra.hos.u-szeged.hu/~aking/www.parinya.ca/download/MinGWStudioFullSetupPlus-2.05.exe )),你可以在IDE的include和lib路径中直接设置boost库的位置。如果你用的是命令行工具,对于复杂的项目构建估计你需要写你自己的Makefile了。
b) 使用boost的例子
//HelloBoost.cpp
#include
#include
#include
using namespace std;
using namespace boost;

int main()
{   
    string s = "Hello Boost,This is a test";
    tokenizer tok(s);
    for(tokenizer::iterator beg=tok.begin(); beg != tok.end(); ++beg)
    {
        cout << *beg << "\n";
    }
}
//Compile: g++ -o HelloBoost.exe HelloBoost.cpp -I"C:\Boost\include\boost-1_32"

//output:
Hello
Boost
This
is
a
test

现在你可以尽情去研究boost,体会它的无比强大了。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats