软件重构是一个软件维护行动改善软件内部质量而不改变其外部行为。在维修过程中,结构重构是由remodularizing源代码。软件集群是一个模块化技术remodularize构件源代码旨在提高可读性和可重用性。由于集群的NP困难问题,进化的方法,如遗传算法被用来解决这个问题。结构重构的文学,不存在基于搜索的算法,采用分层模块化的方法。利用全球和本地搜索策略,在这篇文章中,一个新的基于搜索的自顶向下的层次聚类方法,名叫TDHC,提出可用于模块化系统。算法的输出是一个树的每个节点是所有工件的工件由子树和候选人是一个软件模块(即。集群)。这棵树可以帮助软件维护人员有更好的视觉源代码结构决定适当的组成分(即工件的旨在创建模块。、文件、包和组件)。实验结果七个文件夹的Mozilla Firefox具有不同功能和五个其他的软件系统显示TDHC生产模块化接近人类专家的分解(即。,目录结构)比其他现有的算法。该算法将帮助软件维护人员更好的remodularization源代码。 The source codes and dataset related to this paper can be accessed at
软件维护是修改软件产品发布后的过程中减少错误,提高性能,或改善设计。未来软件开发和软件维护任务是重要的消费大约90%的总成本(
在软件维护,一些变化包括添加、删除或修改代码导致代码块的增长和未来困难的代码的可理解性。代码味道(或坏代码味道)是源代码的一部分不会引起错误的外部行为和没有内部行为的一个重要的问题在这个时刻,但是可能会导致问题在未来的发展过程中
福勒等人报道一些可能的代码味道在他们的书中(
重构技术分为两个主要概念和结构组。例如,重命名方法重构是一个概念重构场景,改变方法的名字更好的解释的责任。一些结构重构场景方法或函数组成。例如,长时间的代码块通常有多个责任或复制块应该重构。其他一些结构重构场景来改善代码块的功能。作为一个例子,移动方法重构(MMR)是一个重构场景的行为被定义为从一个类的方法转移到另一个类最关系的方法。方法之间的关系可以结构关系或语义关系。也有一些组合重构被定义为一个原始序列的重构,反映复杂的转换。
说明结构重构任务,图
一个模块化的一个小软件系统。
一些维护操作图
Remodularization图
手动分析源代码,重构是一个昂贵和耗时的过程。因此,许多研究已经完成自动重构。一种方法结构重构是remodularization,如图
集群的一个例子(
当前聚类策略获取适当的模块化是基于两个主要层次或无技术。在分层方法,构造树的关系从叶到根的工件。这些技术给开发人员一个层次视图决策树的数量和适当的割点构建模块。大多数呈现分层软件集群是烧结的方法(自底向上)。在这种算法中,每个构件开始在自己的集群;根据一定的标准,例如,Jaccard,所有集群之间的距离计算,和对集群接近最高的合并作为一个移动的层次结构(
由于锯齿形的存在,来识别模块,必须使整个树。
不存在明确的标准来决定聚类过程应该停止的地方。
武断的决定是在层次聚类方法的一个主要问题。这些决策产生的影响最终的聚类。当面对任意决定和一个错误的选择,没有扭转的可能性和纠正错误的选择。
这些算法都是贪婪的,因此不能探索问题空间。几位以前的研究
有还无模块化方法基于搜索的方法探索解空间的全局搜索和局部搜索算法。但这些方法不给开发人员一个愿景上层模块之间的关系。
在文献中,由于集群的NP困难问题,基于搜索的方法(如遗传算法)一直被广泛使用
在本文中,我们专注于一个特定的重组问题的背景下,面向对象和程序程序:给定一个ADG构造从现有代码,将它分解成较小的和有意义的高内聚和低耦合的模块。凝聚力被定义为“一个模块的内部内容的程度是相关的”(
本文解决的主要问题是提出一个层次化的remodularization源代码,同时保持准确的距离(人类)专家分解。摘要自上而下分层聚类算法结构重构的源代码构件依赖图(ADG)分支界限法方法。目的是找到合适的组合树和推荐适当的最低水平合并构件作为一个模块。因此,它将开发人员更容易识别不同级别的位置,如文件包,或组件。在该方法中,遗传算法(GA)和邻近搜索算法的目的是在树上的组成构件。该算法评估七个文件夹的Mozilla Firefox和五个其他的开源系统。结果表明,该方法能够提出一个可接受的层次remodularization重构的工件,通过视觉对高层模块开发人员之间的关系。
本文的贡献总结如下:
提出一个新的软件重构方法和自顶向下的层次模块化技术。生成树算法的输出从源代码帮助软件维护人员有更好的视力源代码结构决定适当的组成分的工件(即旨在创建模块。、文件、包和组件)。重要的是要注意,在文学,不存在基于搜索的算法,采用分层模块化的方法。
Prufer树是利用遗传算法的编码序列。是否现有编码方法用于软件模块化建(例如,群
提出了一种新的目标函数评价层次remodularization。
剩下的论文如下:部分
Fowler的书出版后(
Remodularization源代码构件是结构重构的方法。由于大空间为模块化解决方案的空间,许多基于搜索的研究已经完成。在一些算法
最近的研究在多目标搜索方法扩大了。Praditwong et al。
在[
Bavota等人有一些研究重构。在[
米一个letic和马库斯[
拉里说道et al。
K一个rgar remodularization等有研究的多道程序设计语言软件系统。在[
总之,基于搜索算法中描述的三个方面。一个方面是搜索的范围(本地战略和全球战略)。一些算法是基于局部搜索策略,结果可能不是最优解。全球搜索技术总是旨在找到好的解决方案。单目标和多目标搜索算法的另一个分组。在多目标算法,有多个目标函数或指标来指导搜索过程。最后一个方面是使用语义特征和结构特征进行聚类。在语义搜索优化,词法分析或潜在语义分析(或两者)被认为是在搜索进展。在结构特点,两个构件之间的函数调用,继承等被认为是为集群。一些搜索聚类算法如表所示
一些搜索软件聚类算法。
LS:本地搜索;g:全局搜索;所以:单目标;莫:多目标;S:结构;Se:语义。
分层的方法,最初被认为是所有工件的模块化的单位,在一个重复的过程,更多类似的模块合并创建一个新模块。单键,全联,平均连锁算法是最常见的层次聚类算法Maqbool等人适应模块化源代码(
除了搜索和分层方法上面所讨论的,有许多基于和基于模式的方法。穆罕默迪和Izadkhah [
使用层次属性实际上并不是新的remodularization领域已经使用多年,但没有以前的研究使用层次属性remodularization进化方法。由于模块化的NP困难问题,大多数模块化方法利用基于搜索聚类方法和进化算法(
大部分工作remodularization基于集群技术(
我们考虑类和文件是最小的组成单元作为面向对象的构件进行模块化和结构化的软件系统,分别。这些部分组合包等更大的模块或组件的每个模块的成员贡献的其他部分模块的一个责任。因此,重要的是要有适当的上层成分。我们也考虑调用依赖创建两个构件之间的依赖关系,即。边,ADG。一些构件被称为实用工具类的其他工件或文件。因此,他们可以删除完成后开始和解决这些问题的算法。对于每一个人,如果所有调用从一个模块,这个工件也将被添加到模块。但如果是多个模块所使用的,它被认为是一个实用程序。
设计一个算法会,五个特征编码(染色体表示),适应度函数(评价),选择,交叉,变异必须被描述。
遗传算法的染色体是一个参数集表示一个解决问题的办法。染色体遗传算法的目的是找到一个最优或算法的解决方案。这些参数可以是一个二进制字符串或任何其他数据结构。摘要Prufer序列(
PruferSequence←空列表
删除<我nline-formula>
添加<我t一个lic> j我t一个lic>对PruferSequence
度←大小的列表<我t一个lic> P我t一个lic>.size + 2由1
度(<我t一个lic> 我我t一个lic>)←度(<我t一个lic> 我我t一个lic>)+ 1
#<我t一个lic> 现在我们知道节点我在树上程度度[我]我t一个lic>
度(<我t一个lic> 我我t一个lic>)←度(<我t一个lic> 我我t一个lic>]−1
Add (<我t一个lic>
一个我t一个lic>
Add (<我t一个lic> 一个我t一个lic>,<我t一个lic> b我t一个lic>)<我t一个lic> T我t一个lic>
返回<我t一个lic> T我t一个lic>
返回PruferSequence
例如,Prufer序列树图
例子:Prufer序列解码树<我nline-formula>
在拟议的方法中,树是二叉树,和Prufer序列遵循以下规则:
树总是<我nline-formula>
所有的工件都在树的叶子是一个程度。因此,数字1<我nline-formula>
树的根(节点数<我nline-formula>
所有内节点除了根在学位3(连接到他们的父节点和两个孩子节点),在序列中出现两次。
因此,每一个数字序列<我nline-formula>
对应层次模块化树<我nline-formula>
人口中的每个染色体遗传算法应该评估来确定解决方案的质量。在下面,我们提出一个新的质量函数对染色体进行评估。提出质量函数,染色体的适应度计算通过使用模块之间的依赖关系提取相应的树的染色体。让<我nline-formula>
这个关系旨在增加凝聚力模块与其他模块和降低耦合。但耦合是分为两种类型的兄弟姐妹耦合(<我nline-formula>
ch.fitness = 0
树←解码树的染色体ch
tree.root.cf = 1
q.push (tree.root)
父母←q.pop ()
孩子1,孩子2←t.children ()
孩子1.cf←exCF(孩子1、家长)
孩子2.cf←exCF(孩子2、家长)
q.push(子1)
q.push(子2)
ch.fitness←ch.fitness + parent.cf
如果
图
分支定界法应用的一个例子在模块化树(参见算法
这三个操作的GA算法描述如下:
选择:选择下一代的人口GA代,经典的轮盘赌选择算子中使用该算法。
交叉:循环交叉操作(CX) [
残雪的输出是输入的排列。因此,它不破坏规则中提到<我t一个lic> 编码我t一个lic>部分。然而树的结构(节点)之间的关系将被改变。
突变:单交换操作用于突变染色体的两个随机序列中的位置的价值交换。图
TDHC交叉操作的一个例子。
TDHC变异操作的一个例子。
遗传算法是一种全局搜索。改善结果模块化质量的最后一步,我们设计一个爬山局部搜索策略。设计了局部搜索算法试图产生一个邻近的模块化与更好的质量产生的模块化。这个操作直到没有可以找到更好的模块化。我们使用最大提升策略搜索邻近模块化。在这个策略中,所有相邻的模块化生成特定的模块化,然后其中,选择高质量的模块化的邻居当前模块化和替换它。为新的模块化一直持续到没有这个操作可以找到更好的模块化。如何定义一个社区爬山算法是非常重要的。根据问题的类型,必须定义适当的社区。
让<我t一个lic>
米我t一个lic>和<我nline-formula>
一个模块化。
一个邻居模块化图
让<我nline-formula>
在下面,我们计算算法的时间复杂度。让<我nline-formula>
初始化人口,与长度的染色体<我nline-formula>
对染色体,数据被转换成一个树<我nline-formula>
选择与轮盘赌<我nline-formula>
每一对的交叉<我nline-formula>
会重复步骤2 - 4<我nline-formula>
在最后一步中,NAHC算法应用于在邻居寻找更好的解决方案。每个解决方案将有最多<我nline-formula>
根据上面的段落中,总订单<我nline-formula>
在本节中,我们概述了详细的实验装置进行了实证评估提出的聚类算法。
Mozilla Firefox web浏览器,是一个大规模的和开源应用程序开发的Mozilla基金会Mozilla公司和它的子公司。基于开放中心(
所选文件夹的属性。
系统中使用的案例研究。
权威的分解(分解领域专家或真实结构)是用来评估remodularization算法的可靠性(
评估TDHC的有效性,我们回答以下研究问题:
RQ1。提出的聚类方法生产模块化有更好的精度,还记得,F-measure,运气,和MoJoFM现有方法相比呢?
RQ2。TDHC是稳定的算法吗?
RQ3。通过使用TDHC,我们可以给更好的视图层次模块化吗?
为了回答这些研究问题,五个软件系统和Mozilla Firefox的七个文件夹remodularized提出的聚类算法和其他一些可用的聚类算法。
对基于搜索算法参数的设置是必要的。我们获得了实现五所选的集群techniques-ACDC (
交叉和变异率的值影响勘探开发的解决方案空间在进化过程中。添加一个额外的输入工件这个问题将增加两个基因染色体。因此,问题空间就会成倍增长。交叉和变异率是根据人口动态设置覆盖解决方案空间更好。交叉率通常被选中作为一个数量超过0.7,和突变率通常是很低的。在这个研究中,0.7和0.9的数字被选为边界交叉与线性步骤。因为突变步骤与日志,它应该增加不多。表
遗传算法参数。
在[
比较比较模块已经完成的模块解决方案树的叶子的源代码(这是由专家团队开发)使用精度/回忆(
让<我t一个lic>
mno我t一个lic>表示哪一个模块化的移动或连接操作可以转换到另一个地方。提取之间的MoJoFM模块化<我nline-formula>
比较的总体结果TDHC对其他测试算法的精度/召回,F-measure, MoJoFM,我们利用非参数影响大小统计,即悬崖的<我nline-formula>
在不同的标准有不同的结果的算法,并考虑所有标准,决定哪些算法表现良好并不是一件容易的事。在这种情况下,可以利用多准则决策(指标)(
步骤1:<我nline-formula>
步骤2:计算熵值,<我t一个lic>
H我t一个lic>
步骤3:计算每个标准的重要性和重量<我nline-formula>
第四步:计算每个标准的最大和最小向量<我nline-formula>
第五步:计算一个积极的和消极的理想距离现实<我nline-formula>
第六步:计算一个积极的和消极的理想距离算法<我nline-formula>
第七步:计算每个算法的效率<我nline-formula>
第八步:选择最好的算法<我nline-formula>
比较和评估算法、5软件系统与不同的领域和尺寸已经被选中了。同时,七个文件夹有不同的功能已经从Mozilla Firefox中选择应用程序。
RQ1回答研究问题,相比之下,在这篇文章中,九个搜索算法具有不同特点包括单目标、多目标、全局搜索、局部搜索,structured-based方法和基于语义的方法选择。算法选择Bunch-GA, DAGC ECA, MCA, Bunch-SAHC, SGA, GA-SMCP,爆炸品处理,SNDGA。表中描述了这些算法的特点
特征选择算法搜索算法和该算法进行比较。
最好的和平均结果TDHC Firefox的七个文件夹文件夹和五个其他软件系统相比,选择先进的算法具有不同特性的结果在精度方面,记得,F-measure, MoJoFM。报告的细节表
算法比较MoJoFM。
算法比较的精度。
算法比较的回忆。
算法的比较<我t一个lic> F我t一个lic>测量。
在表
从表
具体和直接比较的结果TDHC对其他算法的悬崖,<我nline-formula>
悬崖上的<我nline-formula>
除了上面的实验中,我们使用指标比较测试算法的性能考虑所有标准用于实验。表
多准则决策比较算法。
RQ2回答研究问题,遗传算法是一种随机优化器,每次运行的成果可能不同。通过几个独立的算法运行结果预计将接近对方。因此,回答RQ2,该算法执行30倍为每种情况和分析结果的稳定性<我t一个lic>
t我t一个lic>以及统计技术。应用<我t一个lic>
t我t一个lic>以及,结果分为两组相同的大小,G1和G2,然后从中提取一些描述性和推论统计。根据(
结果在表表示
Mini-Tunis细节。
回答的研究问题RQ3,输出的TDHC Mini-Tunis调查。Mini-Tunis (mtunis)是一种学术操作系统与图20工件编号从1到20
调用依赖图Mini-Tunis基于其设计文档(
树视图。
平的观点。
这种方法的最重要的优势是,它可以执行指定封装水平很好,例如,模块,包,由设计师和组件。
在本节中,澄清TDHC的有效性,算法的限制,这些限制会影响结果进行了讨论。有几个因素可能偏见的有效性研究。这些通常分为两类:内部和外部有效性。外部效度的结果推广到其他的能力比使用案例研究或漠不关心的设置:
算法的输入是一个ADG提取源代码,和内聚和耦合被认为是作为重构的一个指标。烛光等人在
在源代码remodularization搜索技术,推广技术,任何软件结果的有效性是一个重要的威胁。摘要,Mozilla Firefox作为一个大型软件系统选择与五个中型其他开源系统。重要的是要注意,只有一些软件系统超过Mozilla Firefox工件(文件)在一个文件夹。
内部效度关心的是实验治疗影响算法的结果,导致糟糕的结果:
本文精确,记得,F-measure, MoJoFM指标用于比较研究结果与当前模块化算法。这些指标并不一定符合开发人员专家的意见。同时,这些指标并不评估树的结构,并没有人考虑边缘构件之间在计算相似度。
TDHC的预处理步骤,一些工件可能被选中设置除了输入树的生成步骤。最后,重要的是要建议一个适当的位置在模块或聚合作为一个新的模块。
相关的交叉和变异算子中使用遗传算法实现从几个实验Mini-Tunis, JUnit和servlet api软件系统,并应用于其他案例研究。然而,这些数字可能不适合其他软件系统。
在该算法中,标签的内部节点不重要和Prufer序列生成相同的模块化为不同的代码。例如,<我nline-formula>
在软件维护和演化,软件的结构偏离原来的结构。因此,代码重构软件维护过程中是一个重要的角色。在本文中,一种新的聚类算法基础上提出了凝聚力和工件之间的耦合。在这种方法中,自上而下分层的方法被用于metaheuristic算法结合遗传算法和爬山。在该算法中,一个合适的点开始模块化的构件为开发人员建议。算法的输入是ADG,它独立于编程语言的源代码。然而,它给人好感的操作可能取决于源代码的编程语言或输入工件的类型(类、文件、函数或底层模块)。因为该重构方法是自动的,它应该作为助理给开发人员。设计决策往往是更为复杂和微妙的不仅仅是试图最大化凝聚力和最小化耦合模块化过程中。结果,推导分析了模块化的软件开发人员可以接受或者改变它的提议remodularization把工件从一个模块(包)到另一个。 The following is suggested for future works:
越来越多的工件质量的影响提出的最优解的算法。这是因为指数增长的通过增加输入搜索空间的大小。所以重要的是要提高算法的因素。
根据搜索空间的大小在软件源代码,可以提供一种新的预处理方法来减少搜索空间。例如,在软件源代码的重构中,有一个模块化作为当前开发人员建议,和工件在一个模块通常该模块上相互紧密接触,只有些是在与其他模块的关系。因此,他们可以忽略在计算模块之间的关系。
许多研究使用结构化或nonstructured功能重构的源代码,可以使用自顶向下的搜索算法。
其他启发式或metaheuristic代替GA算法可以使用。
使用的数据来支持本研究的发现是可用的
作者宣称没有利益冲突。