重复代码片段查询方法和装置制造方法及图纸

技术编号:15762730 阅读:194 留言:0更新日期:2017-07-05 22:41
本发明专利技术提供了一种重复代码片段查询方法和装置,通过对多个代码片段所构成的代码序列确定各后缀之后,将各后缀所包含的代码片段在代码序列中的排序位置作为元素,构造代码序列的后缀数组,从而根据由后缀数组中的各元素所计算出的各后缀之间的公共部分,查询所述多个代码片段中的重复代码片段。由于所构造的后缀数组中存储的仅为一个指示后缀中代码片段所在排序位置的数值,而不是将后缀中代码片段的内容存储在后缀数组中,因此,也就不必将全部的代码片段内容存储在内存中,从而运行的开销较小,解决了现有技术中查询是否存在重复代码片段时,运行开销较大的技术问题。

Method and device for querying repeated code fragments

The invention provides a duplicate code fragment query method and device, then determine the suffix by code sequence composed of a plurality of code fragments, the ranking position of each suffix contains the code fragment in the code sequence as the elements, structure of the code sequence number suffix group, according to the common part between the suffix by each element in the suffix array to calculate the query, the plurality of code fragments in duplicate code fragment. Because the storage structure of the suffix array is only in numerical order where the code fragment indicating a suffix, rather than suffix code fragments of the contents stored in the suffix array, therefore, is not bound to all of the code fragment content stored in memory, and run from the smaller overhead, solve in the prior art query whether there are duplicate code fragments, the problem of larger operation cost.

