Integrating Structural and Semantic Analysis for Code Smell Refactoring Prediction
本文提出并实证评估了一种用于预测 Java 项目中代码异味重构的机器学习框架,证明了将传统的面向对象度量指标与语义及语法图嵌入相结合,能够通过捕捉结构化度量指标本身无法提供的互补信号,从而实现可靠的预测。
原始论文采用 CC BY 4.0 许可(https://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
软件永远没有真正完成的一天。就像一座城市在数十年间有机地生长一样,一个计算机程序会不断累积添加、补丁和快速修复的层级。随着时间的推移,这种有机增长可能导致结构性弱点,就像一栋建筑中由于没有加固墙壁而拓宽了走廊一样。在软件工程领域,这些局部的缺陷被称为“代码异味”(code smells)。它们并不是会导致程序崩溃的错误,而是设计不良的迹象,使得代码难以理解、修改或维护。当开发者发现这些异味时,他们通常会进行“重构”(refactoring),这是一个仔细重新组织代码的过程,旨在改善其结构而不改变软件原有的功能。挑战在于,开发者并不总是修复他们发现的每一个异味,而且预测哪些异味会被修复是很困难的,因为这个决定往往取决于人类的意图和上下文,而不仅仅是代码本身。
米兰比科卡大学(University of Milano-Bicocca)的一个研究小组致力于研究机器是否可以学习预测这些人类决策。他们想知道,计算机是否可以通过观察一段代码,识别出一个缺陷,并准确猜测开发者最终是否会对其进行清理。为了实现这一点,他们构建了一个结合了两种不同观察代码方式的系统。第一种方式是传统的:统计属性,例如一个方法有多长或使用了多少变量。第二种方式则更加现代且复杂:将代码转化为其逻辑和行为的地图,然后将该地图转化为计算机可以分析隐藏模式的数学表示。通过将这些组合信息输入机器学习模型,研究人员测试了计算机是否能够学习引导开发者进行重构的微妙规则。
研究人员收集了来自 79 个开源 Java 项目的数据,这些项目是由许多不同的人在一段时间内开发和维护的集合。他们使用自动化工具扫描了这些项目的历史,识别出数千个存在代码异味的实例,并追踪了哪些异味后来通过特定的重构操作得到了修复,例如重命名变量、将一个方法提取成更小的部分或更改参数。随后,他们为每段代码创建了一个混合数据集。该数据集包含了标准测量指标(如方法中的行数),以及两种不同类型的“嵌入”(embeddings)。其中一种嵌入映射了控制流,展示了指令执行的顺序。另一种则更为先进且复杂,它映射了更深层的语义关系,捕捉数据如何在程序中流动以及不同代码部分如何相互依赖,从而有效地创建了一幅关于代码行为的丰富、多维肖像。
结果表明,机器学习模型确实能够以极高的可靠性预测重构。当模型在十种不同类型的重构操作上进行测试时,它们经常获得远高于 0.70 且在某些任务中超过 0.80 的 AUC 分数。这表明,代码中确实存在可以检测到的模式,能够发出开发者意图进行清理的信号。然而,研究揭示了一个关键的细微差别:并非所有的代码异味都是平等的。模型在预测结构性变化方面表现得异常出色,例如为方法添加参数或更改变量类型。这些操作通常是由清晰、可测量的因素驱动的,如语句的长度或计算的复杂度。相比之下,模型在预测概念性变化(如重命名方法)时则显得力不从心。重命名通常是一个基于开发者对代码用途理解的主观决策,而这种因素很难仅通过数字或结构图来捕捉。
或许最显著的发现与使用的代码表示类型有关。研究人员最初预期,仅仅增加更复杂的代码执行流图就会提高预测效果。然而,他们发现一种追踪语句顺序的特定流图实际上引入了噪声,使模型产生困惑。当这种流图与传统测量指标结合时,往往会使预测效果变差,因为计算机难以忽略那些无关紧要的细节。但是,当研究人员切换到那种结合了结构依赖性与实际文本及逻辑的更高级表示形式时,结果发生了戏剧性的变化。这种更丰富的表示提供了一个互补的信号,使模型能够有效利用。事实上,对于某些任务,仅使用这种高级表示进行训练的模型,其表现几乎与使用完整数据集训练的模型一样好,这证明了代码的深度结构和语义理解本身就是一种强大的预测因子。
该研究还强调了仅凭代码本身所能预测的极限。虽然模型可以可靠地预见由复杂度驱动的技术性修复,但它们无法轻易预见重命名或为了清晰度而重组代码背后的人类决策。这表明,虽然机器在识别软件何时在技术层面亟需维护方面表现出色,但重构的最终决定往往依赖于存在于代码之外的开发者的愿景和上下文。研究结论认为,自动化软件维护的未来不在于取代人类判断,而在于利用这些预测工具来突出那些最紧迫的结构性债务,从而让开发者能够专注于那些最重要的变更。通过理解哪些信号是强信号,哪些是噪声,我们可以构建更好的工具来帮助保持我们数字基础设施的健康与可持续性。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。