代码重构规划方法、装置、存储介质及电子设备与流程

文档序号:22123778发布日期:2020-09-04 16:56阅读:200来源:国知局
代码重构规划方法、装置、存储介质及电子设备与流程

本申请涉及代码重构技术,特别是涉及一种代码重构规划方法、装置、存储介质及电子设备。



背景技术:

随着互联网技术的发展,互联网领域使用的线上系统越来越庞大,参与线上系统开发的开发人员也越来越多,实现线上系统的代码结构越来越复杂。复杂的代码常常存在结构划分不清晰、调用关系杂乱、循环调用等问题,且容易存在循环调用等问题,需要对复杂的代码结构进行重构,以改善代码结构中存在的问题,防止代码的调试和改动对整个系统的代码产生过大的影响。

现有的代码结构的重构方法通常通过修改代码逻辑等方法进行,并且每次重构均需要针对具体的函数分别进行。然而,并不是每次对代码结构的重构均需修改代码逻辑,不区分待重构的目标函数的具体情况,直接采用修改代码逻辑的方法进行代码重构,效率较为低下。



技术实现要素:

有鉴于此,本申请的主要目的在于提供一种代码重构规划方法,该方法可以提前确定目标函数的重构类型,使得进行代码重构的开发人员可以依据目标函数的重构类型进行代码重构操作,提升代码重构的效率。

为了达到上述目的,本申请提出的技术方案为:

第一方面,本申请实施例提供了一种代码重构规划方法,包括以下步骤:

获取待重构代码;

根据所述待重构代码确定待重构的目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息;所述调用关系信息包括以下至少一项:事务调用信息、事件调用信息和函数调用信息;

根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型。

一种可能的实施方式中,根据所述待重构代码确定所述目标函数所属类的类名信息的步骤包括:

利用反射机制,确定所述目标函数所属的类的类名信息。

一种可能的实施方式中,所述根据所述待重构代码确定所述目标函数的函数名信息的步骤包括:

根据所述目标函数的声明关键字,确定所述目标函数的函数名信息。

一种可能的实施方式中,所述调用关系信息包括事务调用信息时,根据所述待重构代码确定所述目标函数的调用关系信息的步骤包括:

根据事务的调用关键字,判断所述目标函数中是否包括事务的调用语句;

当所述目标函数中包括所述事务的调用语句时,将所述目标函数的事务调用信息标识为包含事务调用;

所述根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型的步骤为:

根据所述目标函数的事务调用信息,判断所述目标函数是否包含事务调用;

当所述目标函包含事务调用时,将所述目标函数的重构类型确定为代码改造类型。

一种可能的实施方式中,所述调用关系信息包括事件调用信息时,根据所述待重构代码确定所述目标函数的调用关系信息的步骤包括:

根据事件的调用关键字,判断所述目标函数中是否包括事件的调用语句;

当所述目标函数中包括所述事件的调用语句时,根据所述事件的调用语句,确定调用的事件的名称;

将调用的事件的名称,确定为所述目标函数的事件调用信息。

所述根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型的步骤为:

判断所述目标函数是否包含所述事件调用信息;

当所述目标函数包含所述事件调用信息时,将所述目标函数的重构类型确定为代码改造类型。

一种可能的实施方式中,所述调用关系信息包括函数调用信息时,根据所述待重构代码确定所述目标函数的调用关系信息的步骤包括:

根据函数的调用关键字,判断所述目标函数中是否包含函数的调用语句;

当所述目标函数中包含函数的调用语句时,根据所述函数的调用语句,确定被调用函数的函数名信息,并利用反射机制,确定被调用函数所属类的类名信息。

一种可能的实施方式中,所述根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型的步骤为:

根据所述函数调用信息,判断所述目标函数是否被调用;

当所述目标函数没有被调用时,判断所述目标函数是否是入口函数,当所述目标函数不是入口函数时,将所述目标函数的重构类型确定为函数删除类型;

当所述目标函数被调用时,判断所述目标函数的调用关系链中是否存在循环调用情况;

当存在循环调用情况时,将所述目标函数的重构类型确定为代码改造类型;

当不存在循环调用情况时,判断调用所述目标函数的函数是否属于同一个类;

当调用所述目标函数的函数不属于同一个类时,判断所述目标函数中是否存在函数调用;

当所述目标函数中存在函数调用时,将所述目标函数的重构类型确定为代码改造类型;当所述目标函数中不存在函数调用时,将所述目标函数的重构类型确定为代码迁移类型;

当调用所述目标函数的函数属于同一个类时,判断所述目标函数中是否存在函数调用;

当所述目标函数中存在函数调用时,判断所述目标函数的被调用函数是否与所述目标函数属于同一个类;

当所述目标函数的被调用函数与所述目标函数属于同一个类时,将所述目标函数的重构类型确定为代码迁移类型;当所述目标函数的被调用函数与所述目标函数不属于同一个类时,将所述目标函数的重构类型确定为代码改造类型;

当所述目标函数中不存在函数调用时,判断所述目标函数中是否调用数据库模块;

当所述目标函数中调用数据库模块时,将所述目标函数的重构类型确定为代码迁移类型。

一种可能的实施方式中,所述根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型的步骤之后,所述方法还包括:

根据所述待重构代码中至少一个目标函数的重构类型,确定代码重构的改造成本数据。

一种可能的实施方式中,所述根据所述待重构代码中至少一个目标函数的重构类型,确定代码重构的改造成本数据的步骤,包括:

分别针对每个所述重构类型,确定所述重构类型包括的函数的总数;

根据每个所述重构类型分别包括的函数的总数和每个所述重构类型各自的子成本数据,确定代码重构的所述改造成本数据。

一种可能的实施方式中,所述根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型的步骤之后,所述方法还包括:

根据所述目标函数的重构类型,对所述目标函数进行测试。

一种可能的实施方式中,当所述目标函数的重构类型为代码改造类型时,所述目标函数的调用关系信息包括所述函数调用信息;

所述对所述目标函数进行测试的步骤包括:

根据所述目标函数的所述函数调用信息,确定所述目标函数的调用关系链;

根据所述调用关系链,将与所述目标函数存在调用关系的入口函数,确定为目标入口函数;

通过测试所述目标入口函数的功能是否正确,对所述目标函数进行测试。

一种可能的实施方式中,当所述目标函数的重构类型为代码迁移类型时,

所述对所述目标函数进行测试的步骤包括:

通过比较迁移后的所述目标函数的代码内容与迁移前的所述目标函数的代码内容是否相同,对所述目标函数进行测试。

第二方面,本申请实施例还提供了一种代码重构规划装置,包括:

获取模块,用于获取待重构代码;

类名确定模块,用于根据所述待重构代码确定待重构的目标函数所属类的类名信息;

函数名确定模块,用于根据所述待重构代码确定待重构的目标函数的函数名信息;