【技术实现步骤摘要】
重复代码片段查询方法和装置
本专利技术涉及信息技术,尤其涉及一种重复代码片段查询方法和装置。
技术介绍
在软件开发过程中,经常会将工作量较大的软件开发项目分割为工作量较小的子项目,并由不同的程序员分别对子项目编写程序代码。当两个不同的子项目均需要用到同一个程序段时,往往会出现两个不同的子项目中出现完全相同的程序代码,在这种情况下,若需要对该程序段进行修改,则需要对各子项目中重复出现的全部该程序段均进行修改,工作量较大且容易出现错误。因此,在对子项目进行整合之后,需要对整合所获得的项目进行优化,具体来说,需要针对项目的程序代码进行重复代码片段的查询,将查询出的重复代码片段进行复用或者说合并,从而提高可维护性。现有技术中在查询重复代码片段时,需要针对每一个代码片段依次与其余代码片段进行比较,从而判断出是否存在重复代码片段,由于这种方式需要将全部的代码片段数据存储在内存中,因此运行开销较大。
技术实现思路
本专利技术提供一种重复代码片段查询方法和装置,用于解决现有技术中查询是否存在重复代码片段时,运行开销较大的技术问题。为达到上述目的,本专利技术的实施例采用如下技术方案:第一方面,提供了一种重复代码片段查询方法,包括:获取包含多个代码片段的代码序列的各后缀;将各后缀所包含的代码片段在所述代码序列中的排序位置作为元素,构造所述代码序列的第一后缀数组;根据由所述第一后缀数组中的各元素所得到的后缀,计算各后缀之间的公共部分;利用所述公共部分,查询所述多个代码片段中的重复代码片段。第二方面,提供了一种重复代码片段查询装置,包括:后缀模块,用于获取包含多个代码片段的代码序列的各后缀;构造模块,用于将各后缀所包含的代码片段在所述代码序列中的排序位置作为元素,构造所述代码序列的第一后缀数组;计算模块,用于根据由所述第一后缀数组中的各元素所得到的后缀,计算各后缀之间的公共部分;查询模块,用于利用所述公共部分,查询所述多个代码片段中的重复代码片段。本专利技术实施例提供的重复代码片段查询方法和装置,通过对多个代码片段所构成的代码序列确定各后缀之后,将各后缀所包含的代码片段在代码序列中的排序位置作为元素,构造代码序列的后缀数组,从而根据由后缀数组中的各元素所计算出的各后缀之间的公共部分,查询所述多个代码片段中的重复代码片段。由于所构造的后缀数组中存储的仅为一个指示后缀中代码片段所在排序位置的数值,而不是将后缀中代码片段的内容存储在后缀数组中,因此,也就不必将全部的代码片段内容存储在内存中,从而运行的开销较小,解决了现有技术中查询是否存在重复代码片段时,运行开销较大的技术问题。上述说明仅是本专利技术技术方案的概述,为了能够更清楚了解本专利技术的技术手段,而可依照说明书的内容予以实施,并且为了让本专利技术的上述和其它目的、特征和优点能够更明显易懂,以下特举本专利技术的具体实施方式。附图说明通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本专利技术的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:图1为本专利技术实施例一提供的一种重复代码片段查询方法的流程示意图;图2为重复代码片段查询方法的执行示意图;图3为本专利技术实施例二提供的一种重复代码片段查询方法的流程示意图;图4为逐个源文件进行处理的流程示意图;图5为逐行对源文件的代码进行处理的流程示意图;图6为高度数组的计算示意图;图7为本专利技术实施例三提供的一种重复代码片段查询装置的结构示意图;图8为本专利技术实施例四提供的一种重复代码片段查询装置的结构示意图。具体实施方式下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。为了便于理解本专利技术所提供的重复代码片段查询方法和装置,在描述具体实施例之前,对实施例中所涉及的技术术语进行解释:序列(Sequence):元素的有序排列。在本专利技术实施例中,将代码片段作为元素,对这些代码片段进行有序排列所获得的序列称为代码序列。后缀(Suffix):后缀是指从某一个位置i开始到整个序列结尾的一个子序列,也叫子串或余串,记做Suffix(i)。后缀数组:后缀数组是一个一维数组,它用于记录后缀的有序排列。在本专利技术实施例中,第一后缀数组中的元素为后缀中所包含的代码片段在代码序列中的排序位置,第二后缀数组中的元素为后缀的内容。名次数组:名次数组Rank[i]保存的是Suffix(i)在所有后缀中从小到大排列的“名次”。高度数组:定义高度数组中的元素height[i]=Suffix(sa[i-1])和Suffix(sa[i])的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。那么对于j和k,不妨设rank[j]<rank[k],则有以下性质:Suffix(j)和Suffix(k)的最长公共前缀为height[rank[j]+1],height[rank[j]+2],height[rank[j]+3],…,height[rank[k]]中的最小值。最长公共前缀:最长公共前缀是指从两个后缀的第一个元素开始,所能够获得的两后缀之间具有的最长相同部分,这里的最长相同部分也称为公共部分,这个最长相同部分所包含的元素数称为最长公共前缀的长度。例如两个后缀分别为“accs”和“acbsa”则两个后缀的最长公共前缀为“ac”,长度为2。停用词:可以明确表示整行为非有效代码的词,如“#include”,“import”。根据语言的不同,停用词会各不相同。此处简要解释了技术术语的含义,以上技术术语会在后续结合具体实施例进行进一步地解释。下面结合附图对本专利技术实施例提供的重复代码片段查询方法和装置进行详细描述。实施例一在程序开发过程中,程序员从网络或者其他位置复制了同一段代码并将其粘贴到当前所开发的程序中的不同位置时,便会在多个源文件中的不同位置中出现重复代码片段。由于重复代码片段极易导致程序的维护性差,因此,作为程序质量评价的指标之一,需要对源文件中各代码片段所构成的代码序列中是否存在重复代码片段进行查询。作为一种可能的实现方式,本实施例所提供的方法可以由代码质量评价工具执行。图1为本专利技术实施例一提供的一种重复代码片段查询方法的流程示意图,如图1所示,方法包括:步骤101、获取包含多个代码片段的代码序列的各后缀。其中,源文件中的代码被预先划分为各个代码片段,每一个代码片段包括预设行的程序代码,这里的预设行数可以根据查询精度进行确定,若需要较高的查询精度,可以设置较低的预设行数,若需要较低的查询精度,可以设置较高的预设行数,但预设行数的取值至少为一。在不同次的查询中,各次查询所划分的代码片段之间可以具有相同的行数,也可以具有不同的行数。为了便于代码片段的划分,每一次查询中,各代码片段之间可以具有相同的行数。作为一种可能的实现方式,根据各个代码片段在源文件中所在行的前后位置,按照预设顺序,例如由前至后的顺序或者由后至前的顺序,对代码片段进行排序,获得代码序列,在代码序列中,每一个元素对应源文件中的一个本文档来自技高网...
重复代码片段查询方法和装置

