代码质量评测方法、装置、设备及存储介质与流程

文档序号:26278558发布日期:2021-08-13 19:34阅读:105来源:国知局
代码质量评测方法、装置、设备及存储介质与流程

本发明涉及研发管理领域,尤其涉及一种代码质量评测方法、装置、设备及存储介质。



背景技术:

在软件项目的开发和迭代过程中,由于开发人员的开发经验不足、项目开发工期短等原因,会造成代码质量相对低下,出现业务逻辑糅杂、功能逻辑实现复杂化等问题,因为开发人员看待问题的全局和优化意识较为薄弱,在完成开发任务时,为了保障功能实现的同时提高任务完成速度,造成代码的可读性降低,为后续的迭代更新增加了难度。

为了解决上述问题,历史上优秀的软件工程师提出了经典的23种软件设计模式,软件设计模式是一种软件开发指导思想,只要开发人员按照这些设计模式开发软件,就能使其开发的软件思路清晰,有据可依。因此,在开发人员提交代码时,对其代码进行设计模式检验是验证其代码质量的必要途径。但是,由于设计模式是一种抽象的思想,在实际工作中,代码质量的检验一般都是由经验较充足的开发工程师完成,检验完成后给开发人员提供修改建议,这一过程往往效率极低,导致整个软件项目的开发进度缓慢。



技术实现要素:

本发明的主要目的在于代码质量检验效率低且检测结果准确率不高的技术问题。

本发明第一方面提供了一种代码质量评测方法,包括:

获取待评测的目标代码,并提取所述目标代码中的多个类对象;

分别提取各所述类对象的类名、属性及操作函数并进行调用关系解析,得到各所述类对象之间的调用关系;

根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图,并对所述第一调用关系图进行矩阵化处理,得到第一关系特征矩阵;

获取多个预置代码设计模式分别对应的多个第二调用关系图,并分别对各所述第二调用关系图进行矩阵化处理,得到多个第二关系特征矩阵;

根据所述第一关系特征矩阵及各所述第二关系特征矩阵,计算所述目标代码分别与各所述代码设计模式之间的相似度矩阵;

根据所述相似度矩阵,分别计算所述目标代码在对应代码设计模式下的代码质量分值。

可选的,在本发明第一方面的第一种实现方式中,所述获取待评测的目标代码,并提取所述目标代码中的多个类对象包括:

获取待评测的目标代码;

根据所述目标代码的语言类型,识别所述目标代码中的类标识符;

根据所述类标识符,提取所述目标代码中的多个类对象,其中,所述类对象的类型包括通用类及接口类。

可选的,在本发明第一方面的第二种实现方式中,所述分别提取各所述类对象的类名、属性及操作函数并进行调用关系解析,得到各所述类对象之间的调用关系包括:

根据各所述类对象的类型,提取各所述通用类的类名、属性及操作函数,以及提取各所述接口类的类名及操作函数;

解析各所述类对象的类名、属性及操作函数,构建各所述类对象之间的调用关系,其中,所述调用关系包括依赖、关联、聚合、组合、泛化及实现中的一种或多种。

可选的,在本发明第一方面的第三种实现方式中,所述根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图,并对所述第一调用关系图进行矩阵化处理,得到第一关系特征矩阵包括:

根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图;

根据所述第一调用关系图中各所述类对象之间的调用关系,生成各所述调用关系对应的第一调用关系矩阵;

随机定义各所述第一调用关系矩阵中不重复的第一根值,并分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第一更新值,得到多个新的第一调用关系矩阵;

依次对所述第一调用关系图中各所述类对象之间的调用关系对应的新的第一调用关系矩阵进行点乘合并计算,得到所述目标代码对应的第一关系特征矩阵。

可选的,在本发明第一方面的第四种实现方式中,所述获取多个预置代码设计模式分别对应的多个第二调用关系图,并分别对各所述第二调用关系图进行矩阵化处理,得到多个第二关系特征矩阵包括:

获取多个预置代码设计模式分别对应的多个第二调用关系图,并识别各所述第二调用关系图中各类对象之间的调用关系及对应的所述第一调用关系矩阵;

分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第二更新值,得到多个新的第二调用关系矩阵;

依次对所述第二调用关系图中各所述类对象之间的调用关系对应的新的第二调用关系矩阵进行点乘合并计算,得到各所述代码设计模式对应的第二关系特征矩阵。

可选的,在本发明第一方面的第五种实现方式中,所述根据所述第一关系特征矩阵及各所述第二关系特征矩阵,计算所述目标代码分别与各所述代码设计模式之间的相似度矩阵包括:

分别判断所述第一关系特征矩阵的第一矩阵维度与各所述第二关系特征矩阵的第二矩阵维度是否不同;

若是,则将矩阵维度不同的第一关系特征矩阵与第二关系特征矩阵映射到同一矩阵维度,得到第一目标关系特征矩阵和第二目标关系特征矩阵;

分别计算所述第一目标关系特征矩阵与所述第二目标关系特征矩阵中同一位置的矩阵元素之间的欧几里得距离,得到所述目标代码分别与各所述代码设计模式之间的相似度矩阵。

可选的,在本发明第一方面的第六种实现方式中,所述根据所述相似度矩阵,分别计算所述目标代码在对应代码设计模式下的代码质量分值包括:

分别判断各所述相似度矩阵中各元素值是否大于或等于预置阈值,并统计所述相似度矩阵中大于或等于所述阈值的元素个数;

分别计算所述元素个数占各所述相似度矩阵元素总个数的比例值,得到所述目标代码在对应代码设计模式下的代码质量分值。

本发明第二方面提供了一种代码质量评测装置,包括:

获取模块,用于获取待评测的目标代码,并提取所述目标代码中的多个类对象;

提取模块,用于分别提取各所述类对象的类名、属性及操作函数并进行调用关系解析,得到各所述类对象之间的调用关系;

构建模块,用于根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图,并对所述第一调用关系图进行矩阵化处理,得到第一关系特征矩阵;

矩阵化模块,用于获取多个预置代码设计模式分别对应的多个第二调用关系图,并分别对各所述第二调用关系图进行矩阵化处理,得到多个第二关系特征矩阵;

计算模块,用于根据所述第一关系特征矩阵及各所述第二关系特征矩阵,计算所述目标代码分别与各所述代码设计模式之间的相似度矩阵;

打分模块,用于根据所述相似度矩阵,分别计算所述目标代码在对应代码设计模式下的代码质量分值。

可选的,在本发明第二方面的第一种实现方式中,所述获取模块具体用于:

获取待评测的目标代码;

根据所述目标代码的语言类型,识别所述目标代码中的类标识符;

根据所述类标识符,提取所述目标代码中的多个类对象,其中,所述类对象的类型包括通用类及接口类。

可选的,在本发明第二方面的第二种实现方式中,所述提取模块具体用于:

根据各所述类对象的类型,提取各所述通用类的类名、属性及操作函数,以及提取各所述接口类的类名及操作函数;

解析各所述类对象的类名、属性及操作函数,构建各所述类对象之间的调用关系,其中,所述调用关系包括依赖、关联、聚合、组合、泛化及实现中的一种或多种。

可选的,在本发明第二方面的第三种实现方式中,所述构建模块具体用于:

根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图;

根据所述第一调用关系图中各所述类对象之间的调用关系,生成各所述调用关系对应的第一调用关系矩阵;

随机定义各所述第一调用关系矩阵中不重复的第一根值,并分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第一更新值,得到多个新的第一调用关系矩阵;

依次对所述第一调用关系图中各所述类对象之间的调用关系对应的新的第一调用关系矩阵进行点乘合并计算,得到所述目标代码对应的第一关系特征矩阵。

可选的,在本发明第二方面的第四种实现方式中,所述矩阵化模块具体用于:

