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 这类基于众包协作平台的快速发展,研究人员尝试挖掘
   201   202   203   204   205   206   207   208   209   210   211