法律状态公告日
法律状态信息
法律状态
2019-01-04
授权
授权
2016-08-31
实质审查的生效 IPC(主分类):G06F11/36 申请日:20160317
实质审查的生效
2016-08-03
公开
公开
技术领域
本发明属于计算机软件维护领域,具体涉及一种基于代码依赖关系的过时 需求自动检测方法及系统,能够高效、自动化且准确地检测出代码变更后,潜 在需要被同步更新的需求实体。
背景技术
在软件版本更新的过程中,一份最新的需求规约将提供有价值的知识来帮助 系统维护人员完成维护工作。事实上,需求规约能够解释系统实现背后的逻辑, 突出系统中的关键部分,帮助维护人员理解程序。
然而,在软件系统更新时,维护人员需要逐个检查需求文档库中的每个需求 文档,并判断需求文档是否应该被同步更新,以及如何被更新,这需要付出大量 的人力成本。因此,维护人员通常只更新代码而不更新需求,这将导致需求的过 时和失效。过时需求是指需求规约中不再反映利益相关者当前需要的需求。
目前,基于信息检索的过时需求自动检测方法,能够自动地为系统维护人员 识别出文档库中可能需要被同步更新的需求文档,从而减少识别过时需求的时间 成本。已有的自动化检测方法中,将从变更代码中抽取关键词,作为变更的描述 文本,利用信息检索技术,通过对变更文本和需求文本进行关键词匹配,能够定 位与变更文本相似度高的需求,则此次代码更新被认为可能与目标需求有关,目 标需求需要被同步更新。然而,由于信息检索方法存在词汇失配的问题,该方法 的效果严重依赖于变更文本的语料质量,已有方法在构造变更文本时,对于文本 信息的界定只停留在代码的变更部分。
发明内容
针对现有技术的不足,本发明的目的是提供一种基于代码依赖关系的过时 需求自动检测方法,提高自动化检测的准确度和覆盖率,同时提供一种基于代 码依赖关系的过时需求自动检测系统。
由于某一特定需求的实现是由分布在源程序中的多个代码元素协作完成 的,因此与变更代码存在强依赖关系的上下文代码信息,同样能够用于补充变 更的描述文本。本发明的一种基于代码依赖关系的过时需求自动检测方法,通 过分析代码依赖关系,构造代码变更的描述文本。其包括以下步骤:
步骤1,比较新旧版本代码间的差异,识别其中影响需求的变更代码元素;
步骤2,若存在变更代码元素,则以变更代码元素为基础,根据代码依赖关 系,引入代码中与变更代码元素结构上紧密依赖的其它代码元素,构造变更 域;
若不存在变更代码元素,则结束流程;
步骤3,对于每个变更域,提取变更域中所有代码元素的描述信息,形成变 更域的描述文本;
步骤4,汇集所有变更域的描述文本,形成变更域文本集合;通过计算变更 域文本集合与旧版本代码需求集合的相似度,发现与变更代码元素相关的近似 候选过时需求集合;
步骤5,利用基于相似度值的表决算法,生成近似候选过时需求集合的排 序。
上述技术方案的进一步特征在于:步骤1中,通过比较新旧两个版本的代 码,识别两个版本间发生变更的代码元素,代码元素的粒度为函数或域。将这 些代码元素的新增或删除作为候选的代码变更。然后,过滤候选的代码变更中 与重命名操作有关的变更,得到影响需求的变更代码元素。将新旧版本间影响 需求的变更代码元素集合记为C={c1,c2,…,cn},将一个变更代码元素记为c =<ElementID,ChangeType,ElementTyp>,其中ElementID为变更代码元素的唯 一标识。ChangeType表示变更的类型(新增或删除),ElementType表示变更代 码元素的粒度(函数或域)。
本发明步骤2包括以下步骤:
步骤2.1,根据函数间的调用关系,可以为某一版本的系统源代码生成函数 调用依赖图,函数调用依赖图由V和E构成,其中V为顶点的集合,V中的元素v 表示一个函数;E为边的集合,E中的元素e=<source,target>,source,target∈ V,表示函数source中发生了对函数target的调用。根据紧密度原则的计算公式, 依赖边e的紧密度为:
其中OutDegree_e.source表示顶点source的出度,InDegree_e.target表示顶点 target的入度。由此可分别计算新旧版本中代码元素间相互依赖的紧密度值。
步骤2.2,在系统的函数调用依赖图上,设置紧密度阈值k,删除紧密度值 小于k的依赖边,将一个完整的函数调用依赖图划分为若干代码元素间有强依赖 关系的子图。对于集合C中每一个代码元素粒度为函数的变更代码元素,获取 该变更代码元素所在强依赖子图,变更代码元素与子图中其他元素一起构成该 变更代码元素的初始变更域。
步骤2.3,若两个变更代码元素之间存在函数调用依赖,则将各自所属的初 始变更域合并为一个新的变更域。在合并后,若存在粒度为函数的变更代码元 素且该元素的初始变更域只包含它本身一个元素,则将该变更代码元素划入拥 有该函数所属类的子元素数量最多的变更域中。然后,对于粒度为域的变更代 码元素,若该域被任何变更域中的函数引用,则将该域划入对应的变更域中, 对于没有被任何变更域中函数引用的域,用这些域元素构造一个新的变更域。
本发明步骤3中,对于变更域中的每一个代码元素,根据其粒度和来源的不 同,抽取相应的关键词,加入该变更域的描述文本。抽词规则如下:
1.若代码元素粒度为函数,且为新增或删除的元素,则抽取该函数的函数 名,参数名,函数的注释,函数所属类的类名和注释作为关键词。
2.若代码元素粒度为函数,且为旧版本代码中已存在的元素,则抽取该函 数的函数名,参数名,函数所属类的类名作为关键词。
3.若代码元素粒度为域,则抽取该域的域名,域所属类的类名和注释作为 关键词。
本发明步骤4包括以下步骤:
步骤4.1,对变更域描述文本和旧版本代码需求文本进行文本预处理,过程 包括词移除停用词,词形还原和词干提取。特别的,对于从代码中抽取的变更 域描述文本,需要首先根据驼峰命名法等变量命名规则进行分词。
步骤4.2,基于信息检索技术,计算变更域描述文本集合和旧版本代码需求 文本集合间的文本相似度。以向量空间模型为例,将变更文本和需求文本用高 维向量q,r表示,向量中每个维度w对应一个单词的权重,权重w可用TF-IDF公 式计算。对于q,r两个高维向量,可利用余弦距离计算向量间的余弦相似度。
本发明步骤5包括以下步骤:
步骤5.1,根据已知的变更域描述文本集合与旧版本代码需求文本集合间的 相似度值,对于近似候选过时需求集合中的每一个需求文本,累加其与所述变 更域文本集合中各个变更域文本的相似度值,作为该需求的总得分。
步骤5.2,将需求集合按需求的总得分倒叙排列,作为近似候选过时需求集 合的最终排序。
此外,本发明还涉及一种基于代码依赖关系的过时需求自动检测系统,包 括:
用户交互模块,用于向检测系统提供旧版本代码的需求文档库,新旧版本 的代码;包括版本管理系统集成模块和图形界面集成模块;
代码版本比较模块,用于识别版本间的代码变更;
代码依赖静态分析模块,用于分析代码间的依赖关系,获取变更代码元素 和与变更代码元素有强依赖关系的上下文代码信息;
变更域构造以及文本抽取模块,用于形成变更域文本集合;
检索模块,用于计算得到近似候选过时需求的排序。
本发明具有以下有益效果:本发明在自动化检测潜在的过时需求时,通过分 析代码依赖关系,引入与变更代码有强依赖关系的上下文信息,提高了过时需求 自动检测方法的精度,同时也保持了检测方法的高度自动化。本发明涉及的系统 与版本控制系统Github相集成,同样提供图形化界面的版本,具有高可用性和广 泛的应用前景。
附图说明
图1为本发明实施例的一种基于代码依赖关系的过时需求自动检测方法的 流程示意图;
图2为本发明实施例的一种基于代码依赖关系的过时需求自动检测系统;
图3为本发明实施例的新旧版本间代码元素的区别;
图4为本发明实施例的代码依赖关系图;
图5为本发明实施例的关键词提取规则;
图6为本发明实施例的变更文本集合与需求文本集合的相似度矩阵;
图7为本发明实施例的近似候选过时需求的排序。
具体实施方式
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明上述 的或其他方面的优点将会变得更加清楚。
参考图1,为本发明实施例的一种基于代码依赖关系的过时需求自动检测方 法。
图2是本发明实施例的一种基于代码依赖关系的过时需求自动检测系统结构 示意图,包括用户交互模块,代码版本比较模块,代码依赖静态分析模块,变 更域构造以及文本抽取模块,检索模块。其中用户交互模块包括:版本管理系 统集成模块和图形界面集成模块。为了有助于系统维护人员使用本发明,将本 发明与目前主流的开源代码库以及版本控制系统Github相集成。对于一个Github 中的开源项目,维护人员只需提供项目的Github地址,需求文档库的相对地 址,并指定新旧两个版本的版本号(CommitID),系统将自动执行本发明的技术 以检测可能过时的需求,给维护人员提供近似候选过时需求排序。同时,系统 还提供一个图形化界面的版本,维护人员也可将本发明的技术应用于任意的本 地项目。
由图2可见,用户向检测系统提供旧版本代码的需求文档库,新旧版本的代 码,检测系统能够识别版本间的代码变更,并自动分析代码间的依赖关系,获 取变更代码元素和与变更代码元素有强依赖关系的上下文代码信息,并计算得 到近似候选过时需求的排序。
实施例一
下面通过一个具体的例子来解释方法是如何执行的。以开源系统AquaLush 为例,AquaLush是一个由软件控制的灌溉系统,可以基于用户提供的湿度、用 水量等参数自动调整灌溉输出。假设在某一次的代码更新中,为AquaLush新增 了日志记录功能,该功能可以记录用户的历史操作,如用户对某区域湿度、用 水量的设定等等,并且提供一个日志面板以展示日志。根据如下步骤执行方 法,能够为系统维护人员提供近似候选过时需求的排序:
步骤1,将新旧两个版本的代码解析为代码元素(函数和域)的集合,识别 两个版本间新增或删除的代码元素。进一步地,通过比较变更代码元素的编辑 距离,过滤候选的代码变更中与重命名操作有关的变更,得到影响需求的变更 代码元素。图3为AquaLush两个版本间新增或删除的代码元素,被认为是影响 需求的变更代码元素。
步骤2,由于图3中的变更代码元素均为新增的代码元素,因此根据函数间 的调用关系,为新版本的系统源代码生成系统的函数调用依赖图。根据紧密度 原则,计算函数调用依赖图中依赖边的紧密度,设置紧密度阈值k=0.7,删除 紧密度值小于阈值k的依赖边,将一个完整的函数调用依赖图划分为若干代码元 素间有强依赖关系的子图,如图4所示,图中的实线边表示依赖边的紧密度大于 阈值k,图中的虚线边表示依赖边的紧密度值小于阈值k。对于图3中每一个新增 的函数,获取该变更代码元素所在强依赖子图,变更代码元素与子图中其他代 码元素一起构成该变更代码元素的初始变更域。如图4所示,目前已得到3个初 始变更域,每个变更域中的代码元素个数均为2。
进一步的,由于函数createItems与addEvent之间存在调用依赖,则合并两者 所属的变更域。合并后,不存在粒度为函数的变更代码元素且该元素的初始变 更域只包含它本身一个元素,因此无需进一步合并已有的变更域。然后,对于 粒度为域的变更代码元素log和events,通过静态分析函数与域之间的引用关 系,得知函数createItems中引用了域log,函数addEvent中引用了域events,故将 域log划入函数createItems所在的变更域中,域events划入函数addEvent所在的变 更域中。至此,所有变更代码元素均被分配于至少一个变更域内,完成了变更 域的构造与合并。
步骤3,根据图5所示的关键词抽取规则,对于变更域中的每一个代码元 素,根据其粒度和来源的不同,抽取相应的关键词,加入该变更域的描述文 本。例如,在函数buildLogScrn与函数initializeScreens所构成的变更域中,对新 增的函数buildLogScrn,应该抽取该函数的函数名,参数名,函数的注释,函数 所属类的类名和注释作为关键词,对旧版本代码中已存在的函数 initializeScreens,则抽取该函数的函数名,参数名作为关键词,函数所属类的 类名作为关键词。从函数buildLogScrn与函数initializeScreens中抽取的关键词构 成该变更域的描述文本。
步骤4,对变更域的描述文本和旧版本代码的需求文本进行文本预处理,过 程包括词移除停用词,词形还原和词干提取。特别的,对于从代码中抽取的变 更域描述文本,需要首先根据驼峰命名法等变量命名规则进行分词。例如,对 于函数名initializeScreens,首先根据驼峰规则划分为initialize和screens,然后进 行词形还原和词干提取,分别得到init和screen。对于预处理后的变更域文本和 需求文本,利用向量空间模型计算文本间的相似度,图6为计算后的相似度矩 阵。
步骤5,对于每一个需求,累加其需求文本与各个变更域文本的相似度值, 作为该需求的总得分。图6中,需求SRS238与变更域1,变更域2的相似度分别 为0.65和0.25,将相似度值累加后,需求SRS238的总得分为0.9。参考图7,将各 个需求按其总得分倒叙排列,作为近似候选过时需求的最终排序。在该实施例 中,经过人工校验,近似候选过时需求中排在前三位中的需求SRS238,SRS237 均为潜在的过时需求,说明本方法具有较高的准确率和覆盖度。
本发明虽然已以较佳实施例公开如上,但其并不是用来限定本发明,任何本 领域技术人员在不脱离本发明的精神和范围内,都可以利用上述揭示的方法和技 术内容对本发明技术方案作出可能的变动和修改。因此,凡是未脱离发明技术方 案的内容,依据本发明的技术是指对以上实施例所做的任何简单修改、等同变化 及修饰,均属于本发明技术方案的保护范围。
机译: 基于义务积分项目分类代码的产品需求/供应连接网络服务方法以及一种能够基于用户需求的物品供应系统来提供需求/供应连接网络的系统
机译: 一种用于测试复杂的集成逻辑电路的基于信号的信号依赖关系的方法,从而减少了时间和存储需求
机译: 一种基于场景需求的不良行为检测方法