获取多个预置代码设计模式分别对应的多个第二调用关系图,并识别各所述第二调用关系图中各类对象之间的调用关系及对应的所述第一调用关系矩阵;

分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第二更新值,得到多个新的第二调用关系矩阵;

依次对所述第二调用关系图中各所述类对象之间的调用关系对应的新的第二调用关系矩阵进行点乘合并计算,得到各所述代码设计模式对应的第二关系特征矩阵。

可选的,在本发明第二方面的第五种实现方式中,所述计算模块具体用于:

分别判断所述第一关系特征矩阵的第一矩阵维度与各所述第二关系特征矩阵的第二矩阵维度是否不同;

若是,则将矩阵维度不同的第一关系特征矩阵与第二关系特征矩阵映射到同一矩阵维度,得到第一目标关系特征矩阵和第二目标关系特征矩阵;

分别计算所述第一目标关系特征矩阵与所述第二目标关系特征矩阵中同一位置的矩阵元素之间的欧几里得距离,得到所述目标代码分别与各所述代码设计模式之间的相似度矩阵。

可选的,在本发明第二方面的第六种实现方式中,所述打分模块具体用于:

分别判断各所述相似度矩阵中各元素值是否大于或等于预置阈值,并统计所述相似度矩阵中大于或等于所述阈值的元素个数;

分别计算所述元素个数占各所述相似度矩阵元素总个数的比例值,得到所述目标代码在对应代码设计模式下的代码质量分值。

本发明第三方面提供了一种计算机设备,包括:存储器和至少一个处理器,所述存储器中存储有指令;所述至少一个处理器调用所述存储器中的所述指令,以使得所述计算机设备执行上述的代码质量评测方法。

本发明的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述的代码质量评测方法。

本发明提供的技术方案中,为了对代码进行评测,需要抽离出代码中的类对象,通过分析这些类对象之间的调用关系,构建这些类对象之间的关系图,从而识别待评测代码与范例代码之间的相似度,其中范例代码指具有规范的设计模式思想的代码,可以预先配置这些范例代码的关系图,并与待评测代码的关系图进行矩阵化对比,通过矩阵的相似度计算算法,计算出待评测代码与范例代码对应的设计模式之间的相似度,从而算出待评测代码的综合评分。本发明实施例能够对代码的设计模式进行自动识别与分析,从而实现代码质量的综合评分,更为科学准确地评价代码质量,提高了代码质量检测的效率和检测准确度。

附图说明

图1为本发明实施例中代码质量评测方法的第一个实施例示意图;

图2为本发明实施例中代码质量评测方法的第二个实施例示意图;

图3为本发明实施例中代码质量评测装置的一个实施例示意图;

图4为本发明实施例中计算机设备的一个实施例示意图。

具体实施方式

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

为便于理解,下面对本发明实施例的具体流程进行描述,请参阅图1,本发明实施例中代码质量评测方法的第一个实施例包括:

101、获取待评测的目标代码,并提取所述目标代码中的多个类对象;

可以理解的是,本发明的执行主体可以为代码质量评测装置,还可以是终端或者服务器,具体此处不做限定。本发明实施例以服务器为执行主体为例进行说明。

本实施例中,待评测的目标代码可以是同一语言类型的代码段或者打包好的整个项目文件,在开发人员完成项目功能的逻辑代码之后,提交代码文件,在后台接收到代码文件之后,会对代码文件进行逐一解析,提取各个代码文件中的类,通过提取到的多个类,分析这些类之间的关系,从而识别出整个代码文件的与经典的23种设计模式的相似程度,并通过与这些设计模式的相似度来检验代码是否遵循/违背软件开发的指导思想,最后给出代码的质量评分。

本实施例中,类对象是指具有相同属性、方法和关系的对象的抽象,它封装了数据和行为,是面向对象程序设计(oop)的基础,具有封装性、继承性和多态性等三大特性,是项目代码中基础的单元。类对象包含了类名、属性和操作函数,例如,定义一个“教师类”,这个教师的属性可以有姓名、年龄、所任教学校等,而这个“教师类”的操作可以理解为是所有教师都可以执行的方法,如教学指导、教研工作以及学习总结等。

