软件设计采用机器学习方法,结合源代码的演化特性和结构指标来进行预测分析

《Journal of Computer Languages》:Software design smells prediction using machine learning with evolutionary and structural metrics of source code

【字体: 时间:2026年02月03日 来源:Journal of Computer Languages 1.8

编辑推荐:

  软件设计气味预测方法融合静态结构和动态演化特征,通过分析Java项目版本历史数据构建多分类体系,结合耦合、继承等结构指标和版本提交频率、重构次数等演化指标,采用集成分类器提升检测准确率至81%。

  
Kapil Sharma | Jitender Kumar Chhabra
印度库鲁克谢特拉国立理工学院

摘要

软件设计“异味”指的是软件系统中的结构异常,这些异常会对软件的可维护性和演化产生负面影响。以往的研究依赖于结构指标来预测软件异味,但并未考虑演化方面的因素。本文提出了一种基于演化和结构指标的方法来预测设计异味。我们使用多个版本的Java项目构建了一个数据集。所提出的方法采用集成分类器对设计异味进行分类,研究结果表明,结合使用演化特征和结构指标可以提升预测的准确性。在所有设计异味中,同时使用演化指标和结构指标的效果优于单独使用结构指标。

引言

软件设计质量直接影响软件项目的长期可维护性和可理解性,进而影响软件的演化。Fowler等人提出了代码异味这一概念,作为软件源代码中深层设计问题的表面指标[1]。虽然代码异味并不一定意味着代码存在错误,但它们的存在可能会阻碍软件的演化与维护[2]。基于面向对象设计原则对代码异味进行分类的一种方式称为“设计异味”[3]。设计异味不会损害代码的功能,但它们的存在会降低软件的质量属性,导致模块化程度、可理解性和适应性降低。如果累积的设计异味得不到妥善处理,最终会在代码中形成“技术债务”,使得软件更难以理解和添加新功能[4]。先前的研究已经实证表明,这些代码异味或设计异味的存在会增加类的变更倾向和故障倾向,从而增加维护成本[5]。因此,需要采取主动措施尽早发现这些设计问题。
早期发现这些软件异味对于支持开发人员和维护人员至关重要。代码异味的检测方法包括手动分析源代码(这种方法耗时且容易出错),以及基于预设指标阈值的指标检测方法[6]。一些自动化工具(如PMD1和DesigniteJava2)内置了知名的代码异味定义,用于制定检测规则。虽然这些方法可以检测到许多代码异味,但不同工具之间的检测结果一致性较低,因为异味检测是一个主观过程,存在不同的检测规则[7]。随着软件功能的不断发展,需要更可靠的技术来消除误报。
在检测传统软件异味时,主要关注源代码的静态结构;为此通常使用软件代码指标来量化代码的结构化程度。然而,软件设计异味并非突然出现的异常,而是逐渐形成的,具有生命周期特征。它们可能从初始版本一直存在到最终版本,也可能在某个阶段出现后消失,或者在整个版本历史中从未出现。因此,通过分析源代码随时间的变化情况(例如通过挖掘版本历史或变更历史),可以揭示静态数据所忽略的隐藏信息;例如,如果某个类从最初版本就存在设计问题,这些问题可能一直持续存在,并可能暗示更严重的设计问题。
以往的研究主要依赖于静态代码指标和软件变更历史,这些方法在软件故障预测中效果显著,但在检测代码异味方面应用较少。Palomba等人[6]通过对五个项目的30万次提交进行验证,发现80%的异味类被准确识别。Tufano等人的研究[7]指出,大多数异味出现在软件的初始版本,这突显了纵向数据在理解异味演化过程中的价值。他们分析了200个开源项目的变更历史,发现只有20%的异味被消除,而80%的异味在首次出现后仍然存在于系统中。尽管如此,大多数先前的异味检测方法仍存在不足,因为研究者往往仅依赖静态信息或演化信息中的某一方。尽管一些研究者已经开始探索多版本分析来检测代码异味[7,8],但仍需进一步努力,以有效结合多个版本源代码的结构和演化特征。因此,本研究结合了源代码的结构和演化指标来分析多个版本。
  • 提出了一种新的方法,整合了源代码的结构指标和演化指标,以提高面向对象设计异味的预测准确性。
  • 提出了一种多类标记方案,将每个类分为五类(持久存在、新出现、重构过、不确定、无异味)。
  • 通过版本挖掘,推导出一组新的演化指标(四个与时间戳相关的指标、三个与错误相关的指标和两个与重构相关的指标),以更好地捕捉设计异味在整个版本历史中的演化过程。
  • 使用结构和演化指标作为特征集进行分类,使得XGBoost分类器的平均F1分数从63%提升到81%。
本文的其余部分结构如下:第2节介绍了与设计异味概念和检测技术相关的研究工作,以及结构指标和演化指标在以往研究中的应用;第3节简要阐述了研究方法;第4节解释了数据收集和实验设置;第5节讨论了实验结果;第6节指出了实验有效性的挑战;第7节总结了研究结论和未来发展方向。

相关研究

相关工作

本节回顾了与设计异味检测技术相关的过往研究,包括用于软件缺陷和代码异味预测的结构指标,以及演化指标在质量预测中的作用。

提出的方法和工作细节

本研究部分阐述了如图1所示的设计异味检测整体方法。传统的异味检测方法主要依赖静态结构指标,往往无法捕捉设计异味随时间变化的动态特性。为了解决这个问题,本研究提出了一种结合结构指标(如耦合度、继承性和内聚性)和演化指标(如代码变更频率)的方法。

数据收集和实验分析

本节介绍了用于评估所提出设计异味检测方法的实验流程。数据集是通过分析每个选定软件项目的十个版本构建的(见第3.1节)。对于每个项目,分析了所有10个历史版本,并提取了每个版本的字节级信息。我们根据PHAME(层次原则、抽象性等)标准,识别了四种主要类型的设计异味的存在情况。

结果与讨论

Soto-Mayor等人的研究[25]仅使用结构指标通过机器学习方法在设计异味预测方面取得了显著进展。我们的研究通过结合演化指标补充了他们的成果;表7展示了与他们工作的对比。他们专注于使用结构指标检测设计异味,如“上帝类”(God Class)、“特征嫉妒”(Feature Envy)和“长方法”(Long Method)等。

有效性的挑战

本研究的主要目的是展示演化信息如何补充结构信息(静态设计结构),以帮助理解设计异味的生命周期行为(如持久性、重构和新出现)。有效性的挑战在于,演化信息引入了不同特征集之间的不对称性,这种不对称性是为了突出演化特征的价值。为了解决这个问题,我们进行了相关评估。

结论与未来方向

本研究提出了一种利用源代码的结构和演化信息进行设计异味预测的方法。我们选择了五个不同领域的开源Java项目,每个项目包含十个连续版本,并根据类的异味状态将15种不同类型的设计异味分为五类。

CRediT作者贡献声明

Kapil Sharma:验证、方法论设计、数据整理、概念化。Jitender Kumar Chhabra:撰写、审稿与编辑、监督。

利益冲突声明

我们声明没有任何已知的财务利益或个人关系可能影响本文的研究结果。
相关新闻
生物通微信公众号
微信
新浪微博
  • 搜索
  • 国际
  • 国内
  • 人物
  • 产业
  • 热点
  • 科普

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号