一种利用遗传算法改进软件模块质量的方法和系统



1.本发明属于软件重构技术领域,具体涉及一种利用遗传算法改进软件模块质量的方法和系统。


背景技术:



2.软件系统需要持续地进行调整以适应变化的需求,随着软件系统的不断调整,其复杂度会逐渐增加,软件质量也会逐渐下降,除非采取措施来降低或保持其复杂度和改善软件质量。然而,软件系统在其不断调整的过程中,由于一些现实原因,如时间压力、计划不周的变更等,开发人员可能会做出对软件质量属性造成负面影响的设计决策,这种设计决策被称为异味
3.根据异味的影响范围可以将其从低到高划分为三个层级,包括实现层级,通常指方法内具体代码实现相关的问题;设计层级,通常指类层级的结构性问题;架构层级,通常指软件架构中组件层级的结构性问题。其中实现层级和设计层级的异味被统称为代码异味,架构层级的异味被称为架构异味。在上述三个层级的异味中,架构异味的影响范围最广。许多研究表明,架构异味会对软件系统的可维护性造成严重的负面影响,需要对其进行重构以改进架构。
4.然而,架构异味常常是难以重构的,其原因如下:第一,确定有效的架构异味重构操作本身难度就很大,没有大量的实战经验基本无法确定有效的重构操作。第二,在确定有效的架构异味重构操作之后,进一步确定执行重构操作的顺序对于开发人员也是一个很大的挑战。第三,如何评估重构操作对软件架构的改善效果也是一个挑战。


技术实现要素:



5.为解决上述问题与挑战,本发明提出了一种利用遗传算法改进软件模块质量的方法和系统,该方法能够根据软件源代码文件生成重构方案,开发人员可根据生成的重构方案对软件进行重构。
6.为实现上述目的,本发明的技术方案是:提出一种利用遗传算法改进软件模块质量的方法,包括以下步骤:
7.s1:分析软件源代码的语法树,识别文件和组件间的软件依赖关系网络;
8.s2:利用异味检测算法识别软件依赖关系网络中存在的异味组件;
9.s3:根据识别出的软件依赖关系网络以及异味组件,利用遗传算法生成重构方案,以供开发人员选择重构方案对软件进行重构。
10.优选地,进行步骤s1前对软件中的源代码文件进行预处理工作,将软件中的每一个代码文件编译成字节码文件,作为步骤s1的输入;
11.优选地,所所述的软件依赖关系网络部分,包括的元素有:
12.s1-1:文件节点fi,表示源代码文件;
13.s1-2:组件节点cj,表示用于存放源代码文件的目录;
14.s1-3:文件和文件之间的调用依赖关系边;
15.s1-4:组件和组件之间的调用依赖关系边;
16.s1-5:文件和组件之间的从属依赖关系边。
17.步骤(s1-2)中的组件包含interface和cell两种类型的文件,interface指的是组件内被其他组件中的文件所调用依赖的文件,cell指的是组件内没有被其他组件中文件所调用依赖的文件;
18.步骤(s1-3)中文件和文件之间的调用依赖关系边指的是两个文件之间存在的调用依赖关系,由文件中实现的源代码所决定,具体的调用依赖关系包括:
19.(d)通过方法调用语句产生的两个文件间的调用依赖关系;
20.(e)通过成员变量调用语句产生的两个文件间的调用依赖关系;
21.(f)通过初始化语句产生的两个文件间的调用依赖关系。
22.步骤(s1-4)中组件和组件之间的调用依赖关系边指的是两个组件之间存在的调用依赖关系,由组件所包含文件的调用依赖关系所决定;
23.步骤(s1-5)中文件和组件之间的从属依赖关系边指的是文件和组件之间存在的从属依赖关系,由文件存放的位置所决定。
24.优选地,利用异味检测算法识别软件中的异味组件,具体异味检测算法有:
25.s2-1:枢纽型依赖异味检测算法,检测方法如下:
26.(1)计算每一个组件的adn和edn,其中adn指的是其他组件调用依赖当前组件而形成的调用依赖关系数量总和,edn指的是当前组件调用依赖其他组件而形成的调用依赖关系数量总和;
27.(2)计算所有adn的中位数mid
adn
和所有edn的中位数mid
edn

28.(3)组件ci存在枢纽型依赖架构异味当且仅当:
[0029][0030]
其中,表示组件ci的传入调用依赖数;表示组件ci的传出调用依赖数。
[0031]
s2-2:不稳定依赖异味检测算法,检测方法如下:
[0032]
(1)计算每个组件的i指标,组件ci的i指标的定义如下:
[0033][0034]
其中,指的是组件ci的传出调用依赖数;指的是组件ci的传入调用依赖数;
[0035]
(2)计算组件ci的不稳定依赖数组件ci调用依赖组件cj且组件ci的i指标大于组件cj,则该调用依赖称为不稳定依赖;
[0036]
(3)组件ci存在不稳定依赖架构异味当且仅当:
[0037][0038]
s2-3:环依赖异味检测算法,检测方法如下:对于任意一条由组件ci到组件cj的调用依赖路径,若同时存在一条由组件cj到组件ci的调用依赖路径,则此二条路径上的所有组
件形成环依赖异味。
[0039]
优选地,利用遗传算法生成重构方案的方法,具体包括如下步骤:
[0040]
s3-1:初始化种p(t),设置进化代数计数器t