调用关系确定模块,用于根据所述待重构代码确定所述目标函数的调用关系信息;所述调用关系信息包括以下至少一项:事务调用信息、事件调用信息、函数调用信息;

重构类型确定模块,用于根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型。

一种可能的实施方式中,所述类名确定模块,用于利用反射机制,确定所述目标函数所属的类的类名信息。

一种可能的实施方式中,所述函数名确定模块,用于根据所述目标函数的声明关键字,确定所述目标函数的函数名信息。

一种可能的实施方式中,所述调用关系信息包括事务调用信息时,所述调用关系确定模块,包括:

事务调用信息确定单元,用于根据事务的调用关键字,判断所述目标函数中是否包括事务的调用语句;当所述目标函数中包括所述事务的调用语句时,将所述目标函数的事务调用信息标识为包含事务调用;

所述重构类型确定模块,用于:

根据所述目标函数的事务调用信息,判断所述目标函数是否包含事务调用;当所述目标函包含事务调用时,将所述目标函数的重构类型确定为代码改造类型。

一种可能的实施方式中,所述调用关系信息包括事件调用信息时,所述调用关系确定模块,包括:

事件调用信息确定单元,用于根据事件的调用关键字,判断所述目标函数中是否包括事件的调用语句;当所述目标函数中包括所述事件的调用语句时,根据所述事件的调用语句,确定调用的事件的名称;将调用的事件的名称,确定为所述目标函数的事件调用信息。

所述重构类型确定模块,用于:

判断所述目标函数是否包含所述事件调用信息;当所述目标函数包含所述事件调用信息时,将所述目标函数的重构类型确定为代码改造类型。

一种可能的实施方式中,所述调用关系信息包括函数调用信息时,所述调用关系确定模块,包括:

函数信息确定单元,用于根据函数的调用关键字,判断所述目标函数中是否包含函数的调用语句;当所述目标函数中包含函数的调用语句时,根据所述函数的调用语句,确定被调用函数的函数名信息,并利用反射机制,确定被调用函数所属类的类名信息。

一种可能的实施方式中,所述重构类型确定模块,包括:

第一判断子单元,用于根据所述函数调用信息,判断所述目标函数是否被调用;

类型确定单元,用于当所述目标函数没有被调用时,判断所述目标函数是否是入口函数,当所述目标函数不是入口函数时,将所述目标函数的重构类型确定为函数删除类型;

第二判断子单元,用于当所述目标函数被调用时,判断所述目标函数的调用关系链中是否存在循环调用情况;

类型确定单元,用于当存在循环调用情况时,将所述目标函数的重构类型确定为代码改造类型;

第三判断子单元,用于当不存在循环调用情况时,判断调用所述目标函数的函数是否属于同一个类;

第四判断子单元,用于当调用所述目标函数的函数不属于同一个类时,判断所述目标函数中是否存在函数调用;

类型确定单元,用于当所述目标函数中存在函数调用时,将所述目标函数的重构类型确定为代码改造类型;当所述目标函数中不存在函数调用时,将所述目标函数的重构类型确定为代码迁移类型;

第五判断子单元,用于当调用所述目标函数的函数属于同一个类时,判断所述目标函数中是否存在函数调用;

第六判断子单元,用于当所述目标函数中存在函数调用时,判断所述目标函数的被调用函数是否与所述目标函数属于同一个类;

类型确定单元,用于当所述目标函数的被调用函数与所述目标函数属于同一个类时,将所述目标函数的重构类型确定为代码迁移类型;当所述目标函数的被调用函数与所述目标函数不属于同一个类时,将所述目标函数的重构类型确定为代码改造类型;

第七判断子单元,用于当所述目标函数中不存在函数调用时,判断所述目标函数中是否调用数据库模块;

类型确定单元,用于当所述目标函数中调用数据库模块时,将所述目标函数的重构类型确定为代码迁移类型。

一种可能的实施方式中,所述装置还包括:

成本数据确定模块,用于根据所述待重构代码中至少一个目标函数的重构类型,确定代码重构的改造成本数据。

一种可能的实施方式中,所述成本数据确定模块,包括:

函数统计单元,用于分别针对每个所述重构类型,确定所述重构类型包括的函数的总数;

成本确定单元,用于根据每个所述重构类型分别包括的函数的总数和每个所述重构类型各自的子成本数据,确定代码重构的所述改造成本数据。

一种可能的实施方式中,所述装置还包括:

测试模块,用于根据所述目标函数的重构类型,对所述目标函数进行测试。

一种可能的实施方式中,当所述目标函数的重构类型为代码改造类型时,所述目标函数的调用关系信息包括所述函数调用信息;

所述测试模块,用于:

根据所述目标函数的所述函数调用信息,确定所述目标函数的调用关系链;

根据所述调用关系链,将与所述目标函数存在调用关系的入口函数,确定为目标入口函数;

通过测试所述目标入口函数的功能是否正确,对所述目标函数进行测试。

一种可能的实施方式中,当所述目标函数的重构类型为代码迁移类型时,

所述测试模块,用于:

通过比较迁移后的所述目标函数的代码内容与迁移前的所述目标函数的代码内容是否相同,对所述目标函数进行测试。

第三方面,本申请实施例还提供一种计算机可读存储介质。具体方案为:

一种计算机可读存储介质,存储有计算机指令,所述指令被处理器执行时可实现上述第一方面及第一方面中任一种可能的实施方式的步骤。

第四方面,本申请实施例还提供一种电子设备。具体方案为:

一种电子设备,该电子设备包括:

处理器;用于存储所述处理器可执行指令的存储器;

所述处理器,用于从所述存储器中读取所述可执行指令,并执行所述指令以实现上述第一方面及第一方面中任一种可能的实施方式的步骤。

综上所述,本申请提出的一种代码重构规划方法、装置、存储介质及电子设备。本申请根据待重构代码,确定待重构的目标函数的函数名信息、所属类的类名信息和调用关系信息,并根据目标函数的函数名信息、所属类的类名信息和调用关系信息,确定目标函数的重构类型。在开发人员开始进行代码重构之前,确定待重构代码的重构方案,保证每个参与重构的开发人员可以按照确定好的重构方案进行代码重构,提升代码重构的效率。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例中一种重构前的代码结构的结构示意图;

图2为本申请实施例中一种重构后的代码结构的结构示意图;

图3为本申请实施例提供的一种代码重构规划方法的流程示意图;

图4为本申请实施例提供的代码重构规划方法中根据调用关系信息确定目标函数的重构类型的流程示意图;

图5为本申请实施例提供的一种代码重构规划装置的结构示意图;

图6为本申请实施例提供的另一种代码重构规划装置的结构示意图;

图7为本申请实施例提供的代码重构规划装置中重构类型确定模块的结构示意图;

