一种基于代码依赖关系的过时需求自动检测方法及系统的制作方法

文档序号:10471050阅读:214来源:国知局
一种基于代码依赖关系的过时需求自动检测方法及系统的制作方法
【专利摘要】本发明公开了一种基于代码依赖关系的过时需求自动检测方法,该方法包括:步骤一、比较代码新旧版本间的差异,识别其中影响需求的变更代码元素;步骤二、引入代码中与变更代码元素结构上紧密依赖的其它代码元素,构造变更域;步骤三、提取代码元素的描述信息,形成变更域描述文本;步骤四、发现与代码变更相关的近似候选过时需求集合;步骤五、利用基于相似度值的表决算法,生成近似候选过时需求集合的排序。本发明通过对代码依赖关系的分析,补充了代码变更的上下文信息,从而提高了过时需求检测时的精度,并且该方法能够被自动化执行。本发明还包括一种基于代码依赖关系的过时需求自动检测系统。
【专利说明】
-种基于代码依赖关系的过时需求自动检测方法及系统
技术领域
[0001] 本发明属于计算机软件维护领域,具体设及一种基于代码依赖关系的过时需求自 动检测方法及系统,能够高效、自动化且准确地检测出代码变更后,潜在需要被同步更新的 需求实体。
【背景技术】
[0002] 在软件版本更新的过程中,一份最新的需求规约将提供有价值的知识来帮助系统 维护人员完成维护工作。事实上,需求规约能够解释系统实现背后的逻辑,突出系统中的关 键部分,帮助维护人员理解程序。
[0003] 然而,在软件系统更新时,维护人员需要逐个检查需求文档库中的每个需求文档, 并判断需求文档是否应该被同步更新,W及如何被更新,运需要付出大量的人力成本。因 此,维护人员通常只更新代码而不更新需求,运将导致需求的过时和失效。过时需求是指需 求规约中不再反映利益相关者当前需要的需求。
[0004] 目前,基于信息检索的过时需求自动检测方法,能够自动地为系统维护人员识别 出文档库中可能需要被同步更新的需求文档,从而减少识别过时需求的时间成本。已有的 自动化检测方法中,将从变更代码中抽取关键词,作为变更的描述文本,利用信息检索技 术,通过对变更文本和需求文本进行关键词匹配,能够定位与变更文本相似度高的需求,贝U 此次代码更新被认为可能与目标需求有关,目标需求需要被同步更新。然而,由于信息检索 方法存在词汇失配的问题,该方法的效果严重依赖于变更文本的语料质量,已有方法在构 造变更文本时,对于文本信息的界定只停留在代码的变更部分。

【发明内容】