0、设置最大进化代数2000、随机生成100个个体作为初始种;
[0041]
s3-2:使用二元锦标赛选择算子从种p(t)中选出2个体作为父本个体;
[0042]
s3-3:使用单点交叉算子对选出的2个父本个体进行交叉操作生成一个个体;
[0043]
s3-4:使用单点变异算子对生成的一个个体进行变异操作生成一个新的个体,反复迭代s3-2、s3-3、s4-4三个步骤100次,生成由100个个体组成的子代种;
[0044]
s3-5:使用优化目标函数从子代种和p(t)中选出100个表现最优的个体组成种p(t+1),并设置进化代数计数器t

t+1;
[0045]
s3-6:若t《2000,则返回s3-2;若t≥2000,则返回最后一代搜索出的种作为搜索出的重构方案;
[0046]
步骤(s3-1)中的个体是遗传算法中数据流转的载体。可通过对种中的个体进行优化目标函数计算、排序、选择、交叉和变异操作,从而搜索出近似最优的重构方案。个体包括的元素有:
[0047]
(a)基因型由一组移动文件操作字符串组成的序列组成。移动文件操作字符串的格式为“movefile,sourcecomponent,sourcefile,targetcomponent”,表示将源组件sourcecomponent中的文件sourcefile移动到目标组件targetcomponent中。其中移动文件的生成规则为:
[0048]
·
可以生成将异味组件中的文件移动到与该文件有传入和传出调用依赖的文件所位于的组件中的操作;
[0049]
·
若某文件调用依赖异味组件中的文件,则可以生成将其移动到异味组件中的操作;
[0050]
·
若某文件被异味组件中的文件调用依赖,则可以生成将其移动到异味组件中的操作。(b)表现型是对初始软件依赖关系网络应用基因型中的重构操作序列后的软件依赖关系网络;
[0051]
步骤(s3-2)中的二元锦标赛选择算子每次从种中有放回地随机抽取出两个个体,然后选择其中表现最好的个体作为父本个体。该过程在每次迭代中均重复两次,即每次从种中选出两个个体作为父本个体;
[0052]
步骤(s3-3)中的单点交叉算子每次对所选定的两个父本个体的基因型分别进行切割,然后随机选取一个父本个体的上部分基因型和另一个父本个体的下部分基因型进行合并从而产生一个新的个体;
[0053]
步骤(s3-4)中的单点变异算子每次从个体基因型中随机选取一个基因,然后随机生成一个新的基因对其进行替换,从而生成一个新的个体;
[0054]
步骤(s3-5)中的优化目标函数,具体包括如下:
[0055]
(a)异味消除率scr指的是软件系统中异味消除的数量与初始异味数量的比值,scr的定义如下:
[0056]
[0057]
其中,initialnumofsmells指的是软件系统重构前的异味数量。numofsmellsafterrefactoring指的是软件系统重构后的异味数量。
[0058]
(b)耦合降低率crr指的是软件系统中耦合指标coupling降低的数值与初始耦合指标数值的比值,coupling的定义如下:
[0059][0060]
其中,numofcdr(ci)作用是计算组件ci的调用依赖关系数量。根据coupling,crr的定义如下:
[0061][0062]
其中,initialcoupling指的是软件系统重构前的耦合指标数值。couplingafterrefactoring指的软件系统重构后的耦合指标数值。
[0063]
(c)内聚提升率clr指的是软件系统内聚指标cohesion提升的数值与初始内聚指标数值的比值。cohesion指标的计算公式包含组件接口数据内聚度cidc和组件接口使用内聚度ciuc:
[0064]
·
软件系统中一个组件cj对应的cidc的定义如下:
[0065][0066]
其中,指的是组件cj中所有的接口集合。作用是计算接口集合的调用依赖文件交集的个数。作用是计算接口集合的调用依赖文件并集的个数;
[0067]
·
软件系统中一个组件cj对应的ciuc的定义如下:
[0068][0069]
其中,client为组件cj的所有调用者集合。invoke(clienti,cj)作用是计算调用者clienti调用组件cj中接口的数量,若组件cj中接口个数大于1,则调用者clienti调用组件cj的接口数应该减1。numofclient(client)作用是计算client集合中组件的数量。numofinterface(cj)作用是计算组件cj中接口的数量;
[0070]
·
软件系统的cohesion的定义如下:
[0071][0072]
其中,component指的是软件系统中所有的组件集合。cidci指的是组件ci的接口数据内聚度。ciuci指的是组件ci的接口数据使用度。
[0073]
·
内聚提升率clr的定义如下:
[0074]
[0075]
其中,cohesionafterrefactoring指的是软件系统重构后的软件内聚度数值。initialcohesion指的是软件系统重构前的软件内聚度数值。
[0076]
本发明还提供了一种利用遗传算法改进软件模块质量的系统,所述系统包括数据集管理模块、异味检测模块和重构方案生成模块:
[0077]
所述数据集管理模块用于管理多个软件系统数据,这些数据将用于后续异味检测和重构方案生成;
[0078]
所述异味检测模块用于对选择的数据集进行异味检测,在异味检测完成之后可以查看异味总览信息和每个异味的具体信息;
[0079]
所述重构方案生成模块用于对选择的数据集生成重构方案,在重构方案生成完成之后用户可以查看重构方案信息以及应用重构方案后的效果。
[0080]
优选地,所述的数据集管理模块的内容包括:
[0081]
增加用于异味检测和重构方案生成的软件系统源代码数据集;删除已添加的数据集。
[0082]
优选地,所述的异味检测模块的内容包括:
[0083]
选择用于异味检测的数据集;查看检测出的详细异味信息。
[0084]
优选地,所述的重构方案生成模块的内容包括:
[0085]
选择用于重构方案生成的数据集;查看生成的重构方案的详细信息。
附图说明
[0086]
图1是本发明实施例一中的一种利用遗传算法改进软件模块质量的方法的流程图。
[0087]
图2是本发明实施例一中的通过分析源代码生成软件依赖关系网络的完整流程图。
[0088]
图3是本发明实施例一中的由源代码生成的软件依赖关系网络,经过图结构可视化的结果。
[0089]
图4是本发明实施例二中的基于识别出的软件依赖关系网络进行异味检测的完整流程图;
[0090]
图5是本发明实施例三中的基于识别出的软件依赖关系网络和异味组件,利用遗传算法生成重构方案的方法的完整流程图;
[0091]
图6是本发明实施例三中的利用遗传算法生成重构方法中个体信息;
[0092]
图7是本发明实施例三中的单点交叉方法流程图;
[0093]
图8是本发明实施例三中的单点变异方法流程图;
[0094]
图9是本发明实施例四中的利用遗传算法改进软件模块质量的系统的结构示意图。
具体实施方式
[0095]
下面结合附图和实施例对本发明作进一步的详细说明。
[0096]
本文使用的术语“重构”是指在不改变软件外部行为的前提下对软件结构进行调整的活动;
[0097]
本文使用的术语“文件”是指java软件中的一个源代码文件;
[0098]
本文使用的术语“组件”是指java软件中一个存放源代码文件的目录;
[0099]
本文使用的术语“异味”是指软件系统中存在的结构性问题;
[0100]
本文使用的术语“架构异味”是指软件系统中频繁出现并且可能会对质量属性产生负面影响的设计决策;
[0101]
本文使用的术语“枢纽型依赖”是指一个组件与其他大量组件存在传入和传出调用依赖关系;
[0102]
本文使用的术语“不稳定依赖”是指一个组件依赖于比它自身更不稳定的组件;
[0103]
本文使用的术语“环依赖”是指多个组件之间的调用依赖关系形成了环结构;
[0104]
本文使用的术语“个体”是指将对解决方案进行的一种抽象表示,即将解决方案进行编码并保存到适当的数据结构中。个体由两个元素组成:基因型,即对解决方案进行编码所使用的数据结构;表现型,即应用解决方案后的表现形式;
[0105]
本文使用的术语“二元锦标赛选择算子”是指每次从种中有放回地随机抽取出两个个体,然后选择其中表现最好的个体作为父本个体。该过程在每次迭代中均重复两次,即每次从种中选出两个个体作为父本个体;
[0106]
本文使用的术语“单点交叉算子”是指每次对所选定的两个父本个体的基因型分别进行切割,然后随机选取一个父本个体的上部分基因型和另一个父本个体的下部分基因型进行合并从而产生一个新的个体。
[0107]
本文使用的术语“单点变异算子”是指每次从个体基因型中随机选取一个基因,然后随机生成一个新的基因对其进行替换,从而生成一个新的个体。
[0108]
实施例:本发明提供一种利用遗传算法改进软件模块质量的方法,包括以下步骤:
[0109]
s1:分析软件源代码的语法树,识别文件和组件间的软件依赖关系网络;
[0110]
s2:利用异味检测算法识别软件依赖关系网络中存在的异味组件;
[0111]
s3:根据识别出的软件依赖关系网络以及异味组件,利用遗传算法生成重构方案,以供开发人员选择重构方案对软件进行重构。
[0112]
进行步骤s1前对软件中的源代码文件进行预处理工作,将软件中的每一个代码文件编译成字节码文件,作为步骤s1的输入;
[0113]
所述的软件依赖关系网络部分,包括的元素有:
[0114]
s1-1:文件节点fi,表示源代码文件;
[0115]
s1-2:组件节点cj,表示用于存放源代码文件的目录;
[0116]
s1-3:文件和文件之间的调用依赖关系边;
[0117]
s1-4:组件和组件之间的调用依赖关系边;
[0118]
s1-5:文件和组件之间的从属依赖关系边。
[0119]
步骤(s1-2)中的组件包含interface和cell两种类型的文件,interface指的是组件内被其他组件中的文件所调用依赖的文件,cell指的是组件内没有被其他组件中文件所调用依赖的文件;
[0120]
步骤(s1-3)中文件和文件之间的调用依赖关系边指的是两个文件之间存在的调用依赖关系,由文件中实现的源代码所决定,具体的调用依赖关系包括:
[0121]
(g)通过方法调用语句产生的两个文件间的调用依赖关系;
[0122]
(h)通过成员变量调用语句产生的两个文件间的调用依赖关系;
[0123]
(i)通过初始化语句产生的两个文件间的调用依赖关系。
[0124]
步骤(s1-4)中组件和组件之间的调用依赖关系边指的是两个组件之间存在的调用依赖关系,由组件所包含文件的调用依赖关系所决定;
[0125]
步骤(s1-5)中文件和组件之间的从属依赖关系边指的是文件和组件之间存在的从属依赖关系,由文件存放的位置所决定。
[0126]
利用异味检测算法识别软件中的异味组件,具体异味检测算法有:
[0127]
s2-1:枢纽型依赖异味检测算法,检测方法如下:
[0128]
(1)计算每一个组件的adn和edn,其中adn指的是其他组件调用依赖当前组件而形成的调用依赖关系数量总和,edn指的是当前组件调用依赖其他组件而形成的调用依赖关系数量总和;
[0129]
(2)计算所有adn的中位数mid
adn
和所有edn的中位数mid
edn

