利用共同发掘技术实现软件类结构重构的研究
2016-09-26张森森李英梅
张森森 李英梅
摘要 软件系统的质量很大程度上是由其内部结构决定的, 在对软件进行优化时往往会使软件内部结构更加复杂,这样就可能会降低软件的性能,所以软件的结构需要一次次的优化修复。以往存在的方法进行这项操作非常的复杂繁琐,本文的研究主要是通过共同发掘技术,来实现类结构的代码重构。这项技术中采用了群落点以及它们之间的依赖关系来代表软件系统中的方法属性的依赖关系,按照社区检测的规则来获得方法间网络关系的最优化结构,同时也改善了类的内部结构,实现了软件类结构的重构。
关键字:类结构重构;共同发掘;软件
中图分类号:TP391 文献标识码:A 文章编号:
Abstract The quality of the software system is largely determined by its internal structure, while optimizing software tends to make the software internal structure more complex , which may degrade the performance of the software, so the structure of the software needs the optimization of repair.Previous methods for this operation are very complex and and trival, this paper researches mainly how to realize the class structure code refactoring by common mining technology. Community is adopted in the technique points and the dependencies between them are applied to represent the method of attribute dependence of software system, According to the rules of community detection method, the relations between network optimization structure is obtained, meanwhile the internal structure of a class is improved, therefore the refactoring of the software class structure is ultimately implemented.
KEY WORDS: class structure reconstruction;community detection; software
0引言
一般情况下,软件系统的内部结构对其质量与寿命发挥着关键重要的决定性作用。在进行软件设计时,不可能将所有的需求都添加在软件中,后期进行功能扩展时就会必然降低软件的内部结构,所以应该通过软件重构技术来进行修改。软件重构是由Fowler在Ref中初次提出,可以对设计增益提供重大帮助,而在添加新功能、改善代码以及软件升级时都可以进行重构。而且,重构还能降低开发人员阅读代码的难度。综上所述,本文研究探讨的就是类水平上的软件重构。1 类水平上软件重构的理论基础
研究中,主要通过方法之间的引用以及属性的调用,来找到2个类之间的相互关系,从而实现类水平上的重构。操作针对的是开源软件,因此应该在复杂的网络环境中展开和进行。复杂的网络环境是复杂科学的一个分支,最近开始被各类科学引入研究。复杂的网络系统发生简化,实际上就是可以简化成由特定的点与线组成特定的图形,通过分析这些相连的线与点来对软件给出设计阐述。研究复杂的网络环境,发现这些点与线都可以与现实的网络环境建立对应关联,这也成为了复杂网络环境的基本特性。本文的研究方法也是将复杂的网络环境实行简化,把开源中的各个属性都当作一个点,同时将会研究各点之间的相互关系,从而映射转换为线,各个点之间线连接的强弱可通过线上的权值来指示和表征。图1开发了一个简单的例子,用于说明复杂网络环境如何通过点与线来进行表示。
尽管目前存在数目可观的软件重构方法,但是其中的大多数都是复杂、且耗费时间的。本文的重构方法即是有针对性地通过研究类中属性之间以及方法之间的关系来确定软件代码的属性与类重构的框架结构,进而提出公共社区检测算法来实现本文的研究构想。本文研究的简单操作流程如图2所示。
1.1 源代码
设定时,核心操作设定在java代码上,并且将开源的软件代码结构作为主要的研究目标。这样的优点可表述如下:
1)在java代码方面已有众多成果,研究开展时利于对实验结果与已有成果提供对比,从而对本文方法给出全局有效的性能分析。
2)java代码在90年代以后即已发展演进成为具备最佳流行度的代码形式,并且在网站上能够直接下载到一些开源代码用于提升改进与分析。
3)代码在java环境下能够获得迅速发展,而且java代码呈现有清晰的内部结构和元素,例如属性、类、方法、包。这些内部结构与元素之间的依赖性能够利于实现分析与检验。
1.2软件元素的收集
本研究方法的第一步就是对软件元素执行收集。具体就是对软件的元素例如属性、类、方法与包进行提取的过程。在此过程中采用的是已经研发面世的软件工具,这些工具能够对软件系统java代码的源文件中的元素进行分析。由此可获取的主要是2类依赖关系,分别是:属性方法依赖关系和方法之间的依赖关系。
1.3数据处理
软件重构前,还需要将时下的数据处理方法进行区分,这些方法对软件系统具有至关重要的影响与作用。但在其中却会有一些特殊的方法虽有重要作用,但却违背了一些公律规则,需要找到这类的方法(例如一些高内聚与低耦合的方法)并且将其施以进行保留技术策略。所以本研究将只是对那些遵循一般规则的方法实现处理分析。这一步骤在本文中即是数据处理部分,而且与Ref[1]中的分类方法也呈现出高度类似。
通过如上内容分析,本问研究时充分采用的是静态结构与命名约定的方法。可以将一些方法(例如:恒定法,空方法,去除调节法,收集访问器,申明方法,化名方法,制造方法等)视作特殊的方法不进行移动。
1.4软件依赖网络
数据处理后,就应该建立2种依赖关系图:属性方法依赖关系图与方法间的依赖关系图。用这2种关系依赖图为基础来对方法水平上的代码重构进行规范与引导。在此,将对这2种依赖关系图展开如下总结分析。
第一部分,是属性方法依赖关系图(AMN)。在属性方法依赖关系图中,每一个节点代表的是属性与方法,并且每一个属性或者方法均是由唯一的点提供表示。2个点之间的边代表了属性与边之间的设定依赖性。如果方法A与属性B之间具有相互关系,则逻辑抽象可得:对应方法A的点与属性B的点之间就有一条边。这条边的方向也是可以忽略不计的。文中只是考虑是否存在着依赖关系,对于依赖关系存在的倍数可以忽略不计。图3给出了AMN的简单例子,本次研究将AMN的关系描述成:
NetworkAMN=(Nodes,Edges)
其中,NetworkAMN代表的是无向属性依赖关系,Nodes表示的是代码中的方法与属性点,Edges代表的是属性点之间的连线。
第二部分,则是方法间的依赖关系图(MMN)。在软件系统中每个属性点代表的都是一种方法,并且每一个方法也仅由一个属性点进行设计表示。2个属性点之间的边代表了2个方法之间具有相互依赖性。在文章中,探讨的方法依赖关系仅仅考虑2种情况:方法的调用以及相同属性的访问。究其本质就是如果方法A之间调用方法B,或者反过来说,方法B直接调用方法A的话,那么方法B与方法A之间就构建形成一条边。如果方法C调用属性attr,并且方法D调用属性attr,则表征方法C与方法D的2个属性点之间应该具有连线。连线的方向将被忽略,同样地也将仅是关注方法之间的存在性,而并不考虑各边之间的倍数大小。图4给出了MMN的简单例子,MMN可以被描述为:
Network MMN = (Nodes,Edges)
其中,Network MMN代表的无向网络,Nodes代表的是方法,Edges代表的是方法之间的依赖性。
2引导社区检测算法
在复杂的网络环境中,有诸多方法可以用于实现社区检测。时下位居主流的方法即是 Newman提出的模块法,算法整体性能已臻至最优。本次研究中也将采用这种方法来进行对MMN的社区结构评估。
通过新近研究发现,模块性检测算法仍然存在一定弊端,即不能够检测出小于一定规模的社区群落。这种算法性能主要取决于网络的总体大小以及网络互联性的平均值,即使在群落明确定义的前提之下也很难对一些小的社区做出完备检测。
针对这一问题,研究提出了处理规则来改进社区检测算法。具体来说,实现过程源起于方法本身所属的特殊区域(并不是一个随机检测的规则[2]),而且这些方法都是在不同的类中发生移动的,利用社区检测算法也是对不同类中的方法进行检测,以此判断类是否需要控制移动。
对本研究的方法来说,用分区指标来执行质量评估具备重大意义,愿意在于其控制着方法的移动进程。已经存在为数众多的度量单位来检验特定的分工是否具有存在价值,例如Mancoridis发明的MQ介绍办法[3]。
3类结构重构的核心思想
通过计算移动前后的Q值来确定是否需要引入此移动。本文中的Q就是模块的核心思想,基础依据是:如果Q值为正,则说明此研究采用的方法移动可以增强软件系统的稳定性,其作用效果为良性;同理,如果Q是负值,就证明此时的移动并无实施必要。本文的算法即是通过计算方法之间那些相关联的主题算法,并将其移动来确定研究中类水平上重构的可行性。展开来说,就是通过签署建立的依赖关系图来判定是否需要对软件代码中方法实行移动,从而得出需要移动的类。
4结束语
本文研究是通过权值的大小来衡定各个类中依赖关系的强弱。而后可以通过确定2个方法属性间的依赖关系来评判得到这2个类之间权值的大小。而小的权值即代表了2个方法间弱的依赖关系,为此就软件的可维护性而言则应该使不同类中的权值尽可能最小。同时,在确定需要设计移动的方法后,对研究的对象进行移动,实现软件代码类结构的重构。
本文的研究成果在类结构的重构方法中具有很强的实用性,但此方法的适用性还需要进一步的验证。未来的后续工作主要是:(1)用其他的开源软件系统来对方法进行评估。(2)研究一种可以在方法、类、包及软件系统等不同的层次上都可以进行重构的软件系统重构方法。
[1] SENG O, STANMMEL J, BURKHART D. Search-based determination ofrefactoring for improving the class structure of object-oriented sys-tem[C]//Proceedings of the 8th annual conference on Genetic and evolutionary computation.New York, NY, USA:ACM, 2006:1909-1916.
[2]NEWMAN M E J. Fast algorithm for detecting community structure inNetworks[J]. Physical Review, 2004, 69: 066133.
[3] MANCORIDIS S, MITCHELL B S, RORRES C, et al. Using automatic clusteringto produce high-level system organizations of source code[C]//Pro-ceedings of 6th International Workshop on Program Comprehension.Ischia, Italy:IEEE,1998: 45–52.