论文部分内容阅读
软件系统的演化是一个长期连续的过程,软件系统在一段时间内通常会发生一系列大小不等的变化。随着软件系统的发展,系统的功能就会越来越多,从而系统越来越大,相比较而言其设计就会变得恶化,会更加复杂和难以理解,导致软件系统很难维护。软件整个生命周期内,维护的花费是开发的2-100倍,为了提高软件系统的可维护性,降低维护成本,系统就必须在不影响外部行为的前提下进行重构,重构的基础就是检测代码坏味,因此,代码坏味的检测就变得尤为重要。代码坏味指软件设计上的一些问题,会导致软件很难演化,越来越多的学者采用机器学习的方法来检测坏味,机器学习方法能够通过学习样例来构建检测规则,最后用测试样例来评价结果,结果表明用机器学习方法检测代码坏味会取得更好的结果。但由于代码坏味的数据集是极度不平衡的,负样例个数远远大于正样例个数,这就导致传统机器学习算法的效果大打折扣。本文提出一种新的检测代码坏味的方法,以传统机器学习算法决策树为基础,引入以认知复杂度为代价因子的代价矩阵,从而降低数据不平衡对算法的影响,提高代码坏味的检测准确率,本文主要研究了长方法和特征依恋两种代码坏味的检测。本文的主要工作有:1)针对代码坏味的检测,考虑到数据的不平衡特点,提出一种新的代码坏味识别算法,代价敏感集成分类器算法。以传统决策树算法为基础,利用欠采样策略对样本进行重采样,进而生成多个平衡的子集,并把这些子集训练生成多个基分类器,将这些基分类器组合形成一个集成分类器。最后在集成分类器分类属性选择中加入错分类代价,其中错分类代价是由认知复杂度决定的,使得分类器能向准确分类少数类倾斜。2)基于抽象语法树计算了面向对象的度量。针对长方法(Long method)的检测,本文运用抽象语法树,在项目中计算出了每个方法的长度(MethodLine),圈复杂度(McCabe),LCOM等度量值。并把项目中所有长方法进行标记,便于后续识别。针对特征依恋坏味(Feature Envy)的检测,运用抽象语法树提取了项目中每个类的类名,所包含的方法名,ATFD(Access to Foreign Data)和LAA(Locality of Attribute Accesses)等度量,并标记了所有的特征依恋。3)在相同的数据集上,通过比较代价敏感集成分类器、决策树和随机森林算法的实验结果,验证了代价敏感集成分类器在代码坏味检测上的有效性。