论文部分内容阅读
设计模式是人们在实践过程中总结出来的成功设计的范例,它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。设计模式的应用使得软件系统的开发效率和软件系统的质量都得到了很大的提升。然而,许多系统的设计文档或者不完整,或者与源代码不完全匹配。对于使用敏捷开发方法构建的软件系统,这个问题更为严重。另一方面,即使系统的设计文档完整可用且与源代码完全匹配,这些文档可能并未详细记录设计模式使用信息。因此,高效、准确地自动识别出系统中包含的设计模式实例,对理解、维护和重构大型软件项目具有重要意义。近年来,国内外的相关文献已经提出很多设计模式自动识别的方法。然而,设计模式的识别是一个比较复杂的问题,这些方法存在以下不足:1)这些文献大多是将模式与整个系统进行匹配,因此识别的准确率和时间性能并不高。其中一些文献尝试在执行搜索算法前减少搜索空间以优化时间性能,但仍然是在整个系统的基础上对搜索空间进行缩小。2)行为型模式的识别是一个颇有挑战性的问题。现有文献有些只针对结构型/创建型模式的识别,并不能检测行为型模式。还有文献试图使用同一个匹配算法搜索结构型/创建型模式和行为型模式,识别的准确率并不高,对于结构特征不够明显或与其他模式具有相似结构的行为型模式更是如此。近年来也有学者首先使用基于结构/对象创建特征的方法得到行为型模式候选实例,然后通过单独匹配行为特征对候选实例进行确认。然而,这些文献大多数都不执行源代码来检测运行期间实际发生的方法调用与行为型模式是否匹配。所以这些文献在分析行为方面是有限且不精确的。3)设计模式识别最重要的过程是将模式的特征与系统的特征进行匹配。近年来,国内外的相关文献已经考虑到各种各样的模式特征,但大多都属于设计模式的结构特征和行为特征。为了增强代码的可读性和可维护性,设计模式往往具有各自的命名特征。目前只有少量文献考虑了设计模式的命名特征。而使用命名特征可以方便准确地对基于其他特征得到的候选实例进行确认。4)在设计模式刚刚提出的时候,有学者尝试通过软件度量来识别设计模式。然而,仅靠几个死板、单一的指标来判定系统是否为模式实例,其准确率显然不高。尤其是对于设计模式变体的识别更是如此。此外,软件度量主要用于衡量系统的静态结构属性。因此只通过软件度量难以对行为型模式进行精准识别。事实上,使用软件度量来识别设计模式往往需要通过人工确认来获取最终的实例。5)使用机器学习识别设计模式最重要的过程是准备训练样本。目前大多数使用机器学习识别设计模式的文献都是手动获取和标记训练样本,这需要耗费很多时间和人力。为满足规模大、复杂性高的软件系统对于设计模式识别方法准确率和时间性能的需求,本文提出一种基于相似度评分、有限状态机(FSM,finite state machine)和机器学习的设计模式识别方法。主要的研究工作及创新点如下:1)针对现有文献大多将模式与整个系统进行匹配,识别准确率和时间性能不高的问题,提出一种基于相似度评分和二级子系统的设计模式识别方法。该方法将待考查系统划分为若干个子系统,并将子系统进一步划分为类个数与待识别模式中的角色个数相等的二级子系统,然后使用相似度评分算法匹配二级子系统和模式来识别系统中的模式实例。实验结果表明,该方法具有较高的识别准确率和时间性能。2)针对现有文献无法检测行为型模式或在识别行为型模式方面准确率较低的问题,本文提出一种基于FSM的行为型模式候选实例确认方法。该方法使用单元测试工具JUnit执行上述基于相似度评分和二级子系统的方法得到的行为型模式候选实例,并将运行期间实际发生的方法调用与行为型模式转换得到的FSM进行匹配,以此来最终确认候选实例是否为模式实例。实验结果表明,该方法可以提升行为型模式识别的准确率。3)针对现有文献大多都未考虑模式的命名特征,而基于软件度量识别模式准确率不高且需要人工确认的问题,提出一种基于软件度量、命名特征和机器学习的行为型模式候选实例初步确认方法。该方法使用6个现有的设计模式识别算法对102个开源项目中的模式实例进行识别以获取正反样本,并将正反样本中类的度量值和命名提供给学习系统(本文使用ANN方法)进行学习。这反过来又提供了一个包含所获知识的模型,该模型可以在对行为型模式候选实例进行初步确认。该方法可以缩小基于FSM的确认的搜索空间。4)针对手动获取和标记设计模式识别训练样本需要耗费很多时间和人力的问题,提出一种自动获取和标记训练样本的算法。该算法集成多个现有的设计模式识别算法,输入包含设计模式实例的开源应用程序,自动判定并标记训练样本。该算法可以为上述基于软件度量、命名特征及机器学习的行为型模式候选实例初步确认方法生成训练样本。本文首先给出了该方法的基本思路,并讨论了源代码信息的提取;然后,提出一种基于有向图/矩阵的设计模式和系统的表示以及一种基于FSM的行为型模式的表示;接着,分别详细讨论了基于相似度评分和二级子系统的设计模式识别算法、基于FSM的行为型模式候选实例确认算法以及基于软件度量、命名特征和机器学习的行为型模式候选实例初步确认方法;最后,在开源项目JHotDraw 5.2、JRefactory 2.6.24和JUnit 3.7上进行了实验,并对结果进行了分析讨论。实验结果表明,该方法可以对设计模式进行识别,且具有较高的识别准确率和时间性能。对于结构特征不够明显或者与其他模式具有相似结构特征的行为型模式,效果尤其明显。