Page 202 - 《软件学报》2024年第6期
P. 202

2778                                                       软件学报  2024  年第  35  卷第  6  期


                 些模型不依赖代码经过评审后的变更状态, 而是基于评审意见的文本特征                        (如“可读性”“停用词比例”和“代码元素
                 比例”等) 和评审者相关特征        (如“评审次数”等). 基于上述研究经验, Hasan        等人  [20] 调研了  Samsung  开发者关于代
                 码评审意见是否有用的看法, 结果表明: (1) “有用”的评审意见通常指出缺陷、逻辑错误、冗余代码、帮助提升设
                 计和可读性等; (2) “部分有用”的评审意见通常提出疑问、表示赞赏、要求改进文档等; (3) “无用”的评审意见通
                 常指出能够被静态分析工具发现的问题、讨论已经被解决的问题、误解代码意图等. 同样地, 为了实现“实时评
                 价”, Hasan  等人基于代码评审意见的文本特征、评审上下文特性和评审者相关特征构建了若干预测模型.
                    总结来说, 目前尚无被一致认可的代码评审意见质量评价标准. 研究者在构建预测模型时, 通常将是否“触发
                 代码变更”作为评价评审意见有用性的标准. 该评价方式依赖代码作者对评审意见的接受与否, 受人的主观因素影
                 响较大, 因此其有效性仍存在争议. 本文针对上述问题开展了若干实证研究, 在此基础上提出了一种基于多标签学
                 习的代码评审意见质量评价方法, 现将关键研究方法、过程和结果报告如下.
                  2   准备工作


                  2.1   实例分析
                    Git 版本控制系统提供了方便的代码变更比对功能                (通常以不同颜色作为区分), 评审者可以更加专注代码变
                 更, 而无需逐行检视提交的所有代码. 评审者一旦发现问题, 即可选中任意行代码并提出针对性的意见. 图                               1  展示
                 了一个典型的代码评审实例          (https://gitee.com/mindspore/mindspore/pulls/30478). 评审者“zhangxx”针对代码作者
                 “徐  xx”提交的代码合入请求中的新增加            (+) 的行  (366) 提出了评审和修改意见“这里建议直接用              auto iter =
                 counter_handlers_.find(name); if (iter == end || !(iter->first_count_handler)){}减少查询次数, iter 可以重复使用”, 代码
                 作者接受了该意见并回复“应该这样做, 这几天              pclint 清理时候带上”. 事实上, 并非每条评审意见都会被代码作者
                 回复和触发代码变更. 表       1  中展示了更多、更复杂的代码评审意见实例.
                     C4














                                                     图 1 代码评审实例

                                                   表 1    代码评审意见实例

                    ID                                      代码评审意见
                    C1                                         同上
                    C2                                        逻辑不对
                    C3                                        魔鬼数字
                                                           info日志打印太多
                    C5                                    −1具体含义是什么?
                    C6                                   冗余代码, 抽成一个函数
                    C7                             什么鬼啊!!!英文是不是有些太不通顺了
                    C8                             是否有emui标准控件? 有的话用标准控件
                    C9                           MAXBUFLENGTH改为MAX_BUF_LENGTH
                          这样写不对, 假设第1个关闭时抛异常了, 会导致2, 3不去关闭. 每个需要独立的try-catch; 其中, 文件的输入输出流可
                    C10
                                                       以直接使用IoUtils里的方法
   197   198   199   200   201   202   203   204   205   206   207