图8为本申请实施例提供的一种电子设备的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请的说明书和权利要求书及上述附图中的术语″第一″、″第二″、″第三″、″第四″等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例,例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语″包括″和″具有″以及他们的任何变形,意图在于覆盖不排他的包含。例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其他步骤或单元。

随着互联网领域使用的线上系统越来越庞大,参与线上系统开发的开发人员也越来越多,实现线上系统的代码结构越来越复杂。复杂的代码常常存在结构划分不清晰、调用关系杂乱、循环调用等问题。如图1所示的代码结构,servicea、serviceb和servicec为属于服务层的三个类,modela、modelb和modelc为属于数据层的三个类,controllera、controllerb为属于接入层的两个类,由于存在同层间(例如图1所示的服务层间)的函数的相互调用,容易存在循环调用等问题,在代码运行时容易出现死循环等异常状况。此时,需要对复杂的代码结构进行重构,以改善代码结构中存在的问题,防止代码的调试和改动对整个系统的代码产生过大影响。

对代码进行重构的目标是重新建立合理的代码层级结构,使得代码结构清除、调用关系清晰,例如,将如图1所示的代码重构为如图2所示的树状的代码结构,servicea、serviceb和servicec为属于服务层的三个类,coreservicea、coreserviceb和coreservicec为属于服务核层的三个类,modela、modelb和modelc为属于数据层的三个类,controllera、controllerb为属于接入层的两个类,通过增加服务核层和对每一层、每个类中的函数加以改造,以改善结构划分不清晰、调用关系杂乱、循环调用等问题。现有的代码结构的重构方法通常直接通过修改代码逻辑等方法进行,并且每次重构均需要针对具体的函数分别进行。然而,并不是每次对代码结构的重构均需修改代码逻辑,不区分待重构的目标函数的具体情况,直接采用修改代码逻辑的方法进行代码重构,效率较为低下。

有鉴于此,本申请的核心发明点在于:根据待重构代码,确定待重构的目标函数的函数名信息、所属类的类名信息和调用关系信息,并根据目标函数的函数名信息、所属类的类名信息和调用关系信息,确定目标函数的重构类型。在开发人员开始进行代码重构之前,确定待重构代码的重构方案,保证每个参与重构的开发人员可以按照确定好的重构方案进行代码重构,提升代码重构的效率。

为使本申请的目的、技术方案和优点更加清楚,下面以具体实施例对本发明的技术方案进行详细说明。下面几个具体实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。

图3为本申请实施例提供的一种代码重构规划方法的流程示意图,如图3所示,该实施例主要包括:

s301:获取待重构代码。

代码就是开发人员使用软件开发工具所支持的程序语言编写出来的源文件。待重构代码是需要进行代码重构的目标代码。在计算机领域,函数是代码中实现具体功能的代码块。待重构代码包括至少一个函数。

s302:根据所述待重构代码确定待重构的目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息;所述调用关系信息包括以下至少一项:事务调用信息、事件调用信息和函数调用信息。

这里,事务是指数据库事务,是访问并可能操作数据库中的数据项的数据库操作序列。事务由事务开始与事务结束之间执行的全部数据库操作组成。事件为执行特定操作的特殊函数。

待重构代码中等待进行重构的函数是目标函数。本申请实施例在进行代码重构之前,首先根据待重构代码确定与目标函数重构有关的信息。示例性的,确定目标函数的函数名信息、目标函数所属类的类名信息和目标函数的调用关系信息。具体的,函数名信息为目标函数的名称信息。本申请实施例针对的待重构代码为面向对象编程的代码,因此,目标函数实现在类中,目标函数所属类的类名信息,就是实现目标函数的类的名称信息。

这里,目标函数的调用关系信息包括目标函数被其他函数调用的信息和目标函数调用其他函数、事务或事件的信息。具体的,调用关系信息根据目标函数调用对象的不同,可以包括事务调用信息、事件调用信息和函数调用信息中的至少一项。其中,事务调用信息为目标函数以事务为对象进行调用的信息;事件调用信息为目标函数以事件为对象进行调用的信息;函数调用信息为目标函数以函数为对象进行调用的信息或目标函数被函数调用的信息。

s303:根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型。

本申请实施例根据目标函数的函数名信息、目标函数所属类的类名信息和目标函数的调用关系信息,确定目标函数的重构类型。本申请实施例在实际进行代码重构之前,先分别以待重构代码中的每个函数作为目标函数,确定目标函数的重构类型,根据目标函数的重构类型对待重构代码进行重构。

在开发人员开始进行代码重构之前,确定待重构代码的重构方案,可以保证每个参与重构的开发人员针对待重构代码中每个函数的调用关系特点,按照确定好的重构方案进行代码重构,提升代码重构的效率。

在具体实施时,获取到待重构代码之后,分别将待重构代码中包含的每个函数作为目标函数,确定目标函数的重构类型。

可以首先根据待重构代码,利用反射机制,确定目标函数所属类的类名信息。

之后,根据目标函数的声明关键字,确定目标函数的函数名信息。无论是哪种程序语言编写的待重构代码,待重构代码中均会采用声明语句来定义函数。并且,函数的声明语句都是以特定的声明关键字、固定的语法格式进行定义的,因此,可以根据函数的声明关键字,确定目标函数的函数名信息。示例性的,在javascript程序语言中,使用function作为声明关键字,一个名称为test的目标函数,其定义语句为functiontest()。因此,可以采用正则匹配的方法,匹配出待重构代码中函数的声明关键字,进而确定目标函数的函数名信息。具体如示例中,可以采用正则匹配的方法,匹配出目标函数的声明关键字function,进而确定函数的函数名信息test。

本申请实施例还需确定目标函数的调用关系信息。对于事务调用信息,可以根据事务的调用关键字来确定。具体的,根据事务的调用关键字,判断所述目标函数中是否包括事务的调用语句;当所述目标函数中包括所述事务的调用语句时,将所述目标函数的事务调用信息标识为包含事务调用。在待重构代码中,也会使用特定的调用关键字、固定的语法格式来表征事务的开始。示例性的,在javascript程序语言中,采用事务的调用关键字db::begintraction来表征事务开始。因此,可以利用正则匹配的方法,匹配出待重构代码中事务的调用关键字,从而确定目标函数中是否包括事务的调用语句。本申请实施例中仅需明确是否调用了事务,因此,本申请实施例仅采用是否包含事务调用的标识作为目标函数的事务调用信息。具体的,在目标函数包括事务的调用语句时,将目标函数的事务调用信息标识为包含事务调用,例如,将目标函数的事务调用信息标识为是;在目标函数不包括事务的调用语句时,将目标函数的事务调用信息标识为不包含事务调用,例如,将目标函数的事务调用信息标识为否。