【技术保护点】
一种重复代码片段查询方法,其特征在于,包括:获取包含多个代码片段的代码序列的各后缀;将各后缀所包含的代码片段在所述代码序列中的排序位置作为元素,构造所述代码序列的第一后缀数组;根据由所述第一后缀数组中的各元素所得到的后缀,计算各后缀之间的公共部分;利用所述公共部分,查询所述多个代码片段中的重复代码片段。

【技术特征摘要】
1.一种重复代码片段查询方法,其特征在于,包括:获取包含多个代码片段的代码序列的各后缀;将各后缀所包含的代码片段在所述代码序列中的排序位置作为元素,构造所述代码序列的第一后缀数组;根据由所述第一后缀数组中的各元素所得到的后缀,计算各后缀之间的公共部分;利用所述公共部分,查询所述多个代码片段中的重复代码片段。2.根据权利要求1所述的重复代码片段查询方法,其特征在于,所述根据由所述第一后缀数组中的元素所得到的后缀,计算后缀的公共部分包括:从所述代码序列中,读取第一后缀数组中元素所指示的排序位置得到后缀;根据得到的后缀对应代入第一后缀数组所得到的第二后缀数组,计算得到各后缀之间的最长公共前缀。3.根据权利要求1所述的重复代码片段查询方法,其特征在于,所述利用公共部分,查询所述多个代码片段中的重复代码片段包括:当至少两个后缀之间存在公共部分时,确定所述多个代码片段中存在重复代码片段。4.根据权利要求3所述的重复代码片段查询方法,其特征在于,所述确定所述多个代码片段中存在重复代码片段之后,还包括:确定所述公共部分对应的重复代码片段在所述代码序列中的排序位置。5.根据权利要求4所述的重复代码片段查询方法,其特征在于,所述代码序列是根据各代码片段在源文件中的位置,对各代码片段进行排序得到的;所述确定所述公共部分对应的重复代码片段在所述代码序列中的排序位置之后,还包括:根据所述重复代码片段在所述代码序列中的排序位置,确定所述重复代码片段在所述源文件中的位置。6.根据权利要求1所述的重复代码片段查询方法,其特征在于,所述构造代码序列的第一后缀数组,包括:对所述代码序列的各后缀按照字典序进行排序;将排序后的各后缀所包含的第一个代码片段在所述代码序列中的排序位置作为所述第一后缀数组中对应元素的取值。7.根据权利要求1-6任一项所述的重复代码片段查询方法,其特征在于,所述获取包含多个代码片段的代码序列的各后缀之前,还包括:根据预设规则对代码片段中的各行代码进行预处理。8.根据权利要求7所述的重复代码片段查询方法,其特征在于,所述预设规则,包括:针对每一行代码,删除以停用词为开头的代码所在行;和/或,针对每一行代码,删除预设字符;和/或,若所述代码片段分别属于至少两个源文件,在每一个源文件的结尾增加所述源文件对应的分隔行。9.根据权利要求8所述的重复代码片段查询方法,其特征在于,所述分隔行包括所述源文件的唯一标识和/或所述源文件的存储路径;所述预设字符包括...

【专利技术属性】
技术研发人员:屠寅海
申请(专利权)人:阿里巴巴集团控股有限公司
类型:发明
国别省市:开曼群岛,KY

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1