[0130]
(3)组件ci存在枢纽型依赖架构异味当且仅当:
[0131][0132]
其中,表示组件ci的传入调用依赖数;表示组件ci的传出调用依赖数。
[0133]
s2-2:不稳定依赖异味检测算法,检测方法如下:
[0134]
(1)计算每个组件的i指标,组件ci的i指标的定义如下:
[0135][0136]
其中,指的是组件ci的传出调用依赖数;指的是组件ci的传入调用依赖数;
[0137]
(2)计算组件ci的不稳定依赖数组件ci调用依赖组件cj且组件ci的i指标大于组件cj,则该调用依赖称为不稳定依赖;
[0138]
(3)组件ci存在不稳定依赖架构异味当且仅当:
[0139][0140]
s2-3:环依赖异味检测算法,检测方法如下:对于任意一条由组件ci到组件cj的调用依赖路径,若同时存在一条由组件cj到组件ci的调用依赖路径,则此二条路径上的所有组件形成环依赖异味。
[0141]
利用遗传算法生成重构方案的方法,具体包括如下步骤:
[0142]
s3-1:初始化种p(t),设置进化代数计数器t

0、设置最大进化代数2000、随机生成100个个体作为初始种;
[0143]
s3-2:使用二元锦标赛选择算子从种p(t)中选出2个体作为父本个体;
[0144]
s3-3:使用单点交叉算子对选出的2个父本个体进行交叉操作生成一个个体;
[0145]
s3-4:使用单点变异算子对生成的一个个体进行变异操作生成一个新的个体,反复迭代s3-2、s3-3、s4-4三个步骤100次,生成由100个个体组成的子代种;
[0146]
s3-5:使用优化目标函数从子代种和p(t)中选出100个表现最优的个体组成种
p(t+1),并设置进化代数计数器t