对于事件调用信息,可以根据事件的调用关键字来确定。具体的,根据事件的调用关键字,判断所述目标函数中是否包括事件的调用语句;当所述目标函数中包括所述事件的调用语句时,根据所述事件的调用语句,确定调用的事件的名称;将调用的事件的名称,确定为所述目标函数的事件调用信息。在待重构代码中,会使用特定的调用关键字、固定的语法格式来调用事事件。示例性的,在javascript程序语言中,会采用调用event函数的方式来调用事件。因此,可以利用正则匹配的方法,匹配出待重构代码中事件的调用关键字,从而确定目标函数中是否包括事件的调用语句。具体例如,可以将event函数的调用关键字作为事件的调用关键字,确定目标函数中是否包含事件的调用语句。在包含事件的调用语句时,根据事件的调用语句可以确定调用的事件的名称,并将调用的事件的名称确定为目标函数的事件调用信息。

对于函数调用信息,可以根据函数的调用关键字来确定。具体的,根据函数的调用关键字,判断所述目标函数中是否包含函数的调用语句;当所述目标函数中包含函数的调用语句时,根据所述函数的调用语句,确定被调用函数的函数名信息,并利用反射机制,确定被调用函数所属类的类名信息。可以采用正则匹配的方法,确定函数的调用关键字,进而判断出目标函数中是否包含函数的调用语句,根据函数的调用语句,确定被调用函数的函数名信息。这里,被调用函数为目标函数中声明的,被目标函数调用的函数。

分别将待重构代码中的每个函数作为目标函数,确定目标函数的事务调用信息、事件调用信息和函数调用信息,得到待重构代码中的每个函数的事务调用信息、事件调用信息和函数调用信息。

在实际实施时,可以将待重构代码中的每个函数的调用关系信息进行存储,以便后续根据调用关系信息确定目标函数的重构类型。

具体的,以目标函数的调用关系为例,假设目标函数的调用关系信息包含了事务调用信息、事件调用信息和函数调用信息,可以以下述结构存储待重构代码中的每个函数的调用关系信息:

所属类的类名信息:xxx,

函数名信息:xxx,

事务调用信息:是或否,

事件调用信息:{

事件1,事件2,...

},

目标函数的被调用函数的函数调用信息:{

函数1,函数2,...

},

以目标函数为被调用函数的函数调用信息:{

函数1,函数2,...

}

在确定并存储了待重构代码中的每个函数的调用关系信息之后,分别以待重构代码中的每个函数为目标函数,根据调用关系信息确定目标函数的重构类型。

具体的,当调用关系信息包括事务调用信息时,根据事务调用信息确定目标函数的重构类型。为了防止事务嵌套的情况,根据所述目标函数的事务调用信息,判断所述目标函数是否包含事务调用;当所述目标函数包含事务调用时,将所述目标函数的重构类型确定为代码改造类型。尤其是当目标函数所属的类不是位于直接被接入层调用的代码层时,为了防止事务嵌套,目标函数中应严禁使用事务。因此,当目标函数中包含事务调用时,目标函数的重构类型应确定为代码改造类型。由于目标函数的事务调用信息为是否包含事务调用的标识,因此,当目标函数的事务调用信息标识为包含事务调用时,例如目标函数的事务调用信息的标识为是时,目标函数中包含事务调用。

这里,本申请实施例提供的代码重构规划方法,确定目标函数的重构类型,使得进行代码重构的开发人员根据重构类型对目标函数进行重构。在本申请实施例中,目标函数的重构类型可以包括:代码改造类型、代码迁移类型和函数删除类型。代码改造类型,为需要针对目标函数的代码内容进行改造的重构类型。代码迁移类型,为需要将目标函数整体迁移至目标层级的重构类型。函数删除类型,为需要将目标函数删除的重构类型。

由于事务嵌套会给系统运行造成很大的隐患,并且,只有对目标函数的代码内容进行分析和改造,才能避免事务嵌套问题,因此,当目标函数的事务调用信息标识为包含事务调用时,将目标函数的重构类型确定为代码改造类型。

当调用关系信息包括事件调用信息时,与包含事务调用信息的情况类似,为了防止事件的嵌套调用,当目标函数中包含事件调用即针对目标函数的代码内容对目标函数进行改造。具体的,判断所述目标函数是否包含所述事件调用信息;当所述目标函数包含所述事件调用信息时,将所述目标函数的重构类型确定为代码改造类型。

当调用关系信息包括函数调用信息时,需要根据具体的函数调用信息判断目标函数在函数调用链中的被调用函数情况和被调用情况,根据被调用函数情况和被调用情况,确定目标函数的重构类型。

具体的,函数调用信息包括目标函数在函数调用链中的被调用函数情况和被调用情况,并且,在确定目标函数的调用信息时,确定了被调用函数的函数名信息,并利用反射机制,确定了被调用函数所属类的类名信息。因此,可以将目标函数的函数调用信息记录为:

目标函数的被调用函数的函数调用信息:{

自己类的被调用函数:{

函数1,函数2,...

},

其它类的被调用函数:{

{类名:xxx,函数名:xxx},{类名:xxx,函数名:xxx},...

},

},

以目标函数为被调用函数的函数调用信息:{

被自己类调用的函数集:{

函数1,函数2,...

},

被其它类调用的函数集:{

{类名:xxx,函数名:xxx},{类名:xxx,函数名:xxx},...

},

}

这里,自己类是指目标函数所属的类,待重构代码中其他类是指除目标函数所属的类以外的类。

进一步的,还可以根据上述包含了被调用函数信息和被调用信息的调用关系信息,得出调用关系链,并根据调用关系链,确定在目标函数的调用关系链中是否存在循环调用情况。将调用关系链和目标函数的循环调用情况,也作为调用关系信息的一部分进行存储。

在进行重构时,为了使得重构后的待重构代码结构清晰、调用关系清除,避免出现隐患。需要遵守一些代码重构准则,例如:

1)严禁同层间的函数相互调用;

2)当一个目标函数被多个类的函数使用时,需要将目标函数下沉到下一层,以便最大化的实现目标函数的代码复用;

3)当目标函数涉及到多个数据库模型的调用时,需要将目标函数放置数层的上层,以便保证每个数据库模型都与一个数据表相对应;

4)非直接与接入层相调用的代码层的目标函数,严禁使用事务,以避免事务嵌套状况发生。

因此,根据上述调用关系信息,可以确定目标函数的重构类型,具体的,根据调用关系信息中的函数调用信息,确定目标函数的重构类型。

根据函数调用信息确定目标函数的重构类型的过程,主要为根据目标函数的被调用函数和以目标函数为被调用函数的函数、以及目标函数的被调用函数所属的类和以目标函数为被调用函数的函数所属的类,确定目标函数的重构类型。具体的流程如图4所示:

s401:根据所述函数调用信息,判断所述目标函数是否被调用。

具体的,根据函数调用信息中以目标函数为被调用函数的函数调用信息,判断目标函数是否被调用。

