软件工程中代码异味检测方法的研究

2017-03-29 06:56李炎武
现代计算机 2017年5期
关键词:异味决策树代码

李炎武

(四川大学计算机学院,成都 610065)

软件工程中代码异味检测方法的研究

李炎武

(四川大学计算机学院,成都 610065)

在软件工程中,软件重构具有重要意义,它可以提高软件的可维护性、可扩展性、可重用性,进而改善软件质量。在软件重构中,代码异味检测是其中的重要组成部分。目前,代码异味检测的相关研究划分为几个类别。在对基于搜索的代码异味检测方法进行研究后,选择决策树算法来对四个代码异味进行检测,并取得不错的效果。

软件工程;软件重构;代码异味;决策树

0 引言

随着计算机科学的进步和发展,越来越多的行业和领域中需要使用计算机技术,各个行业的相关软件也相继被开发出来。苹果商店的应用超过了百万,桌面软件和专业软件数量更多。在软件开发中维护费用是开发成本的2-100倍[1]。因此,为了降低软件开发中维护费用,改善软件的结构,提高软件的可扩展性和可重用性,有必要进行软件重构[2]。在软件工程中,软件重构用于调整面向对象软件的内部结构,提高软件的可维护性、可扩展性、可重用性,进而改善软件质量,同时软件的外部行为保持不变[3-4]。软件经过重构,可以提高代码的可读性,改善内部结构并且延长代码的生命周期。对于大型软件项目的开发,软件重构具有重要意义。在软件重构中,需要先进行代码异味检测,代码异味会暴露出一些软件中的问题,根据这些问题,工程师会做进一步检查和重构。在重构过程中,代码异味检测是重要步骤。

1 相关工作

代码异味检测的相关研究从1999年开始,至今有将近20年研究历史。随着计算机学科的发展,对于代码异味检测的研究出现了不同的分支,主要分为以下几个类别。

基于手工的代码异味检测方法,这个方法在代码异味研究早期使用。Travassos等人创建了一个“阅读技术”的集合,通过在纸上列举清单,使用观察方法帮助人们找到相关信息,并识别软件构件中的缺点,通过这种方式来改善软件质量[5]。但这类方法具有一定缺点,对于大型系统来说,手工进行代码异味检测的效率低下。

基于度量的代码异味检测方法,通过使用如代码行数、参数个数、代码字符数等数据作为度量来检测代码异味。Marinescu等人开发了一个Eclipse插件,插件将设计问题量化,根据问题设置相应的度量值,并用于检测4种代码异味。通过使用插件能够持续评估系统质量,并帮助开发者进行软件重构[6]。基于度量的方法,准确性依赖于阈值的选择,但对于标准阈值,现在没有一致的定论。并且该方法受限于检测比较简单的代码异味,对于较复杂的代码异味不能直接用度量检测。

基于症状的代码异味检测方法,通过对代码异味定义和描述进行分析,提取特征和标记,利用检测算法进行检测,判断是否具有代码异味。Moha等人通过分析获取代码异味关键词列表,然后使用领域特殊语言形成规则卡片,最后根据建模生成检测算法,对15个代码异味进行检测[7]。基于症状的方法和代码异味症状有关,但是目前对于异味症状没有一致的标准定义,因此该方法受到一定的限制。

基于概率的代码异味检测方法,统计代码中类之间的属性和关系的数据,结合模糊逻辑规则和数学分析来检测代码异味。Ananda等人提出一种量化方法,结合直接关联和间接关联的数量关系,利用传播概率矩阵来检测2种重要代码异味[8]。这类方法使用概率统计来分析检测代码异味,对于不方便量化的代码异味检测效果有限。

基于可视化的代码异味检测方法,结合自动检测工具和人的手动检测来识别代码异味。Emerson等人使用一个可交互的代码异味检测工具来快速观察和认识代码异味,通过不同的角度来理解和可视化代码异味[9]。由于在方法中结合人的手动检测,因此该类方法受限于人的效率,可扩展性不强。

基于搜索的代码异味检测方法,使用不同的算法直接从源代码中识别和检测代码异味,其中大部分检测使用机器学习相关算法。对于机器学习方法,需要对输入进行处理,根据标准输入来得到最后的分类输出结果。Fontana等人使用机器学习技术进行代码异味检测,利用机器学习方法对代码异味进行分类,自动检测代码异味。他们使用了16种机器学习算法,对4种代码异味Data Class,Large Class,Feature Envy,Long Method进行检测,并在软件系统中进行实验,并通过人工确认来构造代码异味样本,把这些样本作为机器学习的标准输入,最后通过交叉验证对实验结果进行评价[10]。基于搜索的方法的算法成功依赖于数据集和训练集的质量,在处理未知和变化的代码异味时受到一定限制。

基于协作的代码异味检测方法,以合作的方式执行不同的活动来改善方法效果,提高检测方法的准确性和性能。目前相关文献较少,Abdelmoez等人使用两个并行算法加速搜索过程,减少搜索空间,使用风险评估来检测代码异味[11]。但这个方法用于检测其他代码异味时,存在一些泛化问题。