t+1;
[0147]
s3-6:若t《2000,则返回s3-2;若t≥2000,则返回最后一代搜索出的种作为搜索出的重构方案;
[0148]
步骤(s3-1)中的个体是遗传算法中数据流转的载体。可通过对种中的个体进行优化目标函数计算、排序、选择、交叉和变异操作,从而搜索出近似最优的重构方案。个体包括的元素有:
[0149]
(a)基因型由一组移动文件操作字符串组成的序列组成。移动文件操作字符串的格式为“movefile,sourcecomponent,sourcefile,targetcomponent”,表示将源组件sourcecomponent中的文件sourcefile移动到目标组件targetcomponent中。其中移动文件的生成规则为:
[0150]
·
可以生成将异味组件中的文件移动到与该文件有传入和传出调用依赖的文件所位于的组件中的操作;
[0151]
·
若某文件调用依赖异味组件中的文件,则可以生成将其移动到异味组件中的操作;
[0152]
·
若某文件被异味组件中的文件调用依赖,则可以生成将其移动到异味组件中的操作。(b)表现型是对初始软件依赖关系网络应用基因型中的重构操作序列后的软件依赖关系网络;
[0153]
步骤(s3-2)中的二元锦标赛选择算子每次从种中有放回地随机抽取出两个个体,然后选择其中表现最好的个体作为父本个体。该过程在每次迭代中均重复两次,即每次从种中选出两个个体作为父本个体;
[0154]
步骤(s3-3)中的单点交叉算子每次对所选定的两个父本个体的基因型分别进行切割,然后随机选取一个父本个体的上部分基因型和另一个父本个体的下部分基因型进行合并从而产生一个新的个体;
[0155]
步骤(s3-4)中的单点变异算子每次从个体基因型中随机选取一个基因,然后随机生成一个新的基因对其进行替换,从而生成一个新的个体;
[0156]
步骤(s3-5)中的优化目标函数,具体包括如下:
[0157]
(a)异味消除率scr指的是软件系统中异味消除的数量与初始异味数量的比值,scr的定义如下:
[0158][0159]
其中,initialnumofsmells指的是软件系统重构前的异味数量。numofsmellsafterrefactoring指的是软件系统重构后的异味数量。
[0160]
(b)耦合降低率crr指的是软件系统中耦合指标coupling降低的数值与初始耦合指标数值的比值,coupling的定义如下:
[0161][0162]
其中,numofcdr(ci)作用是计算组件ci的调用依赖关系数量。根据coupling,crr的定义如下:
[0163][0164]
其中,initialcoupling指的是软件系统重构前的耦合指标数值。couplingafterrefactoring指的软件系统重构后的耦合指标数值。
[0165]
(c)内聚提升率clr指的是软件系统内聚指标cohesion提升的数值与初始内聚指标数值的比值。cohesion指标的计算公式包含组件接口数据内聚度cidc和组件接口使用内聚度ciuc:
[0166]
·
软件系统中一个组件cj对应的cidc的定义如下:
[0167][0168]
其中,指的是组件cj中所有的接口集合。作用是计算接口集合的调用依赖文件交集的个数。作用是计算接口集合的调用依赖文件并集的个数;
[0169]
·
软件系统中一个组件cj对应的ciuc的定义如下:
[0170][0171]
其中,client为组件cj的所有调用者集合。invoke(clienti,cj)作用是计算调用者clienti调用组件cj中接口的数量,若组件cj中接口个数大于1,则调用者clienti调用组件cj的接口数应该减1。numofclient(client)作用是计算client集合中组件的数量。numofinterface(cj)作用是计算组件cj中接口的数量;
[0172]
·
软件系统的cohesion的定义如下:
[0173][0174]
其中,component指的是软件系统中所有的组件集合。cidci指的是组件ci的接口数据内聚度。ciuci指的是组件ci的接口数据使用度。
[0175]
·
内聚提升率clr的定义如下:
[0176][0177]
其中,cohesionafterrefactoring指的是软件系统重构后的软件内聚度数值。initialcohesion指的是软件系统重构前的软件内聚度数值。
[0178]
本发明还提供了一种利用遗传算法改进软件模块质量的系统,所述系统包括数据集管理模块、异味检测模块和重构方案生成模块:
[0179]
所述数据集管理模块用于管理多个软件系统数据,这些数据将用于后续异味检测和重构方案生成;
[0180]
所述异味检测模块用于对选择的数据集进行异味检测,在异味检测完成之后可以查看异味总览信息和每个异味的具体信息;
[0181]
所述重构方案生成模块用于对选择的数据集生成重构方案,在重构方案生成完成
之后用户可以查看重构方案信息以及应用重构方案后的效果。
[0182]
所述的数据集管理模块的内容包括:
[0183]
增加用于异味检测和重构方案生成的软件系统源代码数据集;删除已添加的数据集。
[0184]
所述的异味检测模块的内容包括:
[0185]
选择用于异味检测的数据集;
[0186]
查看检测出的详细异味信息。
[0187]
所述的重构方案生成模块的内容包括:
[0188]
选择用于重构方案生成的数据集;
[0189]
查看生成的重构方案的详细信息。
[0190]
下面结合具体的实施例对本发明的技术方案进行详细说明。
[0191]
实施例2:
[0192]
参阅图1所述,本发明实施例提出了利用遗传算法改进软件模块质量的方法,该方法将软件源代码转换为软件依赖关系网络,并根据软件依赖关系网络进行异味检测和重构方案生成,具体包括如下步骤:
[0193]
步骤110,如图2所示,通过分析软件代码的语法树,识别文件和组件间的软件依赖关系网络,识别出的软件依赖关系网络可以用于异味检测和重构方案生成,具体包括以下步骤:
[0194]
步骤111,预处理工作的目的是将原始的代码文件处理成机器可识别的字节码文件。预处理的工作包括但不局限于将所有软件中所有的代码文件编译成字节码文件;
[0195]
步骤112,原代码经过预处理便可以作为软件依赖关系网络的输入,本实施实例通过读取字节码文件来获取源代码文件对应的语法树,根据语法树中的信息生成软件依赖关系网络,生成的软件依赖关系网络结构如图3所示。
[0196]
上述步骤111-112为步骤110的具体阐述。
[0197]
实施例3:
[0198]
参阅图4所述,本发明实施例提出的利用遗传算法改进软件模块质量的方法可以对识别出的软件依赖关系网络进行异味检测,识别出的异味组件可以用于重构方案生成,具体包括如下步骤:
[0199]
步骤120,如图4所示,对软件依赖关系网络进行异味检测,具体包括以下步骤:
[0200]
步骤121,基于软件依赖关系网络,执行枢纽型依赖异味检测算法,输出结果为所有存在枢纽型依赖异味的组件集合;
[0201]
步骤122,基于软件依赖关系网络,执行不稳定依赖异味检测算法,输出结果为所有存在不稳定依赖异味的组件集合;
[0202]
步骤123,基于软件依赖关系网络,执行环依赖异味检测算法,输出结果为所有存在环依赖异味的组件集合;
[0203]
上述步骤121-123为步骤120的具体阐述。
[0204]
实施例4:
[0205]
参阅图5所述本发明实施例提出的利用遗传算法改进软件模块质量的方法可以根据识别出的软件依赖关系网络和异味组成生成重构方案,具体包括如下步骤:
[0206]
步骤130,如图5所示,利用遗传算法生成重构方案的方法,具体包括如下步骤:
[0207]
步骤131,根据识别出的软件依赖关系网络和异味组件,生成由100个个体组成的种p(t),设置t=0,个体的结构如图6所示,每个个体包括基因型和表现型两个元素。其中基因型为一组移动文件操作字符串序列,表现型为应用基因型对应的移动文件操作之后的软件依赖关系网络。
[0208]
步骤132,对种p(t)使用二元锦标赛选择方法,从中选出两个个体作为父本;
[0209]
步骤133,对选出的两个个体使用单点交叉方法生成一个子代个体。单点交叉方法流程如图7所示,该方法对选定的两个父本个体的基因型分别进行切割,然后随机选取一个父本个体的上部分基因型和另一个父本个体的下部分基因型进行合并从而产生一个新的个体。
[0210]
步骤134,对生成的一个子代个体使用单点编译方法生成一个新的子代个体。单点变异方法流程如图8所示,该方法从个体基因型中随机选取一个基因,然后随机生成一个新的基因对其进行替换,从而生成一个新的个体。
[0211]
步骤135,使用优化目标函数从子代种和p(t)中选出100个表现最优的个体组成种p(t+1),并设置进化代数计数器t

