APP下载

即时重构系统下的switch语句检测算法

2015-11-01

关键词:源文件程序员表达式

郭 雪

(山西大学软件学院,山西太原030013)

即时重构系统下的switch语句检测算法

郭 雪

(山西大学软件学院,山西太原030013)

软件重构是在不改变软件外部特性的前提下重新组织其内部结构从而提高软件的可维护性、可扩展性以及可重用性的技术统称。代码坏味是程序中存在的需要进行重构的代码部分,是软件的设计缺陷。软件重构就是不断进行坏味查找和修改的过程。基于监控的即时重构系统通过后台运行的监控机制分析处理代码的变化,并可选择合适的检测时机对代码进行坏味检测,并将检测结果反馈给程序员,提醒其重构。Switch语句是在软件开发过程中使用较多的一种分支结构语句,但大量使用该语句则会造成代码冗余。本文将结合基于监控的即时重构特点,对代码中的Switch语句进行查寻,并设计相应的检测算法,寻找冗余部分。将该检测算法应用于即时重构系统可显著提高重构效率。

软件重构;坏味;即时重构;Switch语句

1 软件重构

1.1 软件重构及代码坏味

重构是在不改变软件外部特性的前提下重新组织其内部结构从而提高软件的可维护性、可扩展性以及可重用性的技术统称[1]。通过软件重构可以使软件对外界需求及变更始终具有较强的适应能力[2-3]。自软件重构的概念被提出以来,软件重构主要用于支持面向对象应用框架的设计与复用,其本质是改进已经写好的设计。

代码坏味是程序中存在的需要进行重构的代码部分[1],是软件的设计缺陷。软件重构就是不断进行坏味查找和修改。

1.2 软件重构的发展过程

软件重构先后经历了纯手工式与半自动化式。在早期,程序员必须依据自己的经验,遍历整个项目代码查找坏味。坏味查找的主观性较强,且工作量大、容易出错。随后,人们研究出一系列的坏味检测与重构工具[4-5]:检测工具通过预先设定的度量值,通过对软件结构的分析处理来查找并锁定坏味;而重构工具可帮助程序员执行重构。重构工具将全部或部分重构活动自动化,不仅降低了软件重构的成本使重构过程变得方便灵活,也降低了由于人们的主观原因而导致的出错概率。

虽然重构工具的产生极大的简化了重构过程,提高了程序员的重构效率[5],但是最初的坏味检测工具及重构工具都依赖程序员的调用——只有当程序员意识到需要对代码进行重构时才会被调用。然而,在很多情况下,缺乏重构经验的重构人员往往无法及时感知重构时机,从而很少调用重构工具,结果导致大量的重构机会流失。重构不足将导致软件质量下降,而延迟重构又会导致重构成本的增加——没有对软件进行前期的优化导致其质量偏低;代码中任何改动都有可能牵一发而动全身,增加了重构的成本;与前期开发的相隔时间较长(尤其针对大型项目),程序员必须重新回顾整个开发过程才能进行重构,消耗了大量的时间。

即时重构系统[6]的提出弥补了传统重构中重构工具依赖程序员主观调用的缺陷,可即时获知代码中的坏味并提醒程序员进行重构。该系统的调用无需人工干预,可在较短的时间间隔内对代码进行坏味检测,并将检测结果及时反馈给程序员从而提醒其重构。且整个系统采用后台线程(该线程与用户主线程并行)的方式运行,开发人员可在系统对代码进行坏味检测的同时继续编程。

2 Switch语句坏味

多分支语句switch语句,也称为开关语句,是编程过程中经常涉及的一种语法结构,其形式如图1所示:

图1 switch语句基本格式

其对应流程图如图2:

图2 switch语句执行流程图

然而,在面向对象程序设计中由于switch语句可能造成代码重复,造成代码冗余,不利于软件的发展,所以应尽量少使用switch语句。在软件重构中,将重复的几个switch语句称为“switch惊悚现身”[1],也可称为switch语句坏味。在软件重构过程中,该类坏味是坏味检测的重点对象。

3 即时重构系统下Switch语句检测

3.1 检测对象的获取

由于基于监控坏味检测具有实时监测的特征,所以其检测对象可以限定为当前源文件中的内容。在该过程中,对当前源文件中类的成分进行检测和统计,得到当前源文件中所有Switch类型节点。

可利用Eclipse插件来实现。由于目前Java语言的应用较广,所以在这里以Java项目为例实现检测。Java模型是用来对Java程序相关联的对象进行建模的一类。Java模型类是在org.eclipse.jdt.core中定义的。这些类将Java资源分解成各类元素。在这些元素中,IJavaElement是其他元素的基础。本文中用到的主要模型元素包括:IJavaElement(模型中的所有元素)、IJavaProject(项目)、ICompilation⁃Unit(源文件)等。

对项目进行建模后可利用接口中的API函数来得到所需的检测对象。Switch语句检测的对象是当前文件的AST树中所有的SwitchStatement类型的节点。其目的是查找文件中所有具有相同表达式的switch语句。当前源文件可利用已有的API函数可以获得。假设已经得到的当前源文件为unit,先将现该文件解析成AST(抽象语法树)的形式:

unit为当前源文件根节点,对应子节点的类型为TypeDeclaration(类),代表源文件中的类;类子节点为FunctionDeclaration(函数)类型,代表类中的函数,而函数的子节点为DateDwclaration(数据声明)类型,代表函数中的数据。可通过逐级遍历该AST树来得到源文件中的函数,并对其进行中间人坏味检测。检测过程的伪码如下:

在该过程中,链表types用来存放当前源文件中的类,数组meths用来存放类中的所有函数。然后在函数中寻找Switch类型节点,并对每个节点进行检测。

3.2 Switch语句检测过程

完整的switch语句应该包括:switch后的(Ex⁃pression)和SwitchCase|Statement两部分,查找相似的两个switch语句,就应该分别对这两部分进行检测。图3为该节点的结构图。

图3 switch节点结构图

检测两个switch语句是否相同要分别对它们的switch表达式以及case表达式进行匹配(如果两种表达式全部匹配成功则这两个switch语句相同)。假设现有SwitchStatement类型的节点node_1与node_2,则它们的匹配过程如下:

(1)可通过node_1.getExpression()得到两个节点的switch表达式,并对其进行相似性检测。

(2)如果 switch(Expression)表达式不同,说明被检测的两个节点不具有相似性,则其不属于switch语句坏味;而如果两个switch语句的Expres⁃sion表达式相同则需进一步进行case表达式检测。由于case表达式有多个,所以可将其存入数组并依次进行检测。如果有一个case表达式不同,则检测结束,跳出循环,重新开始检测下一个case表达式。具体过程如下:

∕∕进行相似度检测,如果有一个case不匹配则两个switch节点不相同return false,否则return true。

...}

如果以上两种情况都匹配成功则创建相应的坏味实例并将其加入坏味列表:

smellList.add(asmell);

3.3 该检测方式的效率研究

该检测算法是基于监控的即时检测,检测对象仅为当前源文件。检测过程会由检测系统通过调用插件自动进行,并将结果反馈给程序员提醒其进行重构。

假设当前源文件中含有的switch节点数量为n,而项目文件中的结点总数为N,由于检测过程是在当前源文件中的节点ni与其余(N-1)个节点之间进行,所以该检测过程的时间复杂度仅为(N-1)*n。与传统检测方式相比,该方法能够节省大量的检测时间,提高检测效率。

4 结语

即时重构系统是一种基于监控的重构系统。该系统的特点是:该系统通过监控工作区源代码可自动调用相应的坏味检测工具对代码进行检测,整个过程无需人工干预。该系统已经以插件的形式被实现[11]。同时,由于其独特的坏味检测方式(坏味检测只针对工作区的当前源文件),并在较短的时间间隔内对代码进行坏味检测,可显著提高检测效率。

本文通过分析switch语句的特点,对switch(Expression)和SwitchCase|Statement两部分设计检测算法,通过遍历项目文件找到相似的两个switch节点。将该检测算法应用于即时重构系统,通过后台监控机制对代码进行监控,并选择适当的时机进行检测,可显著提高重构效率,降低软件开发成本。

[1]MARTIN Fowler.重构-改善既有代码的设计[M].熊节,译.北京:人民邮电出版社,2010.

[2]程杰.大话设计模式 [M].北京:清华大学出版社,2010.

[3]林治.软件重构在软件开发过程中的作用分析[J].扬州教育学院学报,2007,25(3):21-24.

[4]刘辉,麻志毅,邵维忠.一维基于图形转换的模型重构描述语言[J].软件学院,2009,20(8):2087-2101.

[5]王忠杰,徐晓飞,战德臣.面向复用成本优化的构建重构方法[J].软件学院,2005,16(2):2157-2165.

[6]HUI Liu,XUE Guo,WEI Zhomgshao.Monitor-based Instant Software Refactoring[J].IEEE Transactions on Software Engineering,2013,39(8):1112-1126.

Switch Statements Detection Algorithm Based on Real-time Reconstruction System

GUO Xue
(School of Software,Shanxi University,Taiyuan Shanxi,030013)

Software reconstruction means to reconstruct the inside of the organization to improve the maitainability,ex⁃tendibility and reusability without changing the outside of software.Bad smell,the design defect of software,is the code needed to be reconstructed existing in the program.Software reconstruction is a process to look for and modify the bad smell continually.Real-time reconstruction system analyzes the changes of code through monitoring mechanism of back⁃ground operation,tests the bad smell at a proper time,gives the feedback to programmer and informs them to reconstruct.Switch statements are used frequently in the development of software,however,using too much can cause code redundance.This paper,based on the real-time reconstruction of monitoring,looked up the Switch statements in code,designed the de⁃tection algorithm,found the redundance.To apply the detection alforithm in the real-time reconstruction system can im⁃prove the efficiency of reconstruction.

software reconstruction;bad smell;real-time reconstruction;Switch statements

O141.4

A

1674-0874(2015)05-0009-04

2014-08-06

郭雪(1987-),女,山西原平人,硕士,助教,主要研究方向:软件重构与软件测试。

〔责任编辑 高海〕

猜你喜欢

源文件程序员表达式
为了让妈妈看懂地图,一位“野生程序员”做了个小程序
怎样成为一名优秀程序员
一个混合核Hilbert型积分不等式及其算子范数表达式
表达式转换及求值探析
网络社区划分在软件质量问题分析中的应用
基于源文件可疑度的软件缺陷定位方法研究
浅析C语言运算符及表达式的教学误区
程序员之子
加班
LKJ基础数据源文件自动编制系统的研究