可选的,步骤101包括:

获取待评测的目标代码;

根据所述目标代码的语言类型,识别所述目标代码中的类标识符;

根据所述类标识符,提取所述目标代码中的多个类对象,其中,所述类对象的类型包括通用类及接口类。

本可选实施例中,不同的语言类型,对类对象的定义方式不同,在识别代码中的标识符之前,先对代码的语言类型进行检测,检测方式很多,可以是对所述目标代码的文件名称进行识别,通过所述文件名称中的后缀符确定语言类型,也可以是对所述目标代码进行扫描识别,通过代码的特性确定语言类型,等等。然后根据预置各个语言类型所对应的类对象的标识符,通过标识符识别的方式,就能识别出不同开发语言所独有的类对象定义方式,例如在java语言中,“publicclassobjectname{}”就是一个名为objectname的类对象,标识符为“publicclass”。

本可选实施例中,由于待评测的目标代码都是按照同一语言规范编写的可运行的代码,因此,类对象的提取只需按照这一语言的编写规则进行识别即可,同理,提取到类对象之后,根据类对象的具体类型及标识符,识别并提取类对象对应的名称、属性及操作函数,其中,类对象的类型有通用类和接口类,各对应的提取方式有所不同,因此要区分类型。

本可选实施例中,类对象可以分为通用类和接口类,接口(interface)是一种特殊的类,它具有类的结构但不可被实例化,只可以被子类实现。它包含抽象操作,但不包含属性。它描述了类或组件对外可见的动作。通用类和接口类的区别为是否包含属性,对应通用类,在做关系分析前,需要提取它的类名、属性和操作函数,而对于接口类,则无需提取它的属性,只需提取到类名及操作即可进行关系分析。

102、分别提取各所述类对象的类名、属性及操作函数并进行调用关系解析,得到各所述类对象之间的调用关系;

本实施例中,在构建关系图之前,需要先解析各个类对象之间的调用关系,其中,调用关系有依赖、关联、聚合、组合、泛化及实现,不同的调用关系使用不同的箭头表示,便于在做关系分析的时候识别调用关系,并进一步构建用户提交的代码所对应的整体关系图。

可选的,步骤102包括:

根据各所述类对象的类型,提取各所述通用类的类名、属性及操作函数,以及提取各所述接口类的类名及操作函数;

解析各所述类对象的类名、属性及操作函数,构建各所述类对象之间的调用关系,其中,所述调用关系包括依赖、关联、聚合、组合、泛化及实现中的一种或多种。

本可选实施例中,类对象之间的调用关系可以分为6种:依赖、关联、聚合、组合、泛化及实现,其中,依赖(dependency)关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联;关联(association)关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师和学生、师傅和徒弟、丈夫和妻子等,关联关系是类与类之间最常用的一种关系,分为一般关联关系、聚合关系和组合关系;聚合(aggregation)关系是关联关系的一种,是强关联关系,是整体和部分之间的关系,是has-a的关系;组合(composition)关系也是关联关系的一种,也表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系,是cxmtains-a关系;泛化(generalization)关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系,是is-a的关系;实现(realization)关系是接口与实现类之间的关系。

本可选实施例中,依赖关系在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责;关联关系在代码中通常将一个类的对象作为另一个类的成员变量来实现关联关系;聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。例如,学校与老师的关系,学校包含老师,但如果学校停办了,老师依然存在;在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。例如,头和嘴的关系,没有了头,嘴也就不存在了;在代码实现时,使用面向对象的继承机制来实现泛化关系,例如,student类和teacher类都是person类的子类;在实现关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作,例如,汽车和船实现了交通工具。

103、根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图,并对所述第一调用关系图进行矩阵化处理,得到第一关系特征矩阵;