t+1;
[0212]
步骤136,若t《2000,则返回步骤132;若t≥2000,则返回最后一代搜索出的种作为生成的重构方案;
[0213]
上述步骤131-136为步骤130的具体阐述。
[0214]
实施例5:
[0215]
图9为实施例四提供的一种利用遗传算法改进软件模块质量的系统的结构示意图,所述系统包括数据集管理模块141、异味检测模块142和重构方案生成模块143。
[0216]
其中,数据集管理模块141用于管理软件系统源代码数据,可以将源代码数据转换为系统可以处理的数据,它包含:
[0217]
源码解析单元,负责读取预处理后的java软件源代码文件,并将其转换为软件依赖关系网;
[0218]
数据管理单元,用于管理软件依赖关系网,以及添加和删除数据集信息;
[0219]
异味检测模块142用于对识别出的软件依赖关系网络进行异味检测,输出异味组件集合,它包括:
[0220]
枢纽型依赖异味检测单元,通过读取软件依赖关系网络,对其执行枢纽型依赖异味检测算法,输出枢纽型依赖异味集合;
[0221]
不稳定依赖异味检测单元,通过读取软件依赖关系网络,对其执行不稳定依赖异味检测算法,输出不稳定依赖异味集合;
[0222]
环依赖异味检测单元,通过读取软件依赖关系网络,对其执行环依赖异味检测算法,输出环依赖异味集合;
[0223]
重构方案生成模块143用于对识别出的软件依赖关系网络和异味组件使用遗传算法生成重构方案。
[0224]
注意,上述仅为本发明的较佳实施例及所用技术原理。本领域技术人员会理解,本发明不限于所述的特定实施例,对本领域技术人员来说可以进行各种灵活的变化,重新调整而不会脱离本发明的保护范围。因此,本发明不仅仅限于以上实施例,在不脱离本发明构
思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