在待重构代码中,函数之间存在调用与被调用的调用关系,本申请实施例将调用关系中,处于调用其他函数地位的函数称为调用函数,将调用关系中处于被其他函数调用地位的函数称为被调用函数。

进一步的,目标函数的被调用函数,就是被目标函数调用的函数。

以目标函数为被调用函数的函数,就是调用了目标函数的函数。

s402:当所述目标函数没有被调用时,判断所述目标函数是否是入口函数。

入口函数所属的类位于接入层,例如,如图1所示的代码结构中,controllera类和controllerb类的函数为入口函数,入口函数通常承担与外界通信的作用,因此,入口函数不会被待重构代码中的函数调用,只会调用待重构代码中的函数。因此,当目标函数是入口函数时,不需要进行代码重构。

s403:当所述目标函数不是入口函数时,将所述目标函数的重构类型确定为函数删除类型。

当目标函数不是入口函数,仍然未被任何其他函数调用时,说明目标函数没有被用到,没有被任何其他函数调用过的目标函数没有存在的必要,此时,将目标函数的重构类型确定为函数删除类型。在开发人员进行代码重构时,将目标函数删除。

s404:当所述目标函数被调用时,判断所述目标函数的调用关系链中是否存在循环调用情况。

当目标函数被调用时,首先判断目标函数的调用关系链中是否存在循环调用情况,如果出现循环调用的情况,在待重构代码运行时,会存在出现死循环的隐患。因此,首先判断目标函数的调用关系链中是否存在循环调用情况。

例如,如图1所示的代码结构中,servicea类、serviceb类与servicec类存在相互调用的情况,此时就存在循环调用的隐患,假设servicea类的目标函数调用了serviceb类中的函数作为被调用函数,可能属于serviceb类中的被调用函数的调用关系链的下游,还存在某个函数调用了servicea类的目标函数作为被调用函数,此时,目标函数的调用关系链中就存在了循环调用情况。

一种可能的实施方式中,调用关系信息可以不仅包括函数调用信息,还包括事务调用信息或事件调用信息时,结合函数调用信息、事务调用信息和事件调用信息,判断目标函数的重构类型。此时,还可以在判断所述目标函数的调用关系链中是否存在循环调用情况之前,判断目标函数是否包含事务调用信息或事件调用信息,当目标函数包含事务调用信息或事件调用信息时,将目标函数的重构类型确定为代码改造类型。

s405:当存在循环调用情况时,将所述目标函数的重构类型确定为代码改造类型。

当目标函数的调用关系链中存在循环调用情况时,需要深入研究目标函数的代码内容,才能对目标函数进行重构,因此,将目标函数的重构类型确定为代码改造类型。

s406:当不存在循环调用情况时,判断调用所述目标函数的函数是否属于同一个类。

当调用目标函数的函数不属于同一个类时,执行步骤s407;当调用目标函数的函数属于同一个类时,执行步骤s410。

s407:当调用所述目标函数的函数不属于同一个类时,判断所述目标函数中是否存在函数调用。

当调用所述目标函数的函数不属于同一个类时,类似于图1中serviceb类的情况,serviceb类中的目标函数有可能被属于servicea类、servicec类和controllerb类的函数调用,此时,serviceb类中的目标函数的被调用函数为两个以上函数,且调用serviceb类中的目标函数的函数不属于同一个类。此时,判断目标函数中是否存在函数调用。

s408:当所述目标函数中存在函数调用时,将所述目标函数的重构类型确定为代码改造类型。

当调用目标函数的函数不属于同一个类,且目标函数中存在函数调用时,例如serviceb类中的目标函数分别被servicea类、servicec类和controllerb类的函数调用,且serviceb类中的目标函数调用了servicec类的函数时,目标函数中存在同层调用、交叉调用等情形,此时,需要深入研究目标函数的代码内容,才能对目标函数进行重构,因此,将目标函数的重构类型确定为代码改造类型。

s409:当所述目标函数中不存在函数调用时,将所述目标函数的重构类型确定为代码迁移类型。

当目标函数不存在函数调用时,目标函数被同层或上一层的多个函数调用,且没有调用下一层或同层的函数,此时,只需将目标函数的代码内容整体迁移至目标层级即可,通常情况下,将目标函数的代码内容向下迁移至少一个层级即可。具体例如,将serviceb类中的目标函数,迁移至coreserviceb类中。因此,将目标函数的重构类型确定为代码迁移类型,以便最大化的实现目标函数的代码复用。

s410:当调用所述目标函数的函数属于同一个类时,判断所述目标函数中是否存在函数调用。

当调用所述目标函数的函数属于同一个类时,类似图1中servicec类的情况,servicec类中的函数仅被serviceb类调用。当目标函数中存在函数调用时,执行步骤s411;当目标函数中不存在函数调用时,执行步骤s414。

s411:当所述目标函数中存在函数调用时,判断所述目标函数的被调用函数是否与所述目标函数属于同一个类。

当目标函数的被调用函数与目标函数属于同一个类时,说明目标函数调用了与自己属于同一个类的函数,例如,servicec类中的目标函数调用的被调用函数也是属于servicec类的函数,执行步骤s412;当目标函数的被调用函数与目标函数不属于同一个类时,说明目标函数调用了与自己不属于同一个类的函数,例如,servicec类中的目标函数调用的被调用函数是属于serviceb类的函数,执行步骤s413。

s412:当所述目标函数的被调用函数与所述目标函数属于同一个类时,将所述目标函数的重构类型确定为代码迁移类型。

当目标函数调用了与自己属于同一个类的函数时,只需将目标函数的代码内容整体迁移至目标层级即可,通常情况下,将目标函数的代码内容迁移至同层级其他的类中,或者将目标函数的代码内容迁移至下一层级的类中即可。例如,可以将servicec类中的目标函数迁移至serviceb类中,或者将servicec类中的目标函数迁移至coreservicec类中。因此,将目标函数的重构类型确定为代码迁移类型,以便最大化的实现目标函数的代码复用。

s413:当所述目标函数的被调用函数与所述目标函数不属于同一个类时,将所述目标函数的重构类型确定为代码改造类型。

当目标函数调用了与自己不属于同一个类的函数,需要深入研究目标函数的代码内容,才能对目标函数进行重构,因此,将目标函数的重构类型确定为代码改造类型。

s414:当所述目标函数中不存在函数调用时,判断所述目标函数中是否调用数据库模块。

假设servicea类中的目标函数没有调用位于服务层的函数,此时,判断servicea类中的目标函数是否调用了数据层的数据库模块,例如,判断servicea类中的目标函数调用了modela类中的数据库模块(repository)。

s415:当所述目标函数中调用数据库模块时,将所述目标函数的重构类型确定为代码迁移类型。

