基于代码异味的软件重构预测方法技术

技术编号:32548148 阅读:17 留言:0更新日期:2022-03-05 11:47
本发明专利技术公开了一种基于代码异味的软件重构预测方法。该方法基于LGBM和Logistic Regression来实现软件重构的预测,合理利用了存在于源代码文件中蕴含的结构性信息、代码异味的强度和历史性信息,凭借不同信息度量之间强大的互补性提高了预测的效果。此外,通过过采样技术SMOTE解决了样本比例不均衡的问题。通过本发明专利技术方法能够高效预测软件的重构时机,对于软件的可维护性和可拓展性的提升具有非常重要的意义。常重要的意义。常重要的意义。

【技术实现步骤摘要】
基于代码异味的软件重构预测方法


[0001]本专利技术涉及软件维护领域,具体涉及一种基于代码异味的软件重构预测方法。

技术介绍

[0002]在软件维护和演化过程中,软件系统需要由开发人员不断地进行更改,以便实现新的需求,增强现有的特征,或者修复重要的错误。由于时间压力或其他相关信息,开发人员并不总是有时间或意愿来控制系统的复杂性,并在应用他们的修改之前找到好的设计解决方案。他们可能会单纯为实现功能而编写代码,而忽视程序的结构性和可读性。代码编写上变得越来越混乱,使得整个代码结构变得臃肿不堪,这时候往往会引入代码异味。
[0003]代码异味表明源代码中容易导致改变和出错的次优设计或实现选择,会造成代码质量下降,同时会对软件开发人员在理解和维护项目代码时造成困扰,是导致技术债务的一个重要因素,从而产生不必要的维护代价。
[0004]而在软件的开发和生命周期中,维护被认为是最艰巨和最昂贵的任务之一,尤其是软件系统中异味过重的话,往往会导致代价极大的重构工作。
[0005]近年来的研究显示,现有的软件系统中存在代码异味的现象十分常见,大量的异味实例往往在其所在的文件被创建时就被引入,并且其倾向于长时间存在于软件系统中并存活下来,这往往会给软件系统带来后续维护和拓展上的隐患。
[0006]因此,选择用一个合适的时间进行重构消除异味的工作是十分重要的,它会对软件的可维护性和可拓展性带来提升。
[0007]以往的研究往往注重于代码异味的检测或软件重构的优先级,很少有研究来进行代码重构时机的预测工作。

技术实现思路

[0008]本专利技术从代码重构预测的角度出发,利用代码文件的结构性信息(规模大小、复杂度、耦合度、内聚性等方面)、异味的强度和历史性信息(文件中异味的持续时间、更改次数等信息),提供了一种基于机器学习集成技术的代码重构预测方法,可有效解决上述问题。本专利技术具体采用的技术方案如下:
[0009]一种基于代码异味的软件重构预测方法,具体包括以下步骤:
[0010]步骤(1)给定待分析系统中m*n个源代码文件版本集合F=(F
1,1
,F
1,2
,

,F
i,j
,

,F
m,n
),其中F
i,j
表示源代码文件F
i
的第j个版本,利用代码解析工具解析每一个源代码文件,将每一个源代码文件版本F
i,j
的结构与异味信息度量表示为S
i,j
=<className,classVersion,structure,hasSmell>的形式,i=1,2,

,m,j=1,2,

,n,其中className表示源代码文件版本F
i,j
的类名(设一个源代码文件包含一个类),classVersion表示源代码文件版本F
i,j
在项目历史中的版本号,structure表示源代码文件版本F
i,j
的结构特征集合W=<w
LOC
,w
NOA
,w
CBO
,w
MPC
,w
TCC
,w
McCabe
,w
WMC
>,其中w
LOC
表示该文件的代码行数,w
NOA
表示该文件中属性的个数,w
CBO
表示与该文件相耦合的目标类的数量(耦合即该文件中的方法调用了
目标类的方法或变量),w
MPC
表示该文件中的方法调用其他方法的个数,w
TCC
表示通过访问相同的属性而直接发生联系的方法个数,w
McCabe
表示该文件通过McCabe度量法计算得到的复杂度,w
WMC
表示该文件中方法的圈复杂度的和,hasSmell表示源代码文件版本F
i,j
中是否存在某种代码异味(1表示存在异味,0则表示不存在);
[0011]步骤(2)如果源代码文件版本F
i,j
被识别为存在某种代码异味,判别是否具有这种代码异味的特征阈值集为T=<w1|b1,...,w
g
|b
g
,...,w
t
|b
t
>,其中w
g
为W中的一个特征,b
g
为识别为这种代码异味的特征w
g
对应的阈值,g=1,2,

