论文部分内容阅读
面向对象技术在模块化一般的应用逻辑上做得很好,但无法封装象日志,安全,内存管理,异常处理等这样的系统级的关注点。这些关注点经常横切系统的核心应用逻辑(core logic),形成了常见的“代码交织”(code tangling)和“代码散布”(code scattering)现象,使得已存在的遗产代码难于维护,难于理解。模块化是降低软件复杂性的手段之一。面向方面的编程技术解决了横切关注点的模块化问题,它提供了一个叫做方面(aspect)的程序结构,将横切关注点封装在一个独立的模块里。面向方面的编程技术仅仅提供了横切关注点的封装机制,不涉及关注点的识别。近年来,如何从系统中识别横切关注点成为人们研究的热点。目前,已经存在一些关注点识别技术。有基于字符的分析技术、基于类型的分析技术、基于签名的分析技术以及动态分析技术等,每种技术都是依据关注点在系统中的某种表现特征来识别的。没有一种方法能够识别得很准确,因此可以组合使用多种方法。本文认为横切关注点在系统不同的地方具有相似甚至是相同的代码,在多个横切处体现出类似的行为,并根据这一特征在系统中搜索横切关注点。首先在分析源码的时候,我们假定程序语句仅仅有函数调用一种形式,并针对整个源码系统创建了我们定义的函数调用树。基于函数调用树,查找所有重复出现的函数调用组合,组合方式不仅包括多个函数的顺序调用,也包括使用分支/循环语句所进行的组合。这种方法识别到的关注点仅仅是函数调用级别的,源码中还存在着其他形式的关注点。本文对我们的方法不能识别的几种典型的系统级关注点专门作了分析,有的还给出了特定的识别方法。同其它的关注点识别技术相比,本文的方法在某些方面有优势。Hannemann和Kiczales[12]开发的方面挖掘工具AMT需要用户提供查询关键字,然后做文本匹配,这依赖于源码的编程风格。AMT仅能搜索到跟查<WP=47>询关键字对应的那种关注点的代码,本文的工具不需要用户指定信息,会列出全部可能的关注点。AMT还提供了图形化的交互方式。这个是本文的工具所不具备的,当前,我们仅仅把搜索到的关注点相关的代码写到磁盘文件中,对于用户来说,这是很不方便的。本文的方法同S. Breu 和 J. Krinke使用的动态程序分析技术[18]有一些相同的地方,都针对系统中的函数之间的关系,不考虑系统中的其他类型的语句。不过他们考虑两个函数在运行时的关系,定义了四种类型的关系,从程序的动态执行中观察某个特定关系是否重复出现;而本文的方法则是考虑函数之间的静态组合方式,定义了三种组合方式。针对源码做静态分析,搜索这种组合方式的重复。最后,为了验证本文方法的可行性,我们设计并实现了一个关注点识别工具。针对Java遗产系统进行分析,由于方法本身的因素,要求处理的系统必须是完整的项目。