假设servicea类中的目标函数调用了modela类中的数据库模块(repository),将servicea类中的目标函数确定为代码迁移类型。

进一步的,还可以根据目标函数中调用数据库模块的个数,将目标函数的代码内容迁移到不同的层级。具体例如,当目标函数中调用数据库模块的个数为一个时,将目标函数的代码内容迁移到数据层;当目标函数中调用数据库模块的个数为两个以上时,将目标函数的代码内容迁移至数据层的上一层,以保证每个数据库模型可以与一个数据表相对应。

本申请实施例提供的代码重构规划方法,使用了静态代码分析技术,根据以待重构代码中每个函数为目标函数,根据目标函数的函数名信息、所属类的类名信息和调用关系信息,确定待重构代码中每个函数的重构类型,对代码重构方案进行规划,从而在开发人员开始进行代码重构之前,确定待重构代码的重构方案。本申请实施例可以提供一种通过静态分析待重构代码,批量确定待重构代码中每个函数的重构类型。以便使开发人员可以根据重构类型实施代码重构,保证了代码重构可以按照同一个重构思想进行,避免了代码重构实施过程中发生百人百个重构方案的现象,提升了代码重构的效率和正确率。

进一步的,在以待重构代码中每个函数为目标函数,确定目标函数的重构类型之后,本申请实施例还可以根据所述待重构代码中至少一个目标函数的重构类型,确定代码重构的改造成本数据。从而在执行代码重构之前,估算改造成本数据,提前确定需要多少开发人员或多少重构时间,对进行代码重构需要的人力成本或时间成本进行规划。

具体的,分别针对每个所述重构类型,确定所述重构类型包括的函数的总数;根据每个所述重构类型分别包括的函数的总数和每个所述重构类型各自的子成本数据,确定代码重构的所述改造成本数据。示例性的,可以用求和的方法确定重构类型包括的函数的总数,进而确定代码重构的所述改造成本数据。

每种重构类型的子成本数据不同,对于函数删除类型来说,仅需删除目标函数即可,成本最低;对于代码迁移类型来说,将目标函数的代码内容整体由目标函数所属类,迁移到目标层级的类中去,成本较低;对于代码改造类型来说,需要针对目标函数的具体代码内容进行改造,成本较高。

根据待重构代码中的每个函数,根据该函数的重构类型,可以确定得到每种重构类型包含的函数的总数,进而根据每种重构类型分别包括的函数的总数和每种重构类型各自的子成本数据,确定代码重构的改造成本数据。

这里,子成本数据和改造成本数据可以是任一种常用于估算代码改造成本的数据,例如,可以是人力成本数据,也可以是时间成本数据。

进一步的,为了保障重构后的待重构代码的正确性,防止因重构引入重大故障隐患,进一步提高代码重构效率,可以在依照重构类型对待重构代码进行重构之后,以待重构代码中的每个函数作为目标函数,根据所述目标函数的重构类型,对所述目标函数进行测试。

如何进行目标函数的测试,根据目标函数的重构类型确定。

对于函数删除类型来说,目标函数已被删除,自然无需进行测试。

对于代码改造类型来说,进行测试需要依赖目标函数的调用关系信息中的函数调用信息进行。具体的,根据所述目标函数的所述函数调用信息,确定所述目标函数的调用关系链;根据所述调用关系链,将与所述目标函数存在调用关系的入口函数,确定为目标入口函数;通过测试所述目标入口函数的功能是否正确,对所述目标函数进行测试。对于代码改造类型来说,由于对目标函数的代码内容进行了改动,因此,需要测试修改后的目标函数的功能是否正确。本申请实施例中,根据调用关系链,确定与目标函数存在调用关系的目标入口函数,通过测试目标入口函数的功能是否正确,推断目标函数的功能是否正确。这里,入口函数为位于接入层的类中的函数,入口函数通常承担与外界通信的作用。入口函数不被调用,而是充当接口的功能调用其他的函数。因此,对于待重构代码中的每个函数来说,其调用关系链中的最上层是入口函数。对入口函数进行测试,实际就是对整个调用关系链进行了简要的测试,入口函数的功能正确,说明整个调用关系链可以完成正常的功能;如果入口函数功能错误,证明调用关系链中一定有错误的环节。在实际实施时,可以以进行重构后的待重构代码中每个函数为目标函数,根据目标函数的调用关系链,标记目标函数的至少一个目标入口函数,并且采用唯一标识信息的方式标记上述至少一个目标入口函数。并且示例性的,可以采用回归测试的测试方法,以目标入口函数作为回归测试的路由入口,对上述至少一个目标入口函数中的每个目标入口函数进行回归测试。通过测试入口函数对目标函数进行测试,不仅测试了目标函数的功能,还测试了目标函数的调用关系链是否通畅,可以在代码重构之后,自动地对代码改造后的目标函数的功能正确性进行大体的评估,为进一步的精细化人工测试提供方向性参考,进一步提高代码重构效率。

对于代码迁移类型来说,由于代码迁移类型的重构类型,在对目标函数进行代码重构时,是将整个目标函数的代码内容原封不动地由目标函数原所属类迁移至目标层中的类。因此,可以通过比较迁移后的所述目标函数的代码内容与迁移前的所述目标函数的代码内容是否相同,对所述目标函数进行测试。示例性的,可以采用md5算法,分别计算迁移前的目标函数的md5码和迁移后的目标函数的md5码,如果迁移前的目标函数的md5码和迁移后的目标函数的md5码相同,则迁移后的目标函数的代码内容与迁移前的目标函数的代码内容相同;如果迁移前的目标函数的md5码和迁移后的目标函数的md5码不同,则迁移后的目标函数的代码内容与迁移前的目标函数的代码内容不同。如果目标函数的代码内容在代码迁移过程中没有发生改变,其功能一般情况下不会发生改变。这样,也可以在代码重构之后,自动地对代码迁移后的目标函数的功能正确性进行大体的评估,为进一步的精细化人工测试提供方向性参考,进一步提高代码重构效率。

进一步的,还可以以待重构代码中的每个函数分别作为目标函数,根据所述待重构代码中至少一个目标函数的重构类型,确定代码重构的测试成本数据。根据每个重构类型分别包括的函数的总数和每个重构类型各自的子测试成本数据,确定代码重构的测试成本数据。

基于相同的设计构思,本申请实施例还提供一种代码重构规划装置、存储介质及电子设备。

如图5所示,本申请实施例提供的一种代码重构规划装置500,包括:

获取模块501,用于获取待重构代码;

类名确定模块502,用于根据所述待重构代码确定待重构的目标函数所属类的类名信息;

函数名确定模块503,用于根据所述待重构代码确定待重构的目标函数的函数名信息;

调用关系确定模块504,用于根据所述待重构代码确定所述目标函数的调用关系信息;所述调用关系信息包括以下至少一项:事务调用信息、事件调用信息、函数调用信息;

