1.研究内容
本论文研究以下内容:
1. 软件设计方法学的历史。
2. AOP的出现。
3. AOP的应用范围。
4. 各大厂商对AOP的支持。
5. AOP在dotNET下的实现。
2.研究意义及国内外研究现状
面向对象技术(OOP)很好的解决了软件系统中角色划分的问题。借助于面向对象的分析,设计和实现,可以把现实生活中很多名词物件,如人,苹果,股票等等转换为面向对象系统中的对象,从而可以将现实中的问题转换为软件的功能。
OOP技术发展到今天,即便已经是相当成熟,但还是有部分问题不能解决,或者是说不能“优雅”的解决。
举一个经常遇到且容易理解的例子。绝大部分系统都需要进行日志记录,以跟踪系统运行的状况,日志是开发人员快速查错的手段,也为系统优化等工作提供有力的依据。在面向对象的系统中,常用的做法是用一个类似Logable的接口来标示这个对象是“可被记录日志”的,或者是提供一个超类为所有的子类提供一个日志记录器(Logger)。从实现的角度考虑,系统中若有大量的类需要日志功能,将日志记录器以硬编码的方式穿插在这些类里,一旦需要更改,很可能会有大量的类需要改动,更有甚者,如果日志记录的需求是项目后期提出的,那么满足这个需求将是一场恶梦,同时系统出错的几率也大大增加。从OOP设计的原则来讲,如果一个应用系统是做物品交易的,那么它应该关注的只是它自身的业务―转帐,配货。一堆的系统运行信息,对业务是无益的,但对整个系统,是必要的,把日志记录器生硬的嵌入到业务模型中,也不符合单一职责原则。类似于日志这样散落在系统各处的功能点还有很多,在性能优化,上下文相关信息处理等各个方面都设计到这样的问题,把这种行为归结为“横切关注点(Crosscutting Concern)”,因为它跨越了给定编程模型中的典型职责边界。横切行为的实现是分散的,这种行为难以做逻辑思维,实现和更改。面向方面编程(AOP,Aspect-Oriented Programming)便是为解决这些问题而生的。AOP为开发人员提供一种关注横切点的机制,自动将横切关注点织入(Weave)到面向对象的软件体系结构当中。所以,AOP并不是OOP的替代,而是它的延续和补充。
AOP不仅可以帮助我们解决代码混乱和代码分散所带来的问题,还有以下一些好处:1。模块话横切关注点,AOP用最小的耦合处理每个关注点,使得即使是横切关注点也是模块化的,这样的实现产生的系统,其代码冗余小,模块化的实现还使得系统容易理解和维护;2。系统容易扩展,由于方面模块根本不知道横切关注点,所以很容易通过建立新的方面加入新的功能。另外当系统加入新的模块时,已有的方面自动横切进来,使系统易于扩展;3。设计决定的迟绑定,使用AOP,可以推迟为将来的需要做决定;4。更好的代码重用性,AOP把每个方面实现为独立的模块,模块之间是松耦合的。
在国外,施乐公司帕诺阿尔托研究中心(Xerox PARC)开发了全球第一个AOP开发环境-AspectJ。这个加强版的Java语言提供了一整套语法,能够清晰的的描述横切关注点,并将其织入到Java源代码中。织入后的代码仍然是标准的Java源代码,从而还保证了Java的移植能力。著名的微软公司也无声无息的对AOP进行了大量的研究,并且应用于新的体系结构中。COM+,dotNET中都可以找到AOP的身影。一大批国际著名厂商先后在AOP上投入了大量的研发力量。同时,各种AOP框架也孕育而生,如Aspect#等等。
国内,也有小部分先行者开始AOP研究,并且有一定的成果,如AOP.net等。
但AOP直至如今,也并不成熟,还不是主流的开发技术。需要开发者们投入更多的精力去论证,完善它。AOP未来是美好的,它必将引起SP到OOP之后的另一场大革命。
3.难点,关键问题及研究方法,可行性等。
3.1难点及其关键问题。
AOP是场刚开始不久的革命,所以可参阅的资料非常上,特别是中文资料。
横切代码的织入方式,既是实现AOP思想的关键,也是难点。通常有两种做法:一是静态织入,由预处理器,编译期,编译后的链接器,loader,JIT或者VM来完成;另一种途径是动态织入,也就是使用interceptor在运行时织入。
应该说第一种织入方式的实现难度较大。需要对编译原理及对应平台(通常是虚拟机,最常见的是Java和dotNET)有深入的了解,能熟练应用对应平台上类似于汇编一级的语言。这种织入方式将带来最高的执行效率。动态织入实现的难度相对较小。但需要动态运行环境(Java,dotNET)的支持,运行效率不如静态织入的方式,但其动态部署的能力相当强大,编程更加灵活。
3.2研究方法
首先阅读已有的研究文献,建立对AOP整体上的认识。当有了一个比较清晰的概念,则开始剖析流行的AOP框架,对AOP更进一层的理解。最后尝试使用doNET实现AOP编程。