技术特征:


1.一种利用遗传算法改进软件模块质量的方法,其特征在于,包括以下步骤:s1:分析软件源代码的语法树,识别文件和组件间的软件依赖关系网络;s2:利用异味检测算法识别软件依赖关系网络中存在的异味组件;s3:根据识别出的软件依赖关系网络以及异味组件,利用遗传算法生成重构方案,以供开发人员选择重构方案对软件进行重构。2.根据权利要求1所述的利用遗传算法改进软件模块质量的方法,其特征在于,进行步骤s1前对软件中的源代码文件进行预处理工作,将软件中的每一个代码文件编译成字节码文件,作为步骤s1的输入。3.根据权利要求1所述的利用遗传算法改进软件模块质量的方法,其特征在于,步骤s1中,所述软件依赖关系网络部分,包括的元素有:s1-1:文件节点f
i
,表示源代码文件;s1-2:组件节点c
j
,表示用于存放源代码文件的目录;s1-3:文件和文件之间的调用依赖关系边;s1-4:组件和组件之间的调用依赖关系边;s1-5:文件和组件之间的从属依赖关系边;步骤s1-2中的组件包含interface和cell两种类型的文件,interface指的是组件内被其他组件中的文件所调用依赖的文件,cell指的是组件内没有被其他组件中文件所调用依赖的文件;步骤s1-3中文件和文件之间的调用依赖关系边指的是两个文件之间存在的调用依赖关系,由文件中实现的源代码所决定,具体的调用依赖关系包括:(a)通过方法调用语句产生的两个文件间的调用依赖关系;(b)通过成员变量调用语句产生的两个文件间的调用依赖关系;(c)通过初始化语句产生的两个文件间的调用依赖关系;步骤s1-4中组件和组件之间的调用依赖关系边指的是两个组件之间存在的调用依赖关系,由组件所包含文件的调用依赖关系所决定;步骤s1-5中文件和组件之间的从属依赖关系边指的是文件和组件之间存在的从属依赖关系,由文件存放的位置所决定。4.根据权利要求1所述的利用遗传算法改进软件模块质量的方法,其特征在于,步骤s2中,利用异味检测算法识别软件中的异味组件,具体异味检测算法有:s2-1:枢纽型依赖异味检测算法,检测方法如下:(1)计算每一个组件的adn和edn,其中adn指的是其他组件调用依赖当前组件而形成的调用依赖关系数量总和,edn指的是当前组件调用依赖其他组件而形成的调用依赖关系数量总和;(2)计算所有adn的中位数mid
adn
和所有edn的中位数mid
edn
;(3)组件c
i
存在枢纽型依赖架构异味当且仅当:其中,表示组件c
i
的传入调用依赖数;表示组件c
i
的传出调用依赖数;
s2-2:不稳定依赖异味检测算法,检测方法如下:(1)计算每个组件的i指标,组件c
i
的i指标的定义如下:其中,指的是组件c
i
的传出调用依赖数;指的是组件c
i
的传入调用依赖数;(2)计算组件c
i
的不稳定依赖数组件c
i
调用依赖组件c
j
且组件c
i
的i指标大于组件c
j
,则该调用依赖称为不稳定依赖;(3)组件c
i
存在不稳定依赖架构异味当且仅当:s2-3:环依赖异味检测算法,检测方法如下:对于任意一条由组件c
i
到组件c
j
的调用依赖路径,若同时存在一条由组件c
j
到组件c
i
的调用依赖路径,则此二条路径上的所有组件形成环依赖异味。5.根据权利要求1所述的利用遗传算法改进软件模块质量的方法,其特征在于,步骤s3中利用遗传算法生成重构方案的方法,具体包括如下步骤:s3-1:初始化种p(t),设置进化代数计数器t