重构类型确定模块505,用于根据所述目标函数的函数名信息、所述目标函数所属类的类名信息和所述目标函数的调用关系信息,确定所述目标函数的重构类型。

获取模块501分别连接类名确定模块502、函数名确定模块503和调用关系确定模块504,将获取的待重构代码发送给类名确定模块502、函数名确定模块503和调用关系确定模块504。类名确定模块502、函数名确定模块503和调用关系确定模块504分别根据待重构代码确定待重构的目标函数所属类的类名信息、目标函数的函数名信息和目标函数的调用关系信息。类名确定模块502、函数名确定模块503和调用关系确定模块504与重构类型确定模块505连接,将确定得到的目标函数所属类的类名信息、目标函数的函数名信息和目标函数的调用关系信息发送给重构类型确定模块505,重构类型确定模块505确定目标函数的重构类型。

一种可能的实施方式中,所述类名确定模块502,用于利用反射机制,确定所述目标函数所属的类的类名信息。

一种可能的实施方式中,所述函数名确定模块503,用于根据所述目标函数的声明关键字,确定所述目标函数的函数名信息。

一种可能的实施方式中,如图6所示,所述调用关系信息包括事务调用信息时,所述调用关系确定模块504,包括:

事务调用信息确定单元641,用于根据事务的调用关键字,判断所述目标函数中是否包括事务的调用语句;当所述目标函数中包括所述事务的调用语句时,将所述目标函数的事务调用信息标识为包含事务调用;

所述重构类型确定模块505,用于:

根据所述目标函数的事务调用信息,判断所述目标函数是否包含事务调用;当所述目标函包含事务调用时,将所述目标函数的重构类型确定为代码改造类型。

事务调用信息确定单元641与获取模块501和重构类型确定模块505连接,具体根据待重构代码中的事务的调用关键字,确定事务调用信息。并将事务调用信息发送给重构类型确定模块505,以便重构类型确定模块505根据事务调用信息确定目标函数的重构类型。

一种可能的实施方式中,所述调用关系信息包括事件调用信息时,所述调用关系确定模块504,包括:

事件调用信息确定单元642,用于根据事件的调用关键字,判断所述目标函数中是否包括事件的调用语句;当所述目标函数中包括所述事件的调用语句时,根据所述事件的调用语句,确定调用的事件的名称;将调用的事件的名称,确定为所述目标函数的事件调用信息。

所述重构类型确定模块505,用于:

判断所述目标函数是否包含所述事件调用信息;当所述目标函数包含所述事件调用信息时,将所述目标函数的重构类型确定为代码改造类型。

事件调用信息确定单元642与获取模块501和重构类型确定模块505连接,具体根据待重构代码中的事件的调用关键字,确定事件调用信息。并将事件调用信息发送给重构类型确定模块505,以便重构类型确定模块505根据事件调用信息确定目标函数的重构类型。

一种可能的实施方式中,所述调用关系信息包括函数调用信息时,所述调用关系确定模块504,包括:

函数调用信息确定单元643,用于根据函数的调用关键字,判断所述目标函数中是否包含函数的调用语句;当所述目标函数中包含函数的调用语句时,根据所述函数的调用语句,确定被调用函数的函数名信息,并利用反射机制,确定被调用函数所属类的类名信息。

函数调用信息确定单元643与获取模块501和重构类型确定模块505连接,具体根据待重构代码中的函数的调用关键字,确定函数调用信息。并将函数调用信息发送给重构类型确定模块505,以便重构类型确定模块505根据函数调用信息确定目标函数的重构类型。

一种可能的实施方式中,如图7所示,所述重构类型确定模块505,包括:

第一判断子单元701,用于根据所述函数调用信息,判断所述目标函数是否被调用;

类型确定单元702,用于当所述目标函数没有被调用时,判断所述目标函数是否是入口函数,当所述目标函数不是入口函数时,将所述目标函数的重构类型确定为函数删除类型;

第二判断子单元703,用于当所述目标函数被调用时,判断所述目标函数的调用关系链中是否存在循环调用情况;

类型确定单元702,用于当存在循环调用情况时,将所述目标函数的重构类型确定为代码改造类型;

第三判断子单元704,用于当不存在循环调用情况时,判断调用所述目标函数的函数是否属于同一个类;

第四判断子单元705,用于当调用所述目标函数的函数不属于同一个类时,判断所述目标函数中是否存在函数调用;

类型确定单元702,用于当所述目标函数中存在函数调用时,将所述目标函数的重构类型确定为代码改造类型;当所述目标函数中不存在函数调用时,将所述目标函数的重构类型确定为代码迁移类型;

第五判断子单元706,用于当调用所述目标函数的函数属于同一个类时,判断所述目标函数中是否存在函数调用;

第六判断子单元707,用于当所述目标函数中存在函数调用时,判断所述目标函数的被调用函数是否与所述目标函数属于同一个类;

类型确定单元702,用于当所述目标函数的被调用函数与所述目标函数属于同一个类时,将所述目标函数的重构类型确定为代码迁移类型;当所述目标函数的被调用函数与所述目标函数不属于同一个类时,将所述目标函数的重构类型确定为代码改造类型;

第七判断子单元708,用于当所述目标函数中不存在函数调用时,判断所述目标函数中是否调用数据库模块;

类型确定单元702,用于当所述目标函数中调用数据库模块时,将所述目标函数的重构类型确定为代码迁移类型。

第一判断子单元701与调用关系确定模块504连接,获取函数调用关系并判断目标函数是否被调用,第一判断子单元701与类型确定单元702连接,将判断结果发送给类型确定单元702。类型确定单元702根据第一判断子单元701的判断结果确定目标函数的重构类型。第二判断子单元703与调用关系确定模块504和类型确定单元702连接,根据类型确定单元702的确定结果确定是否运行第二判断子单元703,并且第二判断子单元703从调用关系确定模块504获取函数调用关系并判断目标函数的调用关系链中是否存在循环调用情况,将判断结果发送给类型确定单元702。类型确定单元702根据第二判断子单元703的判断结果确定目标函数的重构类型。第三判断子单元704跟类型确定单元702连接,根据类型确定单元702的确定结果确定是否运行第三判断子单元704,第三判断子单元704还分别与调用关系确定模块504、第四判断子单元705和第五判断子单元706连接,第三判断子单元704根据函数调用关系判断运行第四判断子单元705还是第五判断子单元706。第四判断子单元705和第五判断子单元706分别与调用关系确定模块504连接,分别获取函数调用关系并进行判断。第四判断子单元705还与类型确定单元702连接,将判断结果发送给类型确定单元702。类型确定单元702根据第四判断子单元705的判断结果确定目标函数的重构类型。第五判断子单元706分别与第六判断子单元707和第七判断子单元708连接,第五判断子单元706根据函数调用关系判断运行第六判断子单元707还是第七判断子单元708。第六判断子单元707和第七判断子单元708分别与调用关系确定模块504连接,分别获取函数调用关系并进行判断。第六判断子单元707和第七判断子单元708分别与类型确定单元702连接,将判断结果发送给类型确定单元702。类型确定单元702根据第六判断子单元707和第七判断子单元708的判断结果确定目标函数的重构类型。