本实施例中,提取到用户提交的代码中的所有类对象之后,进一步分析这些类对象之间的调用关系,从而识别出其中的设计模式。通过解析这些类对象,并构建这些类之间的关系图,能够使原本抽象的类可视化地表示出来,使其中的关系清晰明了。关系图的构建方式可以根据统一建模语言(unifiedmodelinglanguage,uml)来构建关系模型,uml是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。uml是面向对象设计的建模工具,独立于任何具体程序设计语言。

本实施例中,可以利用uml建模工具可以自动化地构建软件蓝图,也可以利用部分代码编辑器自带的uml图生成功能,还可以利用爬虫爬取业务逻辑实现类的uml图,关系图的构建方式很多,只要统一使用一种构建方式就能达到最终的对比效果。

104、获取多个预置代码设计模式分别对应的多个第二调用关系图,并分别对各所述第二调用关系图进行矩阵化处理,得到多个第二关系特征矩阵;

本实施例中,在做相似度分析之前,需要对调用关系进一步数字化处理,通过矩阵的方式来表达关系图中各类对象之间的关系特征,以及经典的23种设计模式的关系图特征,从而创造抽象设计模式的可对比性及可计算性。需要说明的是,对关系图进行矩阵化处理并不是图像处理技术,而是对构建出来的关系图中各类对象的连接关系进行数字化的表示,这个关系图可以是虚拟的结构图,用以表达类对象之间的调用关系,只要通过这个关系图,能够进一步地计算各类对象的调用关系,即能达到最终的目的。

105、根据所述第一关系特征矩阵及各所述第二关系特征矩阵,计算所述目标代码分别与各所述代码设计模式之间的相似度矩阵;

本实施例中,通过相似度评分算法计算得到的相似度矩阵就是待评测代码与各个设计模式之间的相似度表示,通常情况下,对于每种设计模式,待评测代码中只包含该设计模式的一个实例,此时每个设计模式关联代码中的一个类对象,本实施例提出的方法目前只考虑包含一个设计模式实例的情况。相似度矩阵中的元素表示两个类对象之间的相似度得分,因此,综合这些相似度得分,就能计算出代码的整体分值。

106、根据所述相似度矩阵,分别计算所述目标代码在对应代码设计模式下的代码质量分值。

本实施例中,由于相似度矩阵中的元素表示两个类对象之间的相似度,通过综合计算所述相似度矩阵中所有元素的相似度得分的平均分,就能得到所述待评测的目标代码与各个代码设计模式之间的相似度得分,即所述目标代码在对应代码设计模式下的代码质量分值。本实施例还能进一步地根据这些代码质量分值计算所述目标代码的平均分,作为所述目标代码质量分值更直观的表示。

本发明实施例中,为了对代码进行评测,需要抽离出代码中的类对象,通过分析这些类对象之间的调用关系,构建这些类对象之间的关系图,从而识别待评测代码与优秀的代码设计模式之间的相似度,其中用于对比的代码设计模式具有规范的设计模式思想,可以预先配置这些代码设计模式的类对象关系图,并与待评测代码的关系图进行矩阵化对比,通过矩阵的相似度计算算法,计算出待评测代码与范例代码对应的设计模式之间的相似度,从而算出待评测代码的综合评分。本发明实施例中能够对代码的设计模式进行自动识别与分析,从而实现代码质量的综合评分,更为科学准确地评价代码质量,提高了代码质量检测的效率和检测准确度。

请参阅图2,本发明实施例中代码质量评测方法的第二个实施例包括:

201、获取待评测的目标代码,并提取所述目标代码中的多个类对象;

202、分别提取各所述类对象的类名、属性及操作函数并进行调用关系解析,得到各所述类对象之间的调用关系;

203、根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图,并对所述第一调用关系图进行矩阵化处理,得到第一关系特征矩阵;

可选的,步骤203包括:

根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图;

根据所述第一调用关系图中各所述类对象之间的调用关系,生成各所述调用关系对应的第一调用关系矩阵;