,t,通过以下公式计算得到异味强度:
[0012][0013]其中,m(w
g
)表示待分析系统中存在的、由于特征w
g
引起某种代码异味的最大或最小值(当w
g
超过b
g
时引起某种代码异味的时候选用最大值,当w
g
小于b
g
时引起某种代码异味的时候选用最小值);
[0014]添加强度信息后源代码文件版本F
i,j
的结构与异味信息度量表示为:
[0015]S

i,j
=<className,classVersion,structure,hasSmell,intensity>
[0016]步骤(3)获取源代码文件历史信息度量:
[0017]设源代码文件F
i
在某个历史版本p中引入了代码异味,源代码文件F
i
当前版本为j,则源代码文件版本F
i,j
中关于历史信息度量可以表示为:
[0018]H
i,j
=<className,classVersion,diffDays,diffVersions,action>
[0019]其中diffDays表示版本p和j之间间隔的自然天数,diffVersions表示版本p和j之间间隔的版本数,action表示版本p和j之间文件F
i
发生修改的次数;
[0020]步骤(4)我们在源代码文件集合F中找到所有的代码异味消除的源代码文件版本,分成以下两类:
[0021]1)F
i,j
的hasSmell=1,而F
i,j+1
的hasSmell=0;
[0022]2)F
i,j
的hasSmell=1,且j是源代码文件F
i
的最后一个版本,考虑到文件被删除也可能是异味过重导致的结果,因此这种情况也会被考虑;
[0023]根据1)和2)中的策略,在源代码文件集合F中获取到存在某种代码异味的所有的最后一个源代码文件版本F...

【技术保护点】

【技术特征摘要】
1.基于代码异味的软件重构预测方法,其特征在于包括以下步骤:步骤一:给定待分析系统中m*n个源代码文件版本集合F=(F
1,1
,F
1,2
,...,F
i,j
,...,F
m,n
),其中F
i,j
表示源代码文件F
i
的第j个版本,利用代码解析工具解析每一个源代码文件,将每一个源代码文件版本F
i,j
的结构与异味信息度量表示为S
i,j
=<className,classVersion,structure,hasSmell>的形式,i=1,2,...,m,j=1,2,...,n,其中className表示源代码文件版本F
i,j
的类名,设一个源代码文件包含一个类;classVersion表示源代码文件版本F
i,j
在项目历史中的版本号,structure表示源代码文件版本F
i,j
的结构特征集合W,hasSmell表示源代码文件版本F
i,j
中是否存在某种代码异味,1表示存在异味,0则表示不存在;特征集合W=<w
LOC
,w
NOA
,w
CBO
,w
MPC
,w
TCC
,w
McCabe
,w
WMC
>,其中w
LOC
表示该文件的代码行数,w
NOA
表示该文件中属性的个数,w
CBO
表示与该文件相耦合的目标类的数量,耦合即该文件中的方法调用了目标类的方法或变量;w
MPC
表示该文件中的方法调用其他方法的个数,w
TCC
表示通过访问相同的属性而直接发生联系的方法个数,w
McCabe
表示该文件通过McCabe度量法计算得到的复杂度,w
WMC
表示该文件中方法的圈复杂度的和;步骤二:如果源代码文件版本F
i,j
被识别为存在某种代码异味,判别是否具有这种代码异味的特征阈值集为T=<w1|b1,...,w
g
|b
g
,...,w
t
|b
t
>,其中w
g
为W中的一个特征,b
g
为识别为这种代码异味的特征w
g
对应的阈值,g=1,2,...,t,通过以下公式计算得到异味强度:其中,m(w
g
)表示待分析系统中存在的、由于特征w
g
引起某种代码异味的最大或最小值:当w
g
超过b
g
时引起某种代码异味的时候选用最大值,当w
g
小于b
g
时引起某种代码异味的时候选用最小值;添加强度信息后源代码文件版本F
i,j
的结构与异味信息度量表示为:S

i,j
=<className,classVersion,structure,hasSmell,intensity>;步骤三:获取源...

【专利技术属性】
技术研发人员:俞东进翁乐辉陈洁陈信陈宇廷叶佳萍
申请(专利权)人:杭州电子科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1