一种可能的实施方式中,如图6所示,所述装置500还包括:

成本数据确定模块506,用于根据所述待重构代码中至少一个目标函数的重构类型,确定代码重构的改造成本数据。

成本数据确定模块506与重构类型确定模块505连接,根据重构类型确定模块505确定的重构类型,确定代码重构的改造成本数据。

一种可能的实施方式中,如图6所示,所述成本数据确定模块506,包括:

函数统计单元661,用于分别针对每个所述重构类型,确定所述重构类型包括的函数的总数;

成本确定单元662,用于根据每个所述重构类型分别包括的函数的总数和每个所述重构类型各自的子成本数据,确定代码重构的所述改造成本数据。

函数统计单元661与重构类型确定模块505连接,分别确定每种重构类型包括的函数的总数。函数统计单元661与成本确定单元662连接,将确定得到的每种重构类型包括的函数的总数发送给成本确定单元662,由成本确定单元662确定代码重构的改造成本数据。

一种可能的实施方式中,如图6所示,所述装置500还包括:

测试模块507,用于根据所述目标函数的重构类型,对所述目标函数进行测试。

测试模块507与重构类型确定模块505连接,根据重构类型确定模块505确定的重构类型,对所述目标函数进行测试。

一种可能的实施方式中,当所述目标函数的重构类型为代码改造类型时,所述目标函数的调用关系信息包括所述函数调用信息;

所述测试模块507,用于:

根据所述目标函数的所述函数调用信息,确定所述目标函数的调用关系链;

根据所述调用关系链,将与所述目标函数存在调用关系的入口函数,确定为目标入口函数;

通过测试所述目标入口函数的功能是否正确,对所述目标函数进行测试。

一种可能的实施方式中,当所述目标函数的重构类型为代码迁移类型时,

所述测试模块507,用于:

通过比较迁移后的所述目标函数的代码内容与迁移前的所述目标函数的代码内容是否相同,对所述目标函数进行测试。

一种可能的实施方式中,本申请实施例提供的代码重构规划装置还可以包括中央控制模块和存储模块,代码重构规划装置中的每个模块均与中央控制模块连接,存储模块也与中央控制模块连接,由中央控制模块进行每个模块之间执行顺序和数据交互的调度,并将每个中间数据存存储在内部存储或存储器中,通过中央控制模块从内部存储或存储器读取中间数据、或者将中间数据写入内部存储或存储器中。

本申请实施例提供的代码重构规划装置根据以待重构代码中每个函数为目标函数,根据目标函数的函数名信息、所属类的类名信息和调用关系信息,确定待重构代码中每个函数的重构类型,对代码重构方案进行规划,从而在开发人员开始进行代码重构之前,确定待重构代码的重构方案,保证每个参与重构的开发人员可以按照确定好的重构方案进行代码重构,提升代码重构的效率。

进一步的,本申请实施例提供的代码重构规划装置还可以根据所述待重构代码中至少一个目标函数的重构类型,确定代码重构的改造成本数据。从而在执行代码重构之前,估算改造成本数据,提前确定需要多少开发人员或多少重构时间,对进行代码重构需要的人力成本或时间成本进行规划。

进一步的,本申请实施例提供的代码重构规划装置也可以在代码重构之后,自动地对代码重构后的目标函数的功能正确性进行大体的评估,为进一步的精细化测试提供方向性参考,进一步提高代码重构效率。

本申请实施例还提供一种计算机可读介质,所述计算机可读存储介质存储指令,所述指令在由处理器执行时使得所述处理器执行本申请实施例提供的任一种代码重构规划方法的步骤。实际应用中,所述的计算机可读介质可以是上述实施例中描述的设备/装置/系统中所包含的,也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或多个程序被执行时,实现根据参考本申请实施例提供的任一种代码重构规划装置进行本申请实施例提供的任一种代码重构规划方法的步骤。

根据本申请公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件,或者上述的任意合适的组合,但不用于限制本申请保护的范围。在本申请公开的实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

本申请所述的方法步骤除了可以用数据处理程序来实现,还可以由硬件来实现,例如,可以由逻辑门、开关、专用集成电路(asic)、可编程逻辑控制器和嵌微控制器等来实现。因此这种可以实现本申请所述方法的硬件也可以构成本申请。

本申请实施例还提供一种电子设备,可以是计算机或服务器,其中可以集成本申请实施例提供的任一种代码重构规划装置。如图8所示,其示出了本申请实施例提供的电子设备800。

该电子设备可以包括一个或者一个以上处理核心的处理器801、一个或一个以上用于存储所述处理器801可执行指令的存储器802。该电子设备还可以包括电源803、输入输出单元804。本领域技术人员可以理解,图8中并不构成对电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

其中:

处理器801是该电子设备的控制部分,利用各种接口和线路连接各个部分,从存储器802中读取所述可执行指令,通过运行或执行存储在存储器802中的指令以实现本申请实施例提供的任一种代码重构规划方法的步骤。

存储器802可用于存储软件程序,即本申请实施例提供的任一种代码重构规划方法中涉及的程序。

处理器801通过运行存储在存储器802的软件程序,从而执行各种功能应用以及数据处理。存储器802可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据电子设备需要使用的数据等。此外,存储器802可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器802还可以包括存储器控制器,以提供处理器801对存储器802的访问。

电子设备还包括给各个部件供电的电源803,优选的,电源803可以通过电源管理系统与处理器801逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源803还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。

该服务器还可包括输入输出单元804,比如可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入;比如可用于显示由用户输入的信息或提供给用户的信息以及服务器的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。

本申请实施例提供的任一种代码重构规划方法、装置、存储介质及电子设备均基于相同的设计构思,并且本申请任一个实施例中的技术手段可以进行自由组合,组合得到的技术手段仍在本申请的保护范围之内。

本申请附图中的流程图和框图,示出了按照本申请公开的各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或者代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应该注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同附图中所标准的顺序发生。例如,两个连接地表示的方框实际上可以基本并行地执行,它们有时也可以按照相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或者流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

本领域技术人员可以理解,本申请的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,即使这样的组合或结合没有明确记载于本申请中。特别地,在不脱离本申请精神和教导的情况下,本申请的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,所有这些组合和/或结合均落入本申请公开的范围。

本申请中应用了具体实施例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思路,并不用于限制本申请。对于本领域的技术人员来说,可以依据本申请的思路、精神和原则,在具体实施方式及应用范围上进行改变,其所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1