Page 206 - 《软件学报》2021年第7期
P. 206
2124 Journal of Software 软件学报 Vol.32, No.7, July 2021
提交消息可以有效地包含代码变更的目的和具体变更的内容.Shen 等人 [30] 同样识别出代码变更相关的影响集,
随后根据方法的类型来生成代码变更的变更信息,通过识别代码变更的版型和维护任务的类型来生成代码变
更的目的信息.
2.2.3 其他类型的方法
除了基于 SWUM 和版型的方法,也有研究人员从其他角度来设计基于模板的注释生成方法.Rai 等人 [31] 从
基于代码级别的微模式(nano-pattern)入手,并考虑了 26 种微模式.在深入分析了 Java 方法内不同微模式之间的
关联关系后,他们使用基于模板的方法来生成最终的代码注释.Malhotra 和 Chhabra [32] 基于微模式和类的变更倾
向性,针对类生成代码注释.其中,主要通过计算类之间的不同依赖关系来确定类的变更倾向性.Nazar 等人 [33] 首
先基于 Eclipse 和 NetBeans 项目,构建了基于代码段的语料库,随后他们邀请了 4 名学生对代码段进行注释.接
着使用众包方法来对代码段(主要基于 21 个特征)进行标记.最后,基于支持向量机和朴素贝叶斯分别构建了两
个分类器,这些分类器可以根据给定的特征取值自动地生成代码注释.Rastkar 等人 [34] 提出一种基于多文档摘要
的方法来生成代码变更的提交消息,其生成的提交消息可以描述代码变更的目的(例如新实现的特征等).但是,
由于这些信息可能分布于项目内的不同文档中,例如需求文档、设计文档等,于是他们针对代码变更,从相关文
档中抽取出与之相关的句子,这些句子包含了代码变更的提交目的等信息.他们提出的方法主要基于机器学习
方法,通过分析句子级别的特征,尝试着在文档中识别出相关句子.
2.3 已有工作的对比和评点
我们通过表 2 对所有基于模板的生成方法进行了全面对比,包括考虑的代码模块粒度、编程语言、方法的
类型和主要特征.不难看出,大部分研究工作都集中于研究的早期阶段,78.6%的研究工作基于 SWUM 和版型的
方法,64.3%的研究工作将代码的粒度设置为方法/函数,92.9%的研究工作关注的是 Java 编程语言.在评估注释
质量时,基本上都是借助人工评估的方式.
Table 2 Comparison of template-based generation methods
表 2 基于模板的生成方法的对比
相关文献 模块粒度 编程语言 方法类型 主要特征
Hill 等人 [18] 方法 Java SWUM 仅分析方法的签名
Sridhara 等人 [19] 方法 Java SWUM 进一步分析方法体内的代码
Sridhara 等人 [20] 方法 Java SWUM 针对方法的参数生成注释
Sridhara 等人 [21] 方法 Java SWUM 关注高级别的动作
Wang 等人 [22] 方法 Java SWUM 关注与对象相关的高级别动作
McBurney 等人 [12,23] 方法 Java SWUM 关注方法的上下文信息
Moreno 等人 [24] 类 Java 版型 结合版型信息与预先定义的基于方法和数据成员
访问级别的启发式规则
Abid 等人 [25] 函数 C++ 版型 基于静态分析方法和一系列启发式规则
Buse 等人 [28] 代码变更 Java 版型 抽取出被修改代码内的路径谓词
综合考虑代码变更的版型类型、变更的类型和
[29]
Cortes-Coy 等人 代码变更 Java 版型
与代码变更相关的影响集
Shen 等人 [30] 代码变更 Java 版型 综合利用方法版型和代码变更类型
Rai 等人 [31] 方法 Java 其他 基于代码级别的微模式
Malhotra [32] 类 Java 其他 基于微模式和类的变更倾向性
Nazar 等人 [33] 代码段 Java 其他 基于众包方法
Rastkar 等人 [34] 代码变更 Java 其他 基于多文档摘要方法
3 基于信息检索的生成方法
3.1 简 述
在这类方法的研究早期,研究人员一般仅分析项目内的所有代码模块,并基于信息检索模型,通过识别出目
标模块内的关键单词来合成代码的摘要.随着项目管理的日趋规范(例如,当前大部分项目开发均会使用缺陷跟
踪系统和版本控制系统)以及 Github 和 Stack Overflow 这类基于众包协作平台的快速发展,研究人员尝试挖掘