Page 205 - 《软件学报》2021年第7期
P. 205

陈翔  等:代码注释自动生成方法综述                                                              2123


                 试着从方法体内选出核心代码语句,他们在选择时主要基于对已有开源项目内注释的分析和与经验丰富的开
                 发人员的交流.随后在文本生成阶段,基于上述选出的语句,尝试生成代码注释.
                    Sridhara 等人 [20] 进一步针对方法的参数来生成注释.以 Java 语言为例,通过如下注释@param args: create
                 meta server using the port obtained from the parameter,开发人员可以了解到参数 args 在方法内的作用.他们通过
                 分析 18 个开源项目,发现:含有至少 1 个参数,但没有@param 注释的方法大约占到 31%~97%,因此,基于方法参
                 数生成相应的注释是一个亟需解决的问题.他们提出启发式方法来尝试生成与参数相关的注释,实验结果表明:
                 所生成的注释可以描述出参数在方法实现的功能中所起到的主要作用.
                    Sridhara 等人 [21] 随后关注代码中的高级别动作(high-level actions).他们通过分析语句序列、条件语句块和
                 循环语句块,来尝试识别出代码内的高级别动作,随后借助 SWUM,为每个识别出的高级别动作生成简洁的注
                 释.但 Wang 等人  [22] 随后发现,在生成注释时,代码内仍有一些类型的高级别动作并未被识别出来.他们重点关注
                 了通过对象引用相互关联的连续语句序列,并称其为与对象相关的动作(object-related action).通过分析 1 000 个
                 开源项目后,他们发现这类高级别动作在项目内普遍存在.通过挖掘开源项目,构建出与这类高级别动作相关的
                 注释模板,随后通过在代码内识别出与这类动作相关的代码,借助 SWUM 对已有的代码注释作进一步的增强.
                    McBurney 和 McMilan [12,23] 从代码的上下文入手.他们将方法的设计目的与在系统中所起的作用视为上下
                 文.他们的方法首先搜集与 Java 方法源代码相关的上下文数据(即方法调用信息).随后基于方法所处的上下文
                 中的关键词来描述方法是如何被使用的,该阶段主要借助 SWUM 来识别不同关键词的词类(parts of speech).最
                 后,借助 PageRank 算法来选择上下文信息,并通过关键词来生成针对上下文的描述.
                 2.2.2  基于版型信息分析的方法
                    版型是针对代码结构(例如类、方法、代码变更等)的类型(type)和角色(role)的高级别抽象.利用版型信息,
                 可以确定需要用于生成注释的代码结构类型.例如,如果一种方法的职责是将类实例化为对象,则可以将该方法
                 的版型归为构造方法.
                    Moreno 等人  [24] 将关注的代码粒度从函数级别提升到类级别,因为他们认为类是面向对象编程语言的基本
                 构成单元.但又发现不能将针对类内函数的注释,通过简单合并的方式来生成类的注释.首先,简单合并函数的
                 注释会造成最终类的注释内含有过多的内容.其次,类内仅有部分函数与类的行为密切相关.他们假设方法的类
                 型在类内的分布并不是偶然的,而是与类的设计意图有关.因此他们的方法首先决定类和方法的版型.随后通过
                 结合版型信息与预先定义的基于方法和数据成员访问级别的启发式规则,可以确定需要包含在注释里的信息.
                 最终通过综合使用选择的信息、预先定义的规则以及针对变量和语句的自然语言描述,以最终生成代码注释.
                 Moreno 等人的研究工作主要针对 Java 编程语言,随后,Abid 等人            [25] 针对基于 C++编程语言实现的方法来生成
                 注释.他们的方法首先基于静态分析方法和一系列启发式规则来确定方法的版型类型.随后基于版型的信息、
                 静态分析的结果和预先定义的模板来生成方法的注释.其中,使用静态分析方法有助于抽取出方法的内部实现
                 细节(例如参数、局部变量以及方法调用等信息),而使用预先定义的模板则有助于针对不同的版型类型来生成
                 代码注释.
                    在版本控制系统内,开发人员可以通过提交消息(commit message)来描述代码变更(code change)的目的和
                 变更的主要内容.不难看出,代码变更也是理解软件演化的一个重要依据,而对应的提交消息同样可以协助开发
                 人员在不需要理解代码变更的底层实现细节时,就可以为理解软件演化提供重要的信息.但一些实证研究的结
                 果表明,项目内的提交消息质量难以令人满意.例如:Maalej 和 Happel               [26] 通过分析超过 60 万条的提交消息,发现
                 有 10%的提交消息不含有任何文本内容或者含有的文本内容很少.随后 Dyer 等人                        [27] 通过分析超过 2.3 万个开
                 源项目后,发现 14%的提交消息不含有任何文本内容,66%的提交消息含有的文本内容很少,而仅有 10%的提交
                 消息包含了代码变更的目的和内容.为了提高提交消息的质量,Buse 和 Weimer                    [28] 开发出 DeltaDoc 工具,该工具
                 通过对修改前后版本的控制流图进行对比,从中抽取出被修改代码内的路径谓词,并通过预定义的模板来生成
                 注释.Cortes-Coy 等人 [29] 提出了 ChangeScribe 方法,该方法通过考虑代码变更的版型类型、变更的类型(例如文
                 件的重命名、针对属性文件的修改等)和与代码变更相关的影响集,可以生成提交消息,结果表明,该方法生成的
   200   201   202   203   204   205   206   207   208   209   210