2 异味检测方法

本文选择基于搜索的代码异味检测方法,采用机器学习算法来对所选择的几种代码异味进行识别。在选择代码异味时,主要考虑几个方面,代码异味有较高出现频率,代码异味对于软件质量有较大负面影响,代码异味已经有相关研究文献和应用实现[10]。根据要求,最后本文选择了Data Class,Duplicated Code,Inappropriate Intimacy,Long Method四个代码异味进行检测。通过对相关机器学习算法的研究和比较,发现在代码异味检测中,决策树算法具有较好的分类效果[10]。在本文中,使用J48决策树算法作为检测算法,对所选择的四个代码异味进行识别。

本文使用k重交叉验证来对实验结果进行验证,通过算法的精确率,召回率以及定义的到目标精确率平均距离来比较算法效果[12],公式如下:

其中,P表示精确率,R表示召回率,TP表示正确正类,FP表示错误正类,FN表示错误负类,D表示到目标精确率平均距离,TAPi表示某个实验中精确率,TAP表示目标精确率。

通过比较实验,可以知道,本文使用的异味检测方法,在选择的四种代码异味上具有较好的识别效果。

3 结语

现有的代码异味检测方法划分为几个类别,在对基于搜索的代码异味检测方法进行研究后,本文选择决策树算法来对代码异味进行检测,并在选择的四种代码异味上取得了不错的识别效果。

[1]Palomba F,Bavota G,Di Penta M,et al.Detecting Bad Smells in Source Code Using Change History Information[C].Automated Software Engineering(ASE),2013 IEEE/ACM 28th international conference on.IEEE,2013:268-278.

[2]Rasool G,Arshad Z.A Review of Code Smell Mining Techniques[J].Journal of Software:Evolution and Process,2015,27(11):867-895.

[3]Mens T,Tourwé T.A Survey of Software Refactoring[J].IEEE Transactions on Software Engineering,2004,30(2):126-139.

[4]Opdyke W F.Refactoring Object-Oriented Frameworks[D].University of Illinois at Urbana-Champaign,1992.

[5]Travassos G,Shull F,Fredericks M,et al.Detecting Defects in Object-Oriented Designs:Using Reading Techniques to Increase Software Quality[C].ACM Sigplan Notices.ACM,1999,34(10):47-56.

[6]Marinescu R,Ganea G,Verebi I.inCode:Continuous Quality Assessment and Improvement[C].Software Maintenance and Reengineering(CSMR),2010 14th European Conference on.IEEE,2010:274-275.

[7]Moha N,Gueheneuc Y G,Duchien L,et al.DECOR:A Method for the Specification and Detection of Code and Design Smells[J].IEEE Transactions on Software Engineering,2010,36(1):20-36.

[8]Rao A A,Reddy K N.Detecting Bad Smells in Object Oriented Design Using Design Change Propagation Probability Matrix[J].Lecture Notes in Engineering&Computer Science,2008,2168(1).

[9]Murphy-Hill E,Black A P.An Interactive Ambient Visualization for Code Smells[C].Proceedings of the 5th International Symposium on Software Visualization.ACM,2010:5-14.

[10]Fontana F A,Mantyla M V,Zanoni M,et al.Comparing and Experimenting Machine Learning Techniques for Code Smell Detection [J].Empirical Software Engineering,2016,21(3):1143-1191.

[11]Abdelmoez W,Kosba E,Iesa A F.Risk-Based Code Smells Detection Tool[C].The International Conference on Computing Technology and Information Management(ICCTIM).Society of Digital Information and Wireless Communication,2014:148.

[12]Liu H,Liu Q,Niu Z,et al.Dynamic and Automatic Feedback-Based Threshold Adaptation for Code Smell Detection[J].IEEE Transactions on Software Engineering,2016,42(6):1-1.

Research on Code Smell Detection Method in Software Engineering

LI Yan-wu
(College of Computer Science,Sichuan University,Chengdu 610065)

In software engineering,software refactoring is very important,it can improve the quality of software in maintainability,extensibility and reusability.Code smell detection is one of the important components in software refactoring.At present,the research of code smell detection is divided into several categories.After studying of search-based code smell detection,the decision tree algorithm is selected to detecting the four code smells and it gets a good results.

Software Engineering;Software Refactoring;Code Smell;Decision Tree

1007-1423(2017)05-0031-03

10.3969/j.issn.1007-1423.2017.05.008

李炎武(1992-),男,四川宜宾人,硕士研究生,研究方向为数字娱乐与人机交互

2016-12-01

2017-02-10

猜你喜欢
异味决策树代码
简述一种基于C4.5的随机决策树集成分类算法设计
创世代码
创世代码
创世代码
创世代码
决策树和随机森林方法在管理决策中的应用
用这些告别异味吧!夏天就要清清爽爽过!
决策树学习的剪枝方法
纺织品异味检测方法差异分析
汽车空调系统异味的来源及清洗方法解析