随机定义各所述第一调用关系矩阵中不重复的第一根值,并分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第一更新值,得到多个新的第一调用关系矩阵;

依次对所述第一调用关系图中各所述类对象之间的调用关系对应的新的第一调用关系矩阵进行点乘合并计算,得到所述目标代码对应的第一关系特征矩阵。

本可选实施例中,首先为各调用关系定义一个形式化的矩阵,下面以关联关系g为例进行说明,假设有所述第一调用关系图m,m中包含的类对象有,那么,

其中,

上述公式中,i和j为1到n的整数,且同理可定义其它5个调用关系对应的第一调用关系矩阵。

本可选实施例中,定义了第一调用关系矩阵之后,为了将6个关系矩阵组合成一个总的第一关系特征矩阵,我们给每个调用关系矩阵随机定义一个不同素数的根值,然后将每个矩阵的原元素值更改为新值,新值为所述第一关系矩阵对应的第一根值的原元素值次幂,得到多个新的第一调用关系矩阵。然后,计算所述第一关系特征矩阵,所述第一关系特征矩阵的每个元素值为所述设计模式所包含的调用关系对应的新的第一调用关系矩阵中相应元素值的乘积,即对所述设计模式所包含的所有调用关系对应的新的第一调用关系矩阵进行点乘合并计算。例如,对于装饰模式,有2个类有关联关系,4个类有泛化关系,假设随机定义的依赖、关联、聚合、组合、泛化及实现的根值为2,3,4,6,8,9,那么,第一特征矩阵中某个单位元素u的值可能为:

同理可得总的第一关系特征矩阵中的其它单位元素的值,最后进行点乘计算得到一个合并的第一关系特征矩阵。

204、获取多个预置代码设计模式分别对应的多个第二调用关系图,并分别对各所述第二调用关系图进行矩阵化处理,得到多个第二关系特征矩阵;

可选的,步骤204包括:

获取多个预置代码设计模式分别对应的多个第二调用关系图,并识别各所述第二调用关系图中各类对象之间的调用关系及对应的所述第一调用关系矩阵;

分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第二更新值,得到多个新的第二调用关系矩阵;

依次对所述第二调用关系图中各所述类对象之间的调用关系对应的新的第二调用关系矩阵进行点乘合并计算,得到各所述代码设计模式对应的第二关系特征矩阵。

本可选实施例中,计算各个设计模式对应的第二关系特征矩阵,与待评测代码的第一关系特征矩阵计算方法类似,不同的是在关系图的生成方面,所述代码设计模式的第二调用关系图是根据一些代码范例或模板生成的,这些代码范例严格地按照各设计模式的思想进行编写,是各种设计模式的示例和模板,也是待检测代码的对比和效仿对象。另外,各关系矩阵的根值与待评测代码中定义的根值相同,能使计算出来的总的特征矩阵保持一致的特征表达,客观地反映出关系图中所包含的连接关系数量,从而使设计模式和待评测代码之间产生了可比性。

205、根据所述第一关系特征矩阵及各所述第二关系特征矩阵,计算所述目标代码分别与各所述代码设计模式之间的相似度矩阵;

可选的,步骤205包括:

分别判断所述第一关系特征矩阵的第一矩阵维度与各所述第二关系特征矩阵的第二矩阵维度是否不同;

若是,则将矩阵维度不同的第一关系特征矩阵与第二关系特征矩阵映射到同一矩阵维度,得到第一目标关系特征矩阵和第二目标关系特征矩阵;

分别计算所述第一目标关系特征矩阵与所述第二目标关系特征矩阵中同一位置的矩阵元素之间的欧几里得距离,得到所述目标代码分别与各所述代码设计模式之间的相似度矩阵。

