
1704
Journal of Software 软件学报 Vol.31, No.6, June 2020
设计模式通过标识对象、对象间的合作及责任分配来揭示设计机理,表明基于某种经验的、在特定的上下
文中解决一个普遍设计问题的可复用体系结构
[1,2]
.设计模式已经被广泛地应用在各种软件和工具库的设计与
实现中.设计模式检测旨在从现有的软件设计文档或源代码当中识别所使用的设计模式实例,它不仅对于帮助
维护人员理解软件系统的设计动机和原理、恢复软件设计和改善软件的可维护性具有重要意义,而且有助于软
件体系结构的恢复和发现,同时也是评估软件质量的一个重要依据.
由于设计模式的应用大多是基于意图的,并未严格限制模式的具体实现,加之不同开发者对于设计模式的
理解不一,这使得模式的实现千变万化.目前,设计模式检测主要存在以下问题:(1) 变体的检测效果不理想;
(2) 结构相同意图不同的模式难以区分;(3) 行为型设计模式的检测复杂;(4) 组合爆炸问题依然突出.正是因为
这些问题的存在,设计模式检测仍然是软件工程领域的一个重要的研究内容.
机器学习是人工智能领域的重要分支,它是使用经验来提高计算性能或做出准确预测的计算方法
[3]
.机器
学习技术适用于设计模式检测的原因如下:首先,设计模式检测活动本身就是对众多候选模式实例进行预测的
过程,这符合机器学习的应用背景;其次,设计模式变体的检测与机器学习无需硬编码的特点相适应;最后,机器
学习对语义信息的描述,有助于区分结构相同而意图不同的模式.
对于行为型设计模式的检测,目前主要的方法是借助于动态分析
[4−6]
,但是动态分析一般要求目标项目完
整可运行,这在实际中有时候是不可行的;另外,监控候选模式实例的运行需要生成相应的测试用例,如果手工
生成,必然费时费力,如果自动生成,又难以做到有效的路径覆盖.如果能够充分利用静态代码分析技术,将对模
式的检测研究深入到方法内部,并尝试用机器学习的方式去刻画模式的行为特征,就可以较大程度地降低行为
型设计模式检测的难度.
本文提出一种新的设计模式检测方法,结合面向对象度量和模式微结构(以下简称度量和微结构)并使用典
型的机器学习算法来实现设计模式的检测.针对每种设计模式,本文分别用度量和微结构(micro-structure,简称
MS)训练出一个分类器,然后采用模型堆叠的方式训练出最终的分类器,从而实现对该设计模式的检测.
本文的主要贡献如下:(1) 提出了用多视图(设计模式度量视图和设计模式微结构视图)堆叠泛化的方法来
解决设计模式检测问题;(2) 定义了模式必备微结构来缩减搜索空间,从而避免组合爆炸问题;(3) 对于检测出
的模式实例,除给出角色映射外,还能给出具体的方法映射.最终实验表明,本文提出的方法在变体的识别、行为
型设计模式的检测以及组合爆炸问题的解决等方面均有明显提升.
本文第 1 节介绍本文相关工作.第 2 节定义度量和微结构以及相关的基本概念与原理.第 3 节详细介绍基
于堆叠泛化的设计模式检测方法.第 4 节在 5 种设计模式上进行实验,通过实验数据的对比分析,验证所提方法
的有效性.第 5 节对本文的工作进行总结并对未来工作展望.
1 相关工作
自从 GoF 等人提出软件设计模式概念以来
[1]
,许多学者对设计模式的自动化检测进行了研究,提出了很多
种设计模式检测方法.这些方法在所用技术、分析类型、所面向的源代码或模式的中间表示、是否精确匹配、
是否完全自动化、是否面向特定模式、实验的信息项和指标等方面各不相同.接下来,本文从所用技术方面对
一些具有代表性的方法进行归纳和介绍.
有些设计模式检测方法是基于相似度计算的
[7,8]
.例如,Tsantalis 等人利用图的相似性算法实现了设计模式
的检测
[7]
,该方法不仅能够识别模式变体,而且还能够有效地解决模式检测过程中的组合爆炸问题(利用了设计
模式大都包含继承层次这一事实).简单来说,该方法将设计模式角色之间的各种关系用邻接矩阵来表示,然后
从源码中提取所有的继承层次,接着在模式查找阶段,用继承层次中的类去映射设计模式的各个角色,然后提取
出这些角色类之间的各种关系矩阵,最后利用矩阵之间的相似性算法得到一个最终的相似度,如果相似度超过
了事先选择的阈值,那么就找到了一个设计模式实例.该方法的缺点是对某些行为型设计模式的检测效果不好,
同时空间复杂度也很高.
有些设计模式检测方法是基于图理论的
[9−11]
.例如,Yu 等人从设计模式的子模式出发,将设计模式检测问题
评论