技术领域
[0001] 本发明涉及计算机数据处理技术领域,特别是涉及智能决策领域技术领域,具体涉及一种代码重构方法及装置。
相关背景技术
[0002] 在项目持续集成的开发模式背景下,如项目功能上线往往需要执行灰度发布策略;在功能节点发布上系统功能上通常需要同一功能有不同的实现。因此在项目代码中会引入一些特性功能代码标志需求启用的标志,以区分不同的功能实现逻辑。但随着项目迭代升级,控制逻辑代码因功能逻辑嵌套太深,且迭代周期达到一定时间后,在代码层面嵌套和代码的复杂度都将以指数级别增长,长此以往,大量技术债堆积将提高软件本身的复杂度,维护的成本和难度也将大幅增加。
具体实施方式
[0038] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0039] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0040] 需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0041] 需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
[0042] 本发明的实施例提供一种代码重构方法的具体实施方式,参见图1,该方法具体包括如下内容:
[0043] 步骤100:对待重构代码进行静态代码分析,以生成抽象语法树。
[0044] 程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。
[0045] 另外,在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。
[0046] 步骤200:根据所述待重构代码中预先设置的功能代码标志,重构所述抽象语法树。
[0047] 具体地,可在待重构代码开发时,预设出功能代码标志,例如在代码中约定一种标志的数据类型GrayFunction,通过该标签可以定义选择使用特定的功能,作为判断是否启用或禁用某功能的策略标记。在实际应用开发过程中,上述的功能通常是以定义灰度功能代码标志来决定是否是使用。
[0048] 步骤300:根据重构后的抽象语法树生成源码文件。
[0049] 具体地,通过重构后的抽象语法树,重新输出源码文件,集成代码对比工具,代码托管系统,自动化生成对比文件,并推送给开发人员,达到自动删除和自动提交审核的自动化流程以及完成自动化深度清洁代码的目的。
[0050] 从上述描述可知,本发明实施例提供的代码重构方法,首先对待重构代码进行静态代码分析,以生成抽象语法树;接着,根据所述待重构代码中预先设置的功能代码标志,重构所述抽象语法树;最后根据重构后的抽象语法树生成源码文件。本发明实现了废弃代码自动重构的功能。克服了原本大量废弃代码遗留在应用系统中,而不得不人工介入分析代码分支删除废弃代码,属繁琐且易出错的缺点,本发明通过静态代码分析,重建抽象语法树,重构源代码,并集成代码比对工具,提高了代码的可维护性,加快代码的编译时间,降低了代码复杂度。
[0051] 一实施例中,所述功能代码标志用于判断启用或禁用特定功能。
[0052] 一实施例中,参见图2,代码重构方法还包括:
[0053] 步骤400:在所述待重构代码中的功能分支节点中设置所述功能代码标志。
[0054] 一实施例中,所述功能代码标志类型包括GrayFunction及/或灰度功能代码标志。
[0055] 一实施例中,参见图3,步骤100具体包括:
[0056] 步骤101:根据词法分析规则,解析所述待重构代码中的编译单元、单元类的声明、方法、变量以及操作符,以生成所述抽象语法树。
[0057] 具体地,遍历每一个编译单元与单元的类的声明,方法,变量,操作符等所有元素,严格按照词法分析规则将源文件解析为AST语法树。
[0058] 为进一步地说明本方案,本发明提供代码重构方法的具体应用实例,具体包括如下内容,参见图4。
[0059] 长期不重构的灰度功能,如图5所示,将会出现如下的功能逻辑树,可以看到该功能具有两个功能主要的功能分支:特性分支A以及B(FeatureA和FeatureB)。该功能有四个历史的实现可以同通过功能代码标记控制实现切换,但实际场景中稳定版本往往只有一到两个功能特性需要保留,这里假定特性分支B1和特性分支B2为保留分支,则图5右侧(特性分支A)都为废弃分支,废弃后结果如图6所示。
[0060] 参见图7,本具体应用实例通过静态代码分析,将代码的执行流程分析为抽象语法树,在不同的条件下会存在多个代码分支,可以通过功能代码标志配置中心获取特性功能代码标志,决定保留该标志下的某个分支的代码,删除其他分支代码,达到重构的目的,自动化生成diff文件,并推送至开发人员提审,达到自动化废弃代码,自动化提审的目的。
[0061] S1:对待重构代码进行静态代码分析,以生成抽象语法树。
[0062] 具体地,可使用自动化工具软件对程序源代码进行检查,以分析程序行为的技术,应用于程序的正确性检查、安全缺陷检测、程序优化等。特点就是不执行程序。程序静态分析是与程序动态分析相对应的代码分析技术,它通过对代码的自动扫描发现隐含的程序问题,主要具有以下特点:(1)不实际执行程序。动态分析是通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。与之相反,静态分析不运行代码只是通过对代码的静态扫描对程序进行分析。(2)执行速度快、效率高。目前成熟的代码静态分析工具每秒可扫描上万行代码,相对于动态分析,具有检测速度快、效率高的特点。(3)误报率较高。代码静态分析是通过对程序扫描找到匹配某种规则模式的代码从而发现代码中存在的问题,例如可以定位strcpy这样可能存在漏洞的函数,这样有时会造成将一些正确代码定位为缺陷的问题,因此静态分析有时存在误报率较高的缺陷,可结合动态分析方法进行修正。
[0063] 进一步地,本具体应用实例采用如下静态分析技术:
[0064] (1)词法分析:从左至右将每个字符的读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token)流,生成相关符号列表。
[0065] (2)语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树。
[0066] (3)抽象语法树分析:将程序组织成树形结构,树中相关节点代表了程序中的相关代码。
[0067] (4)语义分析:对结构上正确的源程序进行上下文有关性质的审查。
[0068] (5)控制流分析:生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
[0069] (6)数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。
[0070] (7)污点分析:基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
[0071] (8)无效代码分析,根据控制流图可分析孤立的节点部分为无效代码。
[0072] 针对上述的功能特性分支在开发需要定义一种定义功能代码标志,例如在代码中约定一种标志的数据类型GrayFunction,通过该标签可以定义选择使用哪种功能,这是本方法的必要条件,将其作为判断是否启用或禁用某功能的策略标记。实际应用开发过程中,上述的功能通常是以定义灰度功能代码标志来决定是否是使用,根据一个伪代码说明功能代码标志在常见的开发流程中的应用,参见图8。
[0073] 在特性分支A失效的情况下,需要对其分支做代码清理,这种深度清洁代码的能力需利用对项目中的JAVA源码的进行词法分析,即遍历每一个编译单元与单元的类的声明、方法、变量,操作符等所有元素,严格按照词法分析规则将源文件解析为AST语法树,针对上面的上述中的重点代码片段做重点AST语法树分析如图9所示。
[0074] S2:根据待重构代码中预先设置的功能代码标志,重构抽象语法树。
[0075] 具体地,如若从功能代码标志配置中心中获取到该FeatureA为废弃,涉及FeatureA条件判断的涉及的节点,FeatureA标识涉及的节点标记废弃,如若涉及公共模块,如被其他功能代码标志调用且该功能代码标志未被标记为废弃,则保留公共模块涉及节点,若到该节点无任何路径可达,则标记节点废弃,最终通过修改后的新语法树重建如图10所示。
[0076] S3:根据重构后的抽象语法树生成源码文件。
[0077] 通过重构后的抽象语法树,重新输出源码文件,集成代码对比工具,代码托管系统,自动化生成对比文件如图11所示,在图11中箭头左侧为重构前代码(虚线内代码为重构过程中所删除代码),箭头右侧为重构后代码,并将重构结果推送给开发人员,达到自动删除和自动提交审核的自动化流程,完成自动化深度清洁代码的目的。
[0078] 从上述描述可知,本发明实施例提供的代码重构方法,首先对待重构代码进行静态代码分析,以生成抽象语法树;接着,根据所述待重构代码中预先设置的功能代码标志,重构所述抽象语法树;最后根据重构后的抽象语法树生成源码文件。本发明实现了废弃代码自动重构的功能。克服了原本大量废弃代码遗留在应用系统中,而不得不人工介入分析代码分支删除废弃代码,属繁琐且易出错的缺点,本发明通过静态代码分析,重建抽象语法树,重构源代码,并集成代码比对工具,提高了代码的可维护性以及代码层面持续重构,加快代码的编译时间,降低了代码复杂度。
[0079] 基于同一发明构思,本申请实施例还提供了代码重构装置,可以用于实现上述实施例所描述的方法,如下面的实施例。由于代码重构装置解决问题的原理与代码重构方法相似,因此代码重构装置的实施可以参见代码重构方法实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的系统较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
[0080] 本发明的实施例提供一种能够实现代码重构方法的代码重构装置的具体实施方式,参见图12,代码重构装置具体包括如下内容:
[0081] 语法树生成单元10,用于对待重构代码进行静态代码分析,以生成抽象语法树;
[0082] 语法树重构单元20,用于根据所述待重构代码中预先设置的功能代码标志,重构所述抽象语法树;
[0083] 源码文件生成单元30,用于根据重构后的抽象语法树生成源码文件。
[0084] 一实施例中,所述功能代码标志用于判断启用或禁用特定功能;所述功能代码标志类型包括GrayFunction及/或灰度功能代码标志。
[0085] 一实施例中,参见图13,代码重构装置还包括:代码标志设置单元40,用于在所述待重构代码中的功能分支节点中设置所述功能代码标志,以及
[0086] 所述语法树生成单元10具体用于根据词法分析规则,解析所述待重构代码中的编译单元、单元类的声明、方法、变量以及操作符,以生成所述抽象语法树。
[0087] 从上述描述可知,本发明实施例提供的代码重构装置,首先对待重构代码进行静态代码分析,以生成抽象语法树;接着,根据所述待重构代码中预先设置的功能代码标志,重构所述抽象语法树;最后根据重构后的抽象语法树生成源码文件。本发明实现了废弃代码自动重构的功能。克服了原本大量废弃代码遗留在应用系统中,而不得不人工介入分析代码分支删除废弃代码,属繁琐且易出错的缺点,本发明通过静态代码分析,重建抽象语法树,重构源代码,并集成代码比对工具,提高了代码的可维护性以及代码层面持续重构,加快代码的编译时间,降低了代码复杂度。
[0088] 上述实施例阐明的装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为电子设备,具体的,电子设备例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
[0089] 在一个典型的实例中电子设备具体包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,该处理器执行该程序时实现上述代码重构方法的步骤,该步骤包括:
[0090] 步骤100:对待重构代码进行静态代码分析,以生成抽象语法树。
[0091] 步骤200:根据所述待重构代码中预先设置的功能代码标志,重构所述抽象语法树。
[0092] 步骤300:根据重构后的抽象语法树生成源码文件。
[0093] 下面参考图14,其示出了适于用来实现本申请实施例的电子设备600的结构示意图。
[0094] 如图14所示,电子设备600包括中央处理单元(CPU)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储部分608加载到随机访问存储器(RAM))603中的程序而执行各种适当的工作和处理。在RAM603中,还存储有系统600操作所需的各种程序和数据。CPU601、ROM602、以及RAM603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线
604。
[0095] 以下部件连接至I/O接口605:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如LAN卡,调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至I/O接口605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装如存储部分608。
[0096] 特别地,根据本发明的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明的实施例包括一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述代码重构方法的步骤,该步骤包括:
[0097] 步骤100:对待重构代码进行静态代码分析,以生成抽象语法树。
[0098] 步骤200:根据所述待重构代码中预先设置的功能代码标志,重构所述抽象语法树。
[0099] 步骤300:根据重构后的抽象语法树生成源码文件。
[0100] 在这样的实施例中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。
[0101] 计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0102] 为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
[0103] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0104] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0105] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0106] 还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0107] 本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0108] 本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0109] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0110] 以上该仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。