代码的圈复杂度确定方法、电子设备及存储介质与流程

文档序号:33533348发布日期:2023-03-22 08:12阅读:40来源:国知局
代码的圈复杂度确定方法、电子设备及存储介质与流程

1.本技术涉及计算机技术领域,特别是代码的圈复杂度确定方法、电子设备及存储介质。


背景技术:

2.在按照项目需求进行项目开发过程中,由于不同的开发者对业务逻辑的理解不同,不同开发者编写的代码也不同,且开发者在开发代码过程总通常会使用逻辑复杂的方法。但是,方法越复杂,就意味着该方法的圈复杂度越高、函数越难理解和维护。为了后续的代码维护工作,通常需要人工选出圈复杂度高的方法,以对这些方法对应的代码进行优化。


技术实现要素:

3.本技术提供一种代码的圈复杂度确定方法、电子设备及存储介质,可以实现自动化确定代码中方法声明节点的圈复杂度。
4.为了解决上述技术问题,本技术采用的一个技术方案是:提供一种代码的圈复杂度确定方法,该方法包括:解析目标代码文件,得到对应的语法树;若语法树中存在类声明节点,则获取类声明节点的类体;若在类体中存在方法声明节点,则判断方法声明节点是否对应有块语句列表;块语句列表基于方法声明节点中的块语句形成;响应于块语句列表存在,则确定初始圈复杂度;基于块语句列表和初始圈复杂度,确定方法声明节点对应的最终圈复杂度。
5.其中,解析目标代码文件,得到对应的语法树之前,还包括:获取原始代码文件夹,其中原始代码文件夹包含多个代码文件;从多个代码文件中确定出目标代码文件。
6.其中,基于块语句列表和初始圈复杂度,确定方法声明节点对应的最终圈复杂度,包括:遍历块语句列表对应的块语句;在遍历过程中,若当前块语句为第一预设语句,按照第一预设规则调整初始圈复杂度;若当前块语句为第二预设语句,按照第二预设规则调整初始圈复杂度,直到遍历结束,得到最终圈复杂度。
7.其中,若当前块语句为第一预设语句,按照第一预设规则调整初始圈复杂度,包括:若当前块语句为第一预设语句,在初始圈复杂度上进行累加操作。
8.其中,第一预设语句至少包括条件判断语句、条件循环语句、重复语句、循环语句、和语句以及或语句中一者。
9.其中,若当前块语句为第二预设语句,按照第二预设规则调整初始圈复杂度,包括:若当前块语句为第二预设语句,则获取当前块语句对应的标签;根据标签的数量调整初始圈复杂度。
10.其中,第二预设语句为选择语句。
11.其中,确定方法声明节点对应的最终圈复杂度之后,包括:在最终圈复杂度超过阈值时,显示方法声明节点以及最终圈复杂度,以提示用户对方法声明节点对应的方法进行修改。
12.为了解决上述技术问题,本技术采用的另一技术方案是:提供一种电子设备,该电子设备包括存储器和处理器,其中,存储器用于存储计算机程序,处理器用于执行计算机程序以实现上述代码的圈复杂度确定方法。
13.为了解决上述技术问题,本技术采用的另一技术方案是:提供一种计算机可读储存介质,该计算机可读储存介质中存储有计算机程序,计算机程序在被处理器执行时,用于执行上述代码的圈复杂度确定方法。
14.本技术的有益效果是:区别于现有技术,本技术提供的代码的圈复杂度确定方法,通过解析目标代码文件,得到对应的语法树,接着判断语法树是否存在类声明节点,若存在则获取类声明节点的类体,进而判断类体是否存在方法声明节点,若存在则判断方法声明节点是否对应有块语句列表,其中块语句列表基于方法声明节点中的块语句形成,响应于块语句列表存在,则确定初始圈复杂度,最后基于块语句列表和初始圈复杂度,确定方法声明节点对应的最终圈复杂度。通过上述方式,可以实现自动化查找出代码文件中方法声明节点对应的圈复杂度,提高确定代码的圈复杂度的效率。
附图说明
15.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。其中:
16.图1是本技术提供的代码的圈复杂度确定方法第一实施例的流程示意图;
17.图2是本技术提供的步骤15一实施例的流程示意图;
18.图3是本技术提供的代码的圈复杂度确定方法第二实施例的流程示意图;
19.图4是本技术提供的代码的圈复杂度确定方法第三实施例的流程示意图;
20.图5是本技术提供的电子设备一实施例的结构示意图;
21.图6是本技术提供的计算机可读储存介质一实施例的结构示意图。
具体实施方式
22.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本技术的一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
23.参阅图1,图1是本技术提供的代码的圈复杂度确定方法第一实施例的流程示意图,该方法包括:
24.步骤11:解析目标代码文件,得到对应的语法树。
25.在一些实施例中,基于项目源码管理仓库(如gitlab),利用git clone指令(或自动化脚本)获取项目源代码,接着遍历与项目源代码对应的文件夹,以从文件夹中确定目标代码文件。其中,目标代码文件可以是后缀为.java的文件。
26.另外,可以将遍历项目源代码的文件夹获取的文件保存至文件列表,如java文件列表。
27.在一些实施例中,可以将目标代码文件解析成语法树,如将java文件解析成抽象语法树(abstract syntax tree,ast),抽象语法树是对java语言的一种抽象,语法树中每个节点都能对应到一种java语法,也就是说一个java文件就是由若干个节点构成。
28.步骤12:若语法树中存在类声明节点,则获取类声明节点的类体。
29.其中,类声明节点在代码中用class declaration表示,类声明节点的类体在代码中用class body表示。
30.在一些实施例中,需要判断获取的语法树中是否存在类声明节点,若存在则获取该类声明节点的类体,否则重新确定下一目标代码文件,并对新的目标代码文件进行分析。
31.步骤13:若在类体中存在方法声明节点,则判断方法声明节点是否对应有块语句列表,其中块语句列表基于方法声明节点中的块语句形成。
32.其中,方法声明节点在代码中用method declaration表示,块语句在代码中用block statement表示。
33.在一些实施例中,确定存在类体时,可以遍历语法树中的方法声明节点,以确定是否存在包含块语句列表的方法声明节点。
34.块语句是将语句分组在一起的一种方法,因此块语句在句法上的作用相当于单个语句。
35.步骤14:响应于块语句列表存在,则确定初始圈复杂度。
36.其中,圈复杂度(cyclomatic complexity,cc)为代码复杂度的衡量标准,用v(g)表示。圈复杂度越大,说明代码的判断逻辑越复杂。
37.圈复杂度的常用计算方法包括点边计算法和节点判定法。点边计算法的计算公式为v(g)=e-n+2,其中e表示语法树中边的数量,n表示语法树中节点的数量,节点之间通过边进行连接;节点判定法的计算公式为v(g)=p+1,其中p为判定节点数量,判定节点可以以字段表示,如以if、while、for、case、catch等带有逻辑关系的字段表示判定节点。
38.在一些实施例中,若块语句列表存在,则说明方法声明节点对应的方法内部存在相应的代码逻辑,也就意味着可以得到相应的圈复杂度。
39.具体地,圈复杂度是方法声明节点的圈复杂度。
40.在块语句列表存在时,可以对方法声明节点的圈复杂度设置初始值,在一些实施例中,可以设置方法声明节点的初始圈复杂度为大于0的整数,如1、2或3。
41.在一些实施例中,初始圈复杂度可以是提前设置的默认值。
42.步骤15:基于块语句列表和初始圈复杂度,确定方法声明节点对应的最终圈复杂度。
43.在一些实施例中,在知道块语句列表的前提下,则可以利用块语句列表中具体的块语句进行块语句识别,以此调整初始圈复杂度。
44.在一些实施例中,参阅图2,步骤15可以包括以下流程:
45.步骤21:遍历块语句列表对应的块语句。
46.可以理解地,块语句列表包含多个块语句,可以通过遍历块语句列表,确定块语句列表的块语句是否是目标语句,其中目标语句可以是第一预设语句或第二预设语句。
47.步骤22:在遍历过程中,若当前块语句为第一预设语句,按照第一预设规则调整初始圈复杂度。
clone命令从项目源码管理仓库gitlab中获取。
61.在一些实施例中,原始文件夹中包含多个文件,这些文件是后缀为.java的文件。
62.步骤32:从多个代码文件中确定出目标代码文件。
63.在一些实施例中,可以通过获取多个文件的文件名,并将文件名符合预设要求的文件确定为目标代码文件。
64.如,在使用java语言编写代码时,遍历原始文件夹,可以确定后缀名为.java的文件,接着从这些.java文件中确定出目标java文件。
65.如,在使用c语言编写代码时,遍历原始文件夹,可以确定后缀名为.c的文件,接着从这些.c文件中确定出目标代码文件。
66.步骤33:解析目标代码文件,得到对应的语法树。
67.步骤34:若语法树中存在类声明节点,则获取类声明节点的类体。
68.步骤35:若在类体中存在方法声明节点,则判断方法声明节点是否对应有块语句列表,其中块语句列表基于方法声明节点中的块语句形成。
69.步骤36:响应于块语句列表存在,则确定初始圈复杂度。
70.步骤37:基于块语句列表和初始圈复杂度,确定方法声明节点对应的最终圈复杂度。
71.步骤33至步骤37可以与上述实施例具备相同或相似的技术特征,这里不再赘述。
72.区别于现有技术,本技术提供的代码的圈复杂度确定方法可以实现以自动化的方式,准确地查找出方法声明节点的最终圈复杂度,提高确定代码的圈复杂度的效率。
73.参阅图4,图4是本技术提供的代码的圈复杂度确定方法第三实施例的流程示意图,该方法包括:
74.步骤41:获取原始代码文件夹,其中原始代码文件夹包含多个代码文件。
75.步骤42:从多个代码文件中确定出目标代码文件。
76.步骤43:解析目标代码文件,得到对应的语法树。
77.步骤44:若语法树中存在类声明节点,则获取类声明节点的类体。
78.步骤45:若在类体中存在方法声明节点,则判断方法声明节点是否对应有块语句列表,其中块语句列表基于方法声明节点中的块语句形成。
79.步骤46:响应于块语句列表存在,则确定初始圈复杂度。
80.步骤47:基于块语句列表和初始圈复杂度,确定方法声明节点对应的最终圈复杂度。
81.步骤41至步骤47可以与上述任一实施例具备相同或相似的技术特征,这里不再赘述。
82.步骤48:在最终圈复杂度超过阈值时,显示方法声明节点以及最终圈复杂度,以提示用户对方法声明节点对应的方法进行修改。
83.在一些实施例中,阈值是5、6或7,若方法声明节点的最终圈复杂度超过阈值,则表示该目标代码文件的逻辑过于复杂,此时可以生成相应的提示/警告信息,以为了方便后续对代码的理解和维护,提示用户对这些方法声明节点对应的方法进行修改,如拆分。上述提及的阈值可以根据实际需求进行设置。
84.区别于现有技术,本技术提供的代码的圈复杂度确定方法可以多个代码文件中,
自动、准确地查找到每个代码文件中方法声明节点的最终圈复杂度,提高了查找圈复杂度的效率。
85.参阅图5,图5是本技术提供的电子设备一实施例的结构示意图,该电子设备50包括存储器501和处理器502,存储器501用于存储计算机程序,处理器502用于执行计算机程序以实现如上述任一实施例所述的代码的圈复杂度确定方法,这里不再赘述。
86.参阅图6,图6是本技术提供的计算机可读储存介质一实施例的结构示意图,该计算机可读储存介质60中存储有计算机程序601,计算机程序601在被处理器执行时,用于实现如上述任一实施例所述的代码的圈复杂度确定方法,这里不再赘述。
87.综上所述,本技术提供的代码的圈复杂度确定方法可以实现自动化查找出代码文件中方法声明节点对应的圈复杂度,提高确定代码的圈复杂度的效率,并且可以在圈复杂度超过阈值时,生成相应的提示/警示信息,以提醒用户对逻辑复杂的代码进行修改。
88.本技术涉及的处理器可以称为cpu(central processing unit,中央处理单元),可能是一种集成电路芯片,还可以是通用处理器、数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
89.本技术使用的存储介质包括u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)或者光盘等各种可以存储程序代码的介质。
90.以上所述仅为本技术的实施方式,并非因此限制本技术的专利范围,凡是利用本技术说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本技术的专利保护范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1