本文是一篇计算机论文,本文首先对7个开源软件系统(如Eclipse、Hadoop等)的源代码进行分析,使用CK工具计算了它们的代码度量,包括类级别和方法级别的各种度量指标,以对其中包含的 Feature Envy、Complex class、Long Method、Spaghetti code这 4 种代码异味进行分析与研究。
第1章 绪论
1.1 选题背景和意义
随着软件开发的不断演进,程序员们面临着越来越复杂的需求和代码。为了应对这些挑战,他们需要遵循一些良好的编程规范和设计原则,以保证代码的质量和可维护性。然而,在实际的开发过程中,由于时间压力、技术水平、个人习惯等各种因素,程序员们往往会在代码中留下一些不良的痕迹,这些痕迹可能会导致代码的可读性、可扩展性和可测试性降低,甚至会引发更深层次的问题。这些不良的痕迹就被称为代码异味(Code smell),它是程序员们在编码过程中需要警惕和避免的。
完整的软件开发过程可分为需求分析阶段,结构设计阶段,开发阶段,测试阶段,软件上线后的版本更新优化阶段。优秀的软件项目从起初的需求分析阶段到最终软件投入使用,通常会经历较长的时间周期,因为软件开发过程中任何环节的失误都可能对软件质量造成影响[1]。
代码异味是指开发人员在实现软件系统的过程中使用的不良设计和代码实现方式,它指的是源代码中可能暗示着程序存在更深层次的问题的任何特征。判断某段代码是或不是代码异味是一个主观的过程,可能因为语言、开发者和开发方法的不同而不同。这个术语是由Kent Beck在20世纪90年代后期在WardsWiki上首次使用的,它在Martin Fowler的《重构:改善既有代码的设计》一书中得到了进一步的推广,成为敏捷开发者常用的术语。
1.2 国内外研究现状
1.2.1 代码异味的概念和种类
代码异味[3]是指开发人员在实现软件系统的过程中使用的不良设计和代码实现方式。这是一种在源代码中可以快速发现的现象,它们通常暗示着源代码中存在着更深层次的设计或实现问题,这些问题可能会导致软件质量逐渐衰退,增加软件维护和演化的难度和成本[4]。它们并不一定是错误或缺陷,也不一定会影响软件的功能或性能。然而,它们会使源代码变得复杂、冗余、耦合、难以理解和修改,从而降低软件开发者的效率和用户的满意度。因此,及时地检测和消除代码异味是提高软件质量和可维护性的有效手段。
由于代码异味是一种主观的概念,不同的开发者对于同一段代码是否存在异味可能会有不同的看法。这可能取决于开发者使用的编程语言、编码风格、开发方法等因素。因此,对于代码异味的定义和识别没有一个统一和标准的答案。不过,有一些公认的代码异味类型已经被广泛地研究和应用。Fowler等人[5]最早引入了代码异味这个术语,并给出了22种常见的代码异味类型,例如重复代码(Duplicated Code)、长方法(Long Method)、过大的类(Large Class)、神秘命名(Mysterious Name)等。他们还针对每种代码异味类型提出了相应的重构技术,用于改善存在代码异味的设计,并给出了详细的重构步骤和示例。他们认为,代码异味是重构的驱动力,通过不断地检测和消除代码异味,可以提高代码的内部结构,使其更加清晰、简洁和易于理解。
第2章 相关术语和技术
2.1 代码异味
代码异味是当今软件系统中较为常见的一种设计上的缺陷,会对软件维护带来一定的影响。一种常用的修复代码异味的方法是重构,即在不改变软件的功能和行为的前提下,对软件的结构和设计进行改善,使其更加清晰、简洁和高效。本文中,我们主要关注Java语言编写的软件系统中的四种常见的代码异味,即Complex Class, Feature Envy, Long Method, Speghetti Code,它们的详细描述如表1所示。
表1中的四种代码异味在软件开发过程中广泛存在,且会对软件系统的可理解性、可维护性或可测试性造成较为严重的负面影响。其中CC和SC为类级异味,FE和LM为方法级异味,均针对Java语言编写的程序进行异味研究。
对于复杂类(CC),可以使用提取类或提取子类等重构手段,将类的职责分解为更小的、更单一的类或子类,减少类的复杂度和依赖,提高类的内聚性和可扩展性。
对于特征依恋(FE),可以使用移动方法或移动属性等重构手段,将方法或属性移动到更合适的类中,增加方法的内聚性,减少方法的依赖性,遵循面向对象的封装原则。
对于长方法(LM),可以使用提取方法或内联方法等重构手段,将方法分解为更小的、更具体的方法,减少方法的长度和复杂度,提高方法的可读性、可测试性和可重用性。
2.2 数据集来源
本文的研究目的是利用多模型的集成学习方法来进行代码异味检测,提高检测的准确性和鲁棒性。为了验证该方法的有效性,我们需要选择一些合适的数据集来进行实验和评估。本文实验所用的数据集来源于文献[14]所采用的30个开源项目中的7种,它们都是不同领域的Java开源项目,具有一定的规模和复杂度,能够反映出代码异味的多样性和复杂性。这7个开源项目的名称和简介如下:
(1) Eclipse:一个开放源代码的、基于Java的可扩展开发平台,它提供了一个统一的集成开发环境(IDE),支持多种编程语言和应用领域,是目前最流行的Java开发工具之一。
(2) Hadoop:由Apache基金会所开发的分布式系统基础架构,它实现了一个可扩展的、容错的、高性能的分布式文件系统(HDFS)和一个分布式计算框架(MapReduce),用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。
(3) Hbase:一个分布式的、面向列的开源数据库,是Apache的Hadoop项目的子项目,它基于Google的Bigtable模型设计,可以存储海量的稀疏的、结构化或半结构化的数据,支持随机实时的读写操作,适用于大数据的分析和处理。
(4) Hive:基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制,它提供了一种类似于SQL的查询语言(HiveQL),可以将用户的查询转化为MapReduce任务,从而简化了用户对Hadoop数据的操作。
第3章 融合特征选择与多模型软投票集成的异味检测方法................................ 19
3.1 CK代码度量 ................................... 19
3.2 特征选择方法 ............................................ 20
3.3 多模型软投票集成学习方法 ........................ 23
第4章 实验结果与分析................................ 27
4.1 实验环境 ........................................................ 27
4.2 模型评价指标 .............................. 27
4.3 高相关性度量及其可能原因 ................. 29
第5章 总结与将来的工作....................... 38
5.1 本文工作总结 ............................ 38
5.2 未来工作展望 ........................... 39
第4章 实验结果与分析
4.2 模型评价指标
本文通过模型在每种代码异味数据集上进行预测的结果进行评估,由于构建的模型属于二分类问题,模型性能好坏可通过混淆矩阵体现。表4-1是混淆矩阵的说明。
正确预测有相应代码异味的,称为真阳性(TP);实际有相应异味但被预测为无相应异味的,称为假阴性(FN);实际无相应异味但被预测为有相应异味的,称为假阳性(FP);正确预测无相应代码异味的,称为真阴性(TN).
本文并没有选择准确率(Accuracy)作为模型评价指标,因为在正负样本分布不均衡的情况下,占比较大的类别往往成为影响准确率的主要因素,此时准确率指标不足以衡量分类器效果的优劣[49]。例如,若数据集中有 95% 的正样本和 5% 的负样本,那么一个将所有样本都预测为正的分类器就可以达到 95% 的准确率,但这显然是一个很差的分类器,因为它完全忽略了负样本。因而考虑所构造模型的通用性问题,本文未将准确率作为衡量模型的评价指标,而是采用了其他更能反映模型性能的指标,如精确率(Precision)、召回率(Recall)、F1 值(F1-score)、AUC值[50]。现详细说明这4种评价指标。
第5章 总结与将来的工作
5.1 本文工作总结
代码异味会导致软件质量逐渐衰退,降低软件可理解性和可维护性。与语法错误不同,代码异味在软件系统中并不容易被检测到。因此,在软件开发或维护时的早期阶段识别和纠正这些代码异味是至关重要的,可以避免未来产生更大的影响。为检测软件结构中的代码异味,本文提出一种基于CK度量的、经过两步特征选择的软投票集成学习的代码异味检测方法。
(1)对7个开源软件系统(如Eclipse、Hadoop等)的源代码进行分析,使用CK工具计算了它们的代码度量,包括类级别和方法级别的各种度量指标,以对其中包含的 Feature Envy、Complex class、Long Method、Spaghetti code这 4 种代码异味进行分析与研究。
(2)本文引入了Pearson相关系数来衡量所考虑代码度量指标与代码异味强度的相关性,结合相关性分析进行特征选择,从众多的度量指标中筛选出了对 4 种代码异味检测分别贡献最高的10种度量,作为本文的特征集合。与此同时,本文对4种代码异味分别的高相关性度量进行了量化分析,并详细探究了可能的原因以及对程序员的启示。
(3)通过实验探寻了决策树、随机森林、XGBoost、朴素贝叶斯、逻辑回归5种基分类器在本文数据集上的表现,计算了每种分类器的精确率、召回率、F1值和AUC值,进行了比较分析。实验结果表明,随机森林分类器在本文数据集上具有最优的性能,其次是XGBoost分类器,而决策树、朴素贝叶斯、逻辑回归分类器的性能相对较差。
参考文献(略)