论文部分内容阅读
程序重构是一种在保持软件可见行为的前提下,对软件既有代码的改善。目的是使其更易理解与维护,修改成本更低。程序重构可延缓软件老化带来的退化影响,改善程序质量。过程提取是将已有方法中的一部分提取出来作为一个新的方法,被提取的部分用新方法调用替代。过程提取经常用于减少软件系统中的克隆代码(Clone Code)。本文主要研究克隆代码的过程提取方法以及重构对进化软件中模块间依赖关系的影响。针对由克隆代码检测工具检测出来的克隆代码不能直接用于重构的问题,提出了一种可重构克隆代码的预处理方法,该方法由两部分组成:首先,将自适应K-最近邻聚类(Adaptive K-Nearest Neighbors,A-KNN)与图相结合,用于消除拷贝-粘贴相关缺陷检测的误检。然后,对不含缺陷的克隆代码,使用基于代价-收益的评估方法识别可重构的克隆代码,为后续克隆代码重构做好准备。实验结果表明,本文提出的预处理方法可以有效消除因检测错误修改某标识符缺陷时产生的误检。不仅提高了克隆代码相关缺陷检测的准确性,而且可以消除更多的克隆代码。针对传统的保持语法结构不变的过程提取方法提取不连续克隆代码时存在的问题,提出一种新的语义保持的不连续克隆代码无定型过程提取方法。该方法结合程序依赖图(Procedure Dependence Graph,PDG)和抽象语法树(Abstract Syntax Tree,AST)对程序进行结构语义分析,取消了传统的保持语法结构不变的过程提取算法对语句结构一致性的约束,保留了语义一致性约束,从而解决了传统方法不易处理的连续但不能直接提取的克隆代码提取问题,降低了对未标记语句提升的需求,并且不需要对跳转语句进行特殊处理。实验结果表明,本文提出的克隆代码无定型过程提取算法的准确性和适用性均高于已有的保持语法结构不变的过程提取算法,可以有效地减少克隆代码数量,提高代码质量。针对传统的保持语法结构不变的过程提取方法通过语句提升不能提取某些近似克隆代码的问题,提出一种新的语义保持的近似克隆代码无定型过程提取方法(Semantic-Preserving Amorphous Procedure Extraction,SPAPE)。该方法结合程序依赖图和抽象语法树对程序进行结构语义分析,取消了传统的保持语法结构不变的过程提取算法对语句结构一致性的约束,保留了语义一致性约束。该方法由四部分组成:首先,SPAPE使用程序依赖图对源程序进行结构语义分析。然后,结合程序依赖图和抽象语法树执行语义保持的无定型过程变换,识别出差异点。接着,通过插入控制变量和条件语句进行差异点融合。最后,进行过程提取。实验结果表明,本文提出的近似克隆代码的无定型过程提取方法(SPAPE)解决了传统方法不能处理某些近似克隆代码的问题,同时在算法的有效性、代价-收益分析等方面优于传统方法。针对过程提取改变了软件内部模块间的依赖关系这一现象,本文从软件的进化角度对软件内部模块间依赖的分布以及重构对这种分布的影响进行实验研究。结果表明,软件内部模块间的依赖分布是不平衡的:相对于较大的模块,依赖集中于较小的模块间,这种依赖聚集的不平衡性不仅存在于单版本的软件内部,也存在于软件产品的整个生命周期中。同时,持续性重构加剧了这种依赖聚集的不平衡性。因此,根据上述分析结果,在软件维护或质量评估方面软件管理者和开发者,更多关注规模较小的模块,并且在软件的进化过程中,进一步增加关注度。综上所述,本文提出的克隆代码预处理方法、无定型过程提取方法,解决了可重构的克隆代码的预处理问题、不连续克隆代码的过程提取和近似克隆代码的过程提取等关键技术问题,并且通过模块间相对依赖关系的进化分析,揭示了程序内部模块间依赖关系变化的规律以及重构对这种变化的影响。