本可选实施例中,由于待检测代码和设计模式对应的范例代码可能包含不同数量的类对象,会导致这两者生成的特征矩阵不在同一个维度空间,也就是行列数不同,使得两个特征矩阵之间无法进一步地进行计算,因此,在计算相似度矩阵之前,需要把两个矩阵映射到同一维度,才能进一步对两个矩阵中对应的元素进行相似度计算。首先判断两个特征矩阵是否在同一维度,若在同一维度,则无需映射步骤,直接执行所述分别计算所述第一目标关系特征矩阵与各第二目标关系特征矩阵的余弦相似度,得到所述目标代码分别与各代码设计模式之间的相似度矩阵的步骤。否则,需要将低维矩阵向高维矩阵映射,方法类似于神经网络模型中的膨胀卷积,对矩阵进行空洞卷积处理,对于膨胀的部分,用0或1填充,就能使其膨胀结果不影响最后的计算结果。

206、分别判断各所述相似度矩阵中各元素值是否大于或等于预置阈值,并统计所述相似度矩阵中大于或等于所述阈值的元素个数;

207、分别计算所述元素个数占各所述相似度矩阵元素总个数的比例值,得到所述目标代码在对应代码设计模式下的代码质量分值。

本实施例中,最后算出的相似度矩阵中各元素值表示两个类之间的相似度得分,因此,需要设置一个临界值,当相似度得分大于该临界值时,就认为这两个类匹配,最后统计匹配的类的数量占总元素(总类对象数)的比例,就能得到待评测代码与各个设计模式之间的相似度分值,就是所述目标代码在对应代码设计模式下的代码质量分值。

本发明实施例中,为了使抽象的设计模式与实际代码之间产生可比性,使用同样的方式对两者的类对象关系图进行矩阵化处理,通过矩阵的方式表示类对象之间的连接方式特征,进而计算实际代码对应的矩阵与各个设计模式对应的矩阵之间的相似度得分,最后计算这些相似度得分的平均分作为代码的质量分值。本发明实施例通过设计模式和代码之间进行量化比较,能够对代码质量进行打分,使代码质量的评测更直观和更智能。

上面对本发明实施例中代码质量评测方法进行了描述,下面对本发明实施例中代码质量评测装置进行描述,请参阅图3,本发明实施例中代码质量评测装置的一个实施例包括:

获取模块301,用于获取待评测的目标代码,并提取所述目标代码中的多个类对象;

提取模块302,用于分别提取各所述类对象的类名、属性及操作函数并进行调用关系解析,得到各所述类对象之间的调用关系;

构建模块303,用于根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图,并对所述第一调用关系图进行矩阵化处理,得到第一关系特征矩阵;

矩阵化模块304,用于获取多个预置代码设计模式分别对应的多个第二调用关系图,并分别对各所述第二调用关系图进行矩阵化处理,得到多个第二关系特征矩阵;

计算模块305,用于根据所述第一关系特征矩阵及各所述第二关系特征矩阵,计算所述目标代码分别与各所述代码设计模式之间的相似度矩阵;

打分模块306,用于根据所述相似度矩阵,分别计算所述目标代码在对应代码设计模式下的代码质量分值。

可选的,所述获取模块301具体用于:

获取待评测的目标代码;

根据所述目标代码的语言类型,识别所述目标代码中的类标识符;

根据所述类标识符,提取所述目标代码中的多个类对象,其中,所述类对象的类型包括通用类及接口类。

可选的,所述提取模块302具体用于:

根据各所述类对象的类型,提取各所述通用类的类名、属性及操作函数,以及提取各所述接口类的类名及操作函数;

解析各所述类对象的类名、属性及操作函数,构建各所述类对象之间的调用关系,其中,所述调用关系包括依赖、关联、聚合、组合、泛化及实现中的一种或多种。

可选的,所述构建模块303具体用于:

根据所述调用关系,构建所述目标代码中各类对象的第一调用关系图;

根据所述第一调用关系图中各所述类对象之间的调用关系,生成各所述调用关系对应的第一调用关系矩阵;

随机定义各所述第一调用关系矩阵中不重复的第一根值,并分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第一更新值,得到多个新的第一调用关系矩阵;