0、设置最大进化代数2000、随机生成100个个体作为初始种;s3-2:使用二元锦标赛选择算子从种p(t)中选出2个体作为父本个体;s3-3:使用单点交叉算子对选出的2个父本个体进行交叉操作生成一个个体;s3-4:使用单点变异算子对生成的一个个体进行变异操作生成一个新的个体,反复迭代s3-2、s3-3、s4-4三个步骤100次,生成由100个个体组成的子代种;s3-5:使用优化目标函数从子代种和p(t)中选出100个表现最优的个体组成种p(t+1),并设置进化代数计数器t

t+1;s3-6:若t<2000,则返回s3-2;若t≥2000,则返回最后一代搜索出的种作为搜索出的重构方案;步骤s3-1中的个体是遗传算法中数据流转的载体,可通过对种中的个体进行优化目标函数计算、排序、选择、交叉和变异操作,从而搜索出近似最优的重构方案,个体包括的元素有:(a)基因型由一组移动文件操作字符串组成的序列组成;移动文件操作字符串的格式为“movefile,sourcecomponent,sourcefile,targetcomponent”,表示将源组件sourcecomponent中的文件sourcefile移动到目标组件targetcomponent中,其中移动文件的生成规则为:
·
可以生成将异味组件中的文件移动到与该文件有传入和传出调用依赖的文件所位于的组件中的操作;
·
若某文件调用依赖异味组件中的文件,则可以生成将其移动到异味组件中的操作;
·
若某文件被异味组件中的文件调用依赖,则可以生成将其移动到异味组件中的操作,(b)表现型是对初始软件依赖关系网络应用基因型中的重构操作序列后的软件依赖关系网络;
步骤s3-2中的二元锦标赛选择算子每次从种中有放回地随机抽取出两个个体,然后选择其中表现最好的个体作为父本个体,该过程在每次迭代中均重复两次,即每次从种中选出两个个体作为父本个体;步骤s3-3中的单点交叉算子每次对所选定的两个父本个体的基因型分别进行切割,然后随机选取一个父本个体的上部分基因型和另一个父本个体的下部分基因型进行合并从而产生一个新的个体;步骤(s3-4)中的单点变异算子每次从个体基因型中随机选取一个基因,然后随机生成一个新的基因对其进行替换,从而生成一个新的个体;步骤(s3-5)中的优化目标函数,具体包括如下:(a)异味消除率scr指的是软件系统中异味消除的数量与初始异味数量的比值,scr的定义如下:其中,initialnumofsmells指的是软件系统重构前的异味数量;numofsmellsafterrefactoring指的是软件系统重构后的异味数量;(b)耦合降低率crr指的是软件系统中耦合指标coupling降低的数值与初始耦合指标数值的比值,coupling的定义如下:其中,numofcdr(c
i
)作用是计算组件c
i
的调用依赖关系数量;根据coupling,crr的定义如下:其中,initialcoupling指的是软件系统重构前的耦合指标数值;couplingafterrefactoring指的软件系统重构后的耦合指标数值;(c)内聚提升率clr指的是软件系统内聚指标cohesion提升的数值与初始内聚指标数值的比值,cohesion指标的计算公式包含组件接口数据内聚度cidc和组件接口使用内聚度ciuc:
·
软件系统中一个组件c
j
对应的cidc的定义如下:其中,指的是组件c
j
中所有的接口集合,作用是计算接口集合的调用依赖文件交集的个数,作用是计算接口集合的调用依赖文件并集的个数;
·
软件系统中一个组件c
j
对应的ciuc的定义如下:
其中,client为组件c
j
的所有调用者集合,invoke(client
i
,c
j
)作用是计算调用者client
i
调用组件c
j
中接口的数量,若组件c
j
中接口个数大于1,则调用者client
i
调用组件c
j
的接口数应该减1,numofclient(client)作用是计算client集合中组件的数量,numofinterface(c
j
)作用是计算组件c
j
中接口的数量;
·
软件系统的cohesion的定义如下:其中,component指的是软件系统中所有的组件集合,cidc
i
指的是组件c
i
的接口数据内聚度,ciuc
i
指的是组件c
i
的接口数据使用度,
·
内聚提升率clr的定义如下:其中,cohesionafterrefactoring指的是软件系统重构后的软件内聚度数值;initialcohesion指的是软件系统重构前的软件内聚度数值。6.一种利用遗传算法改进软件模块质量的系统,其特征在于,所述系统包括数据集管理模块、异味检测模块和重构方案生成模块,所述数据集管理模块用于管理多个软件系统数据,这些数据将用于后续异味检测和重构方案生成;所述异味检测模块用于对选择的数据集进行异味检测,在异味检测完成之后可以查看异味总览信息和每个异味的具体信息;所述重构方案生成模块用于对选择的数据集生成重构方案,在重构方案生成完成之后用户可以查看重构方案信息以及应用重构方案后的效果。7.根据权利要求6所述的利用遗传算法改进软件模块质量的系统,其特征在于,所述数据集管理模块的内容包括:增加用于异味检测和重构方案生成的软件系统源代码数据集;删除已添加的数据集。8.根据权利要求6所述的利用遗传算法改进软件模块质量的系统,其特征在于,所述的异味检测模块的内容包括:选择用于异味检测的数据集;查看检测出的详细异味信息。9.根据权利要求6所述的利用遗传算法改进软件模块质量的系统,其特征在于,所述的重构方案生成模块的内容包括:选择用于重构方案生成的数据集;查看生成的重构方案的详细信息。

技术总结


本发明属于软件重构技术领域,具体涉及一种利用遗传算法改进软件模块质量的方法和系统,包括:分析软件源代码的语法树,识别文件和组件间的软件依赖关系网络;利用异味检测算法识别软件依赖关系网络中存在的异味组件;根据识别出的软件依赖关系网络以及异味组件,利用遗传算法生成重构方案,以供开发人员选择重构方案对软件进行重构。本发明实现了自动化地识别软件中存在的异味并快速地生成重构方案,以帮助架构师对软件进行重构,从而提高软件的可维护性。维护性。维护性。


技术研发人员:

张贺 王家瑞 钟陈星 李杉杉 周鑫 荣国平 邵栋

受保护的技术使用者:

南京大学

技术研发日:

2022.09.24

技术公布日:

2022/11/22

本文发布于:2024-09-20 13:27:00,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/5502.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:组件   异味   文件   重构
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议