开源软件代码异味预测模型的深度学习实现
1. 研究背景与问题提出
预防性维护旨在交付软件产品后,检测并纠正潜在故障,防止其演变为运行时故障,从而提升软件质量。在软件工程领域,虽有诸多研究聚焦代码异味与指标间的关系,但仍存在一些待解决的问题:
- 缺乏先运用统计分析将代码异味与指标关联,再应用深度学习技术的研究。
- 许多研究仅关注少数代码异味和有限指标,本研究精心挑选了超十五种指标,以全面覆盖面向对象编程的各个方面。
- 常用工具功能有限,如Eclipse插件 - jDeodorant 通常仅能检测四种代码异味,本研究采用了iPlasma工具。
- 现有文献研究多使用相同数据集,仅挖掘代码异味的方法不同,本研究纳入了工业级项目Eclipse的源代码。
2. 代码异味检测方法分类
代码异味检测方法主要分为以下几类:
-
自动检测方法
:涵盖全自动检测工具、框架及相关调查。在系统文献综述中,此类研究占比最高,达28%。Ekman和Schafer、Bansiya和Davis、Gueheneuc、Borg和Kropp等人在此领域成果显著。
-
实证研究
:基于实证研究生成模型,以建立代码异味与重构之间的联系。Briand等人、Mantyla等人、Li和Shatnawi、Khomh和Gueheneuc、Olbrich和Cruzes等开展了相关研究。实证研究可根据工作需求,采用可视化、半自动或全自动方式。
-
指标支持检测
:该策略利用指标评估代码内部质量,并与源代码中的缺陷进行对比。Singh和Kahlon、Fontana等人开展了相关研究。
3. 研究方法与数据收集
本研究采用基于神经网络的深度学习技术构建预测模型。深度学习是机器学习的一个分支,其算法受大脑结构和功能启发,即人工神经网络。具体采用了多层感知器(MLP),它是一种前馈神经网络,由多层节点组成,包含一个或多个隐藏层。
在MLP中,使用了两种激活函数:
-
隐藏层激活函数(双曲正切函数)
:
函数值范围在 -1 到 +1 之间,公式为:
Φ(x) = tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x))
-
输出层激活函数(Softmax激活函数)
:
函数值范围在 0 到 1 之间,公式为:
Φi = (e^xi) / ∑(j=1 to c) (e^xj)
神经网络预测模型的准确性通过ROC曲线下面积(Area under Curve, ROC)评估,其取值范围及含义如下:
- 0.90 - 1.00:优秀判别能力
- 0.80 - 0.90:良好判别能力
- 0.70 - 0.80:一般判别能力
- 0.60 - 0.70:较差判别能力
- 0.50 - 0.60:无判别能力
本研究选取了大型开源项目Eclipse IDE的四个版本(Eclipse 3.2、Eclipse 3.3、Eclipse 3.6和Eclipse 3.7)进行分析。对代码异味进行了类级别和方法级别分类,共涉及八种异味。类级别异味包括数据类、上帝类、精神分裂类和拒绝父类遗赠;方法级别异味包括大脑方法、特征嫉妒、强耦合和广泛耦合。
使用iPlasma工具获取各版本代码异味结果,并对十七种指标进行分类,分为耦合、复杂度、继承、封装和内聚五个基本组,结果如下表所示:
| 质量因素 | 相关指标 |
| ---- | ---- |
| 耦合 | ATFD, CBO, FDP, FANOUT, CC, CM |
| 复杂度 | WOC, WMC, AMW, NOA, LOCC |
| 继承 | DIT, HIT, NOD |
| 封装 | NOAM, NOPA |
| 内聚 | TCC |
各版本中异味类和非异味类的数量分布如下表:
| 所选源代码 | 异味类数量 | 非异味类数量 | 总类数量 |
| ---- | ---- | ---- | ---- |
| Eclipse 3.2 | 1995 | 4925 | 6920 |
| Eclipse 3.3 | 2399 | 5247 | 7646 |
| Eclipse 3.6 | 2832 | 6188 | 9020 |
| Eclipse 3.7 | 2856 | 6226 | 9082 |
4. 研究流程
graph LR
A[提出研究问题] --> B[确定代码异味检测方法分类]
B --> C[选择研究方法与数据收集]
C --> D[进行统计分析]
D --> E[建立预测模型]
E --> F[评估模型准确性]
F --> G[得出研究结论]
本部分详细介绍了代码异味检测的相关背景、方法分类、研究方法及数据收集情况,为后续的结果分析和模型评估奠定了基础。后续将介绍如何通过统计分析和模型构建来预测代码异味,并对结果进行讨论。
开源软件代码异味预测模型的深度学习实现
5. 统计分析与模型构建
在应用深度学习技术之前,需要先进行变量间的统计分析。因此,采用了单变量二元回归分析来检测指标与代码异味之间的关系,同时运用单变量多项回归分析来研究代码异味类型与指标的关联。研究中包含了两种因变量:二元变量和分类变量。
- 单变量二元回归分析 :对Eclipse各版本的代码异味和指标进行了二元回归分析。
- 单变量多项回归分析 :用于检验代码异味类型(类级别和方法级别)与指标之间的关联。
通过iPlasma工具获取各版本的代码异味结果,并将指标作为自变量。为了构建基于指标的代码异味预测模型,选择了十七种指标,涵盖耦合、复杂度、继承、封装和内聚五个基本组。
6. 模型评估与结果讨论
使用ROC曲线下面积(ROC)来衡量神经网络预测模型的准确性。具体结果如下表所示:
| Eclipse版本 | 应用层面 | 分类 | ROC曲线下面积 |
| ---- | ---- | ---- | ---- |
| Eclipse 3.2 | Eclipse 3.2 | 类级别 | 0.874 |
| | | 方法级别 | 0.607 |
| Eclipse 3.3 | | 类级别 | 0.915 |
| | | 方法级别 | 0.580 |
| Eclipse 3.6 | | 类级别 | 0.913 |
| | | 方法级别 | 0.585 |
| Eclipse 3.7 | | 类级别 | 0.911 |
| | | 方法级别 | 0.579 |
| Eclipse 3.3 | Eclipse 3.3 | 类级别 | 0.933 |
| | | 方法级别 | 0.740 |
| Eclipse 3.6 | | 类级别 | 0.900 |
| | | 方法级别 | 0.726 |
| Eclipse 3.7 | | 类级别 | 0.912 |
| | | 方法级别 | 0.639 |
| Eclipse 3.6 | Eclipse 3.6 | 类级别 | 0.942 |
| | | 方法级别 | 0.649 |
| Eclipse 3.7 | | 类级别 | 0.919 |
| | | 方法级别 | 0.937 |
| Eclipse 3.7 | Eclipse 3.7 | 类级别 | 0.958 |
| | | 方法级别 | 0.658 |
从结果来看,类级别代码异味预测模型表现出色,大部分版本的ROC值大于0.90,表明具有优秀的判别能力。而方法级别代码异味的ROC值在0.50 - 0.74之间,呈现出一般到较差的判别能力。这说明基于软件指标的代码异味预测模型在预测类级别代码异味方面效果显著,能够有效识别出有问题的类。
7. 研究结论与未来展望
本研究成功构建了基于深度学习神经网络技术的指标代码异味预测模型。通过对Eclipse各版本的分析,发现代码异味与指标之间存在显著关系。研究结果对软件开发人员具有重要意义:
-
定位重构区域
:帮助开发人员准确找到需要重构的代码区域。
-
应用合适重构技术
:根据异味类型和严重程度,选择合适的重构方法。
-
提升代码质量
:使代码更加清晰易懂,提高软件的可维护性。
未来的研究可以从以下几个方面展开:
-
扩大数据集
:考虑使用更大规模的数据库,并结合已确认的故障信息。
-
更换代码异味类型
:尝试不同的代码异味集合,并使用不同的代码异味预测器。
-
细化异味处理
:可以针对单个代码异味进行处理,并根据既定规范对其进行分类评估。
-
选择其他指标
:尝试使用本研究未涉及的指标,可能会得到不同的结果。
graph LR
A[未来研究方向] --> B[扩大数据集]
A --> C[更换代码异味类型]
A --> D[细化异味处理]
A --> E[选择其他指标]
综上所述,本研究为代码异味的预测和处理提供了一种有效的方法,未来的研究有望进一步完善和拓展这一领域。
超级会员免费看
53

被折叠的 条评论
为什么被折叠?