依次对所述第一调用关系图中各所述类对象之间的调用关系对应的新的第一调用关系矩阵进行点乘合并计算,得到所述目标代码对应的第一关系特征矩阵。

可选的,所述矩阵化模块304具体用于:

获取多个预置代码设计模式分别对应的多个第二调用关系图,并识别各所述第二调用关系图中各类对象之间的调用关系及对应的所述第一调用关系矩阵;

分别计算各所述第一调用关系矩阵中各矩阵元素值对应的第二更新值,得到多个新的第二调用关系矩阵;

依次对所述第二调用关系图中各所述类对象之间的调用关系对应的新的第二调用关系矩阵进行点乘合并计算,得到各所述代码设计模式对应的第二关系特征矩阵。

可选的,所述计算模块305具体用于:

分别判断所述第一关系特征矩阵的第一矩阵维度与各所述第二关系特征矩阵的第二矩阵维度是否不同;

若是,则将矩阵维度不同的第一关系特征矩阵与第二关系特征矩阵映射到同一矩阵维度,得到第一目标关系特征矩阵和第二目标关系特征矩阵;

分别计算所述第一目标关系特征矩阵与所述第二目标关系特征矩阵中同一位置的矩阵元素之间的欧几里得距离,得到所述目标代码分别与各所述代码设计模式之间的相似度矩阵。

可选的,所述打分模块306具体用于:

分别判断各所述相似度矩阵中各元素值是否大于或等于预置阈值,并统计所述相似度矩阵中大于或等于所述阈值的元素个数;

分别计算所述元素个数占各所述相似度矩阵元素总个数的比例值,得到所述目标代码在对应代码设计模式下的代码质量分值。

本发明实施例中,为了对代码进行评测,需要抽离出代码中的类对象,通过分析这些类对象之间的调用关系,构建这些类对象之间的关系图,从而识别待评测代码与优秀的代码设计模式之间的相似度,其中用于对比的代码设计模式具有规范的设计模式思想,可以预先配置这些代码设计模式的类对象关系图,并与待评测代码的关系图进行矩阵化对比,通过矩阵的相似度计算算法,计算出待评测代码与范例代码对应的设计模式之间的相似度,从而算出待评测代码的综合评分。本发明实施例中能够对代码的设计模式进行自动识别与分析,从而实现代码质量的综合评分,更为科学准确地评价代码质量,提高了代码质量检测的效率和检测准确度。

上面图3从模块化功能实体的角度对本发明实施例中的代码质量评测装置进行详细描述,下面从硬件处理的角度对本发明实施例中计算机设备进行详细描述。

图4是本发明实施例提供的一种计算机设备的结构示意图,该计算机设备500可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessingunits,cpu)510(例如,一个或一个以上处理器)和存储器520,一个或一个以上存储应用程序533或数据532的存储介质530(例如一个或一个以上海量存储设备)。其中,存储器520和存储介质530可以是短暂存储或持久存储。存储在存储介质530的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对计算机设备500中的一系列指令操作。更进一步地,处理器510可以设置为与存储介质530通信,在计算机设备500上执行存储介质530中的一系列指令操作。

计算机设备500还可以包括一个或一个以上电源540,一个或一个以上有线或无线网络接口550,一个或一个以上输入输出接口560,和/或,一个或一个以上操作系统531,例如windowsserve,macosx,unix,linux,freebsd等等。本领域技术人员可以理解,图4示出的计算机设备结构并不构成对计算机设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

本发明还提供一种计算机设备,所述计算机设备包括存储器和处理器,存储器中存储有计算机可读指令,计算机可读指令被处理器执行时,使得处理器执行上述各实施例中的所述代码质量评测方法的步骤。

本发明还提供一种计算机可读存储介质,该计算机可读存储介质可以为非易失性计算机可读存储介质,该计算机可读存储介质也可以为易失性计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令在计算机上运行时,使得计算机执行所述代码质量评测方法的步骤。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

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