[0005] 针对现有技术的不足,本发明的目的是提供一种基于代码依赖关系的过时需求自 动检测方法,提高自动化检测的准确度和覆盖率,同时提供一种基于代码依赖关系的过时 需求自动检测系统。
[0006] 由于某一特定需求的实现是由分布在源程序中的多个代码元素协作完成的,因此 与变更代码存在强依赖关系的上下文代码信息,同样能够用于补充变更的描述文本。本发 明的一种基于代码依赖关系的过时需求自动检测方法,通过分析代码依赖关系,构造代码 变更的描述文本。其包括W下步骤:
[0007] 步骤1,比较新旧版本代码间的差异,识别其中影响需求的变更代码元素;
[000引步骤2,若存在变更代码元素,则W变更代码元素为基础,根据代码依赖关系,引入 代码中与变更代码元素结构上紧密依赖的其它代码元素,构造变更域;
[0009] 若不存在变更代码元素,则结束流程;
[0010] 步骤3,对于每个变更域,提取变更域中所有代码元素的描述信息,形成变更域的 描述文本;
[0011] 步骤4,汇集所有变更域的描述文本,形成变更域文本集合;通过计算变更域文本 集合与旧版本代码需求集合的相似度,发现与变更代码元素相关的近似候选过时需求集 合;
[0012] 步骤5,利用基于相似度值的表决算法,生成近似候选过时需求集合的排序。
[0013] 上述技术方案的进一步特征在于:步骤1中,通过比较新旧两个版本的代码,识别 两个版本间发生变更的代码元素,代码元素的粒度为函数或域。将运些代码元素的新增或 删除作为候选的代码变更。然后,过滤候选的代码变更中与重命名操作有关的变更,得到影 响需求的变更代码元素。将新旧版本间影响需求的变更代码元素集合记为C=kl,C2,···, cn},将一个变更代码元素记为c =〈Element ID,化 angeType ,ElementTyp〉,其中Element ID 为变更代码元素的唯一标识。化angeType表示变更的类型(新增或删除),ElementType表示 变更代码元素的粒度(函数或域)。
[0014] 本发明步骤2包括W下步骤:
[0015] 步骤2.1,根据函数间的调用关系,可W为某一版本的系统源代码生成函数调用依 赖图,函数调用依赖图由V和E构成,其中V为顶点的集合,V中的元素 V表示一个函数;E为边 的集合,E中的元素 e =〈source,ta;rget〉,source ,targetEV,表示函数source中发生了对 函数化rget的调用。根据紧密度原则的计算公式,依赖边e的紧密度为:
[0016]
[0017] 其中OutDegree_e . source表不顶点source的出度,InDegree_e . target表不顶点 化rget的入度。由此可分别计算新旧版本中代码元素间相互依赖的紧密度值。
[0018] 步骤2.2,在系统的函数调用依赖图上,设置紧密度阔值k,删除紧密度值小于k的 依赖边,将一个完整的函数调用依赖图划分为若干代码元素间有强依赖关系的子图。对于 集合C中每一个代码元素粒度为函数的变更代码元素,获取该变更代码元素所在强依赖子 图,变更代码元素与子图中其他元素一起构成该变更代码元素的初始变更域。
[0019] 步骤2.3,若两个变更代码元素之间存在函数调用依赖,则将各自所属的初始变更 域合并为一个新的变更域。在合并后,若存在粒度为函数的变更代码元素且该元素的初始 变更域只包含它本身一个元素,则将该变更代码元素划入拥有该函数所属类的子元素数量 最多的变更域中。然后,对于粒度为域的变更代码元素,若该域被任何变更域中的函数引 用,则将该域划入对应的变更域中,对于没有被任何变更域中函数引用的域,用运些域元素 构造一个新的变更域。
[0020] 本发明步骤3中,对于变更域中的每一个代码元素,根据其粒度和来源的不同,抽 取相应的关键词,加入该变更域的描述文本。抽词规则如下:
[0021] 1.若代码元素粒度为函数,且为新增或删除的元素,则抽取该函数的函数名,参数 名,函数的注释,函数所属类的类名和注释作为关键词。
[0022] 2.若代码元素粒度为函数,且为旧版本代码中已存在的元素,则抽取该函数的函 数名,参数名,函数所属类的类名作为关键词。
[0023] 3.若代码元素粒度为域,则抽取该域的域名,域所属类的类名和注释作为关键词。
[0024] 本发明步骤4包括W下步骤:
[0025] 步骤4.1,对变更域描述文本和旧版本代码需求文本进行文本预处理,过程包括词 移除停用词,词形还原和词干提取。特别的,对于从代码中抽取的变更域描述文本,需要首 先根据驼峰命名法等变量命名规则进行分词。
[0026] 步骤4.2,基于信息检索技术,计算变更域描述文本集合和旧版本代码需求文本集 合间的文本相似度。W向量空间模型为例,将变更文本和需求文本用高维向量q,r表示,向 量中每个维度W对应一个单词的权重,权重W可用TF-IDF公式计算。对于q,r两个高维向量, 可利用余弦距离计算向量间的余弦相似度。
[0027] 本发明步骤5包括W下步骤:
[0028] 步骤5.1,根据已知的变更域描述文本集合与旧版本代码需求文本集合间的相似 度值,对于近似候选过时需求集合中的每一个需求文本,累加其与所述变更域文本集合中 各个变更域文本的相似度值,作为该需求的总得分。
[0029] 步骤5.2,将需求集合按需求的总得分倒叙排列,作为近似候选过时需求集合的最 终排序。
[0030] 此外,本发明还设及一种基于代码依赖关系的过时需求自动检测系统,包括:
[0031] 用户交互模块,用于向检测系统提供旧版本代码的需求文档库,新旧版本的代码; 包括版本管理系统集成模块和图形界面集成模块;
[0032] 代码版本比较模块,用于识别版本间的代码变更;
[0033] 代码依赖静态分析模块,用于分析代码间的依赖关系,获取变更代码元素和与变 更代码元素有强依赖关系的上下文代码信息;
[0034] 变更域构造 W及文本抽取模块,用于形成变更域文本集合;
[0035] 检索模块,用于计算得到近似候选过时需求的排序。
[0036] 本发明具有W下有益效果:本发明在自动化检测潜在的过时需求时,通过分析代 码依赖关系,引入与变更代码有强依赖关系的上下文信息,提高了过时需求自动检测方法 的精度,同时也保持了检测方法的高度自动化。本发明设及的系统与版本控制系统Github 相集成,同样提供图形化界面的版本,具有高可用性和广泛的应用前景。
【附图说明】
[0037] 图1为本发明实施例的一种基于代码依赖关系的过时需求自动检测方法的流程示 意图;
[0038] 图2为本发明实施例的一种基于代码依赖关系的过时需求自动检测系统;
[0039] 图3为本发明实施例的新旧版本间代码元素的区别;
[0040] 图4为本发明实施例的代码依赖关系图;
[0041 ]图5为本发明实施例的关键词提取规则;
[0042] 图6为本发明实施例的变更文本集合与需求文本集合的相似度矩阵;
[0043] 图7为本发明实施例的近似候选过时需求的排序。
【具体实施方式】
[0044] 下面结合附图和【具体实施方式】对本发明做更进一步的具体说明,本发明上述的或 其他方面的优点将会变得更加清楚。
[0045] 参考图1,为本发明实施例的一种基于代码依赖关系的过时需求自动检测方法。
[0046] 图2是本发明实施例的一种基于代码依赖关系的过时需求自动检测系统结构示意 图,包括用户交互模块,代码版本比较模块,代码依赖静态分析模块,变更域构造 w及文本 抽取模块,检索模块。其中用户交互模块包括:版本管理系统集成模块和图形界面集成模 块。为了有助于系统维护人员使用本发明,将本发明与目前主流的开源代码库W及版本控 制系统Github相集成。对于一个Github中的开源项目,维护人员只需提供项目的Github地 址,需求文档库的相对地址,并指定新旧两个版本的版本号(CommitID),系统将自动执行本 发明的技术W检测可能过时的需求,给维护人员提供近似候选过时需求排序。同时,系统还 提供一个图形化界面的版本,维护人员也可将本发明的技术应用于任意的本地项目。
[0047]由图2可见,用户向检测系统提供旧版本代码的需求文档库,新旧版本的代码,检 测系统能够识别版本间的代码变更,并自动分析代码间的依赖关系,获取变更代码元素和 与变更代码元素有强依赖关系的上下文代码信息,并计算得到近似候选过时需求的排序。 [004引实施例一
[0049] 下面通过一个具体的例子来解释方法是如何执行的。W开源系统AquaLush为例, AquaLush是一个由软件控制的灌概系统,可W基于用户提供的湿度、用水量等参数自动调 整灌概输出。假设在某一次的代码更新中,为AquaLush新增了日志记录功能,该功能可W记 录用户的历史操作,如用户对某区域湿度、用水量的设定等等,并且提供一个日志面板W展 示日志。根据如下步骤执行方法,能够为系统维护人员提供近似候选过时需求的排序:
[0050] 步骤1,将新旧两个版本的代码解析为代码元素(函数和域)的集合,识别两个版本 间新增或删除的代码元素。进一步地,通过比较变更代码元素的编辑距离,过滤候选的代码 变更中与重命名操作有关的变更,得到影响需求的变更代码元素。图3为AquaLush两个版本 间新增或删除的代码元素,被认为是影响需求的变更代码元素。
[0051] 步骤2,由于图3中的变更代码元素均为新增的代码元素,因此根据函数间的调用 关系,为新版本的系统源代码生成系统的函数调用依赖图。根据紧密度原则,计算函数调用 依赖图中依赖边的紧密度,设置紧密度阔值k = 0.7,删除紧密度值小于阔值k的依赖边,将 一个完整的函数调用依赖图划分为若干代码元素间有强依赖关系的子图,如图4所示,图中 的实线边表示依赖边的紧密度大于阔值k,图中的虚线边表示依赖边的紧密度值小于阔值 k。对于图3中每一个新增的函数,获取该变更代码元素所在强依赖子图,变更代码元素与子 图中其他代码元素一起构成该变更代码元素的初始变更域。如图4所示,目前已得到3个初 始变更域,每个变更域中的代码元素个数均为2。
[0052] 进一步的,由于函数createltems与ad祀vent之间存在调用依赖,则合并两者所属 的变更域。合并后,不存在粒度为函数的变更代码元素且该元素的初始变更域只包含它本 身一个元素,因此无需进一步合并已有的变更域。然后,对于粒度为域的变更代码元素 log 和events,通过静态分析函数与域之间的引用关系,得知函数createltems中引用了域log, 函数ad祀vent中引用了域events,故将域log划入函数create Items所在的变更域中,域 events划入函数ad祀vent所在的变更域中。至此,所有变更代码元素均被分配于至少一个 变更域内,完成了变更域的构造与合并。
[0053] 步骤3,根据图5所示的关键词抽取规则,对于变更域中的每一个代码元素,根据其 粒度和来源的不同,抽取相应的关键词,加入该变更域的描述文本。例如,在函数 buil化ogScrn与函数initializeScreens所构成的变更域中,对新增的函数buil化ogSc;rn, 应该抽取该函数的函数名,参数名,函数的注释,函数所属类的类名和注释作为关键词,对 旧版本代码中已存在的函数initializeScreens,则抽取该函数的函数名,参数名作为关键 词,函数所属类的类名作为关键词。从函数buil化ogScrn与函数initializeScreens中抽取 的关键词构成该变更域的描述文本。
[0054] 步骤4,对变更域的描述文本和旧版本代码的需求文本进行文本预处理,过程包括 词移除停用词,词形还原和词干提取。特别的,对于从代码中抽取的变更域描述文本,需要 首先根据驼峰命名法等变量命名规则进行分词。例如,对于函数名initializeScreens,首 先根据驼峰规则划分为initialize和screens,然后进行词形还原和词干提取,分别得到 ini t和screen。对于预处理后的变更域文本和需求文本,利用向量空间模型计算文本间的 相似度,图6为计算后的相似度矩阵。
[0055] 步骤5,对于每一个需求,累加其需求文本与各个变更域文本的相似度值,作为该 需求的总得分。图6中,需求SRS238与变更域1,变更域2的相似度分别为0.65和0.25,将相似 度值累加后,需求SRS238的总得分为0.9。参考图7,将各个需求按其总得分倒叙排列,作为 近似候选过时需求的最终排序。在该实施例中,经过人工校验,近似候选过时需求中排在前 Ξ位中的需求SRS238,SRS237均为潜在的过时需求,说明本方法具有较高的准确率和覆盖 度。
[0056] 本发明虽然已W较佳实施例公开如上,但其并不是用来限定本发明,任何本领域 技术人员在不脱离本发明的精神和范围内,都可W利用上述掲示的方法和技术内容对本发 明技术方案作出可能的变动和修改。因此,凡是未脱离发明技术方案的内容,依据本发明的 技术是指对W上实施例所做的任何简单修改、等同变化及修饰,均属于本发明技术方案的 保护化围。
【主权项】
1. 一种基于代码依赖关系的过时需求自动检测方法,其特征在于,包括如下步骤: 步骤1,比较新旧版本代码间的差异,识别其中影响需求的变更代码元素; 步骤2,若存在所述变更代码元素,则以所述变更代码元素为基础,根据代码依赖关系, 引入代码中与所述变更代码元素结构上紧密依赖的其它代码元素,构造变更域; 若不存在所述变更代码元素,则结束流程; 步骤3,对于每个变更域,提取其中各代码元素相应的描述信息,形成变更域描述文本; 汇集所有所述变更域描述文本,形成变更域文本集合; 步骤4,计算所述变更域文本集合与旧版本代码需求集合的相似度,得到与所述变更代 码元素相关的近似候选过时需求集合; 步骤5,利用基于相似度值的表决算法,生成近似候选过时需求集合的排序,结束流程。2. 根据权利要求1所述的方法,其特征在于,步骤1具体包括以下步骤: 步骤1.1,通过比较新旧版本的代码,识别两个版本间发生变更的代码元素,将这些代 码元素的变更作为候选的代码变更; 步骤1.2,过滤候选的代码变更中与重命名操作有关的变更,以得到影响需求的所述变 更代码元素。3. 根据权利要求2所述的方法,其特征在于:所述变更代码元素的ID为唯一标识;所述 变更代码元素的粒度为函数或域;变更的类型包括新增和删除。4. 根据权利要求1或3所述的方法,其特征在于,步骤2中,若存在所述变更代码元素,具 体包括以下步骤: 步骤2.1,基于函数的调用关系,构造新旧版本的所述变更代码元素的函数调用依赖 图,分别计算新旧版本中代码元素间依赖的紧密度值; 步骤2.2,对于所述变更代码元素,设置紧密度阈值,为每一个粒度为函数的所述变更 代码元素寻找与其结构上紧密度值大于紧密度阈值的代码元素,称为有强依赖关系的代码 元素,构成初始变更域; 步骤2.3,若两个粒度为函数的所述变更代码元素之间有强依赖关系,则将各自所属的 初始变更域合并为一个新的变更域; 对于粒度为域的所述变更代码元素,若被任何一个变更域中的函数所引用,则将其划 入对应的变更域中;若没有被任何初始变更域中的函数所引用,则将此类所述变更代码元 素构造一个新的变更域。5. 根据权利要求4所述的方法,其特征在于,函数调用依赖图由V和E构成,其中V为顶点 的集合,V中的元素 v表示一个函数;E为边的集合,E中的元素 e =〈source,target〉,source, target eV,表示函数source中发生了对函数target的调用,依赖边e的紧密度为:其中OutDegree_e · source表不顶点source的出度,InDegree_e · target表不顶点 target的入度,由此可分别计算新旧版本中代码元素间依赖的紧密度值。6. 根据权利要求1或5所述的方法,其特征在于,对于变更域中的每一个代码元素,根据 其粒度和来源的不同,抽取相应的关键词,加入该变更域的描述文本;抽取关键词的规则 为: 若代码元素粒度为函数,且为所述变更代码元素,则抽取该函数的函数名、参数名、函 数的注释、函数所属类的类名和注释作为关键词; 若代码元素粒度为函数,且不是所述变更代码元素,则抽取该函数的函数名、参数名、 函数所属类的类名作为关键词; 若代码元素粒度为域,则抽取该域的域名、域所属类的类名和注释作为关键词。7. 根据权利要求1所述的方法,其特征在于,步骤4具体包括以下步骤: 步骤4.1,对所述变更域描述文本和旧版本代码需求文本进行文本预处理,包括词移除 停用词,词形还原和词干提取,对于从代码中抽取的所述变更域描述文本,首先根据变量命 名规则进行分词; 步骤4.2,基于信息检索技术,计算所述变更域文本集合和旧版本代码需求文本集合间 的文本相似度:将所述变更域文本集合和旧版本代码需求文本集合用高维向量q,r表示,向 量中每个维度w对应一个单词的权重,对于q,r两个高维向量,利用余弦距离计算向量间的 余弦相似度,得到与所述变更代码元素相关的近似候选过时需求集合。8. 根据权利要求7所述的方法,其特征在于,步骤5包括以下步骤: 步骤5.1,根据所述变更域文本集合与旧版本代码需求文本集合间的相似度值,对于所 述近似候选过时需求集合中的每一个需求文本,累加其与所述变更域文本集合中各个变更 域文本的相似度值,作为该需求的总得分; 步骤5.2,将所述近似候选过时需求集合按总得分倒叙排列,作为所述近似候选过时需 求集合的最终排序。9. 一种基于代码依赖关系的过时需求自动检测系统,其特征在于,包括: 用户交互模块,用于向检测系统提供旧版本代码的需求文档库,新旧版本的代码; 代码版本比较模块,用于识别版本间的代码变更; 代码依赖静态分析模块,用于分析代码间的依赖关系,获取变更代码元素和与变更代 码元素有强依赖关系的上下文代码信息; 变更域构造以及文本抽取模块,用于形成变更域文本集合; 检索模块,用于计算得到近似候选过时需求的排序。10. 根据权利要求7所述的系统,其特征在于,所述用户交互模块包括:版本管理系统集 成模块和图形界面集成模块。
【文档编号】G06F11/36GK105824756SQ201610154205
【公开日】2016年8月3日
【申请日】2016年3月17日
【发明人】胡昊, 匡宏宇, 吕建, 聂佳
【申请人】南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1