Page 232 - 《软件学报》2021年第8期
P. 232

2514                                   Journal of Software  软件学报 Vol.32, No.8,  August 2021

                 使用弱类型系统,变量的类型在分析中仅靠推断得出,因此这一结构信息可能检测不全.文本方式根据语义相似
                 度确定是否耦合,不受此限制,因而更可靠.
                    判定 FE 时,使用 CINT 作为阈值的原因为:一方面,计算 CINT 无需确定耦合对象所属的类,因此该度量的值
                 是可靠的;另一方面,存在业务逻辑类似但实则毫无关联的代码,它们可能会导致文本方式的误判,例如将代码
                 拷贝误判为耦合,使用 CINT 阈值可以应对这种情况.

                 4    实   验

                    为了验证 JS4C 的有效性,本文以表 3 中的开源项目作为测试数据集,对 JS4C 的检测结果进行评估对比.实
                 验主要寻求以下几个问题的解答.
                    Q1:JS4C 能否准确检测内聚和耦合的设计问题?
                    Q2:JS4C 有哪些已知问题?是否仍有改进空间?
                    Q3:文本检测算法是否提升了 JS4C 的检测效果?
                    Q4:哪些因素会影响实验评估结论的有效性?
                    Q5:如何基于 JS4C 给出 JavaScript 类的重构建议,并实现其应用意义?
                                      Table 3    Open source project dataset used for experiment
                                               表 3   实验所用开源项目数据集
                            项目名        版本     类总数      类的函数总数         功能描述            运行环境
                          Awesome-qr.js  1.2.0  9         61         二维码生成        浏览器、服务器端
                            Three.js    r95    232        799         三维引擎            浏览器端
                             PDF.js    1.1.1   535       1 574      PDF 文档阅读          浏览器端
                            FloraJS    3.1.1    24        383         物理引擎            浏览器端
                             Pixi.JS   3.0.2    88        610       HTML5 2D 绘图       浏览器端
                            Brackets    1.3    160       4 740       集成开发环境           桌面系统

                 4.1   实验过程

                    为了保证基础数据的准确性,实验首先对基础度量数据进行了验证.由于缺乏对比的工具,本节实验参照同
                 类 Code Smell 的工作 [1,3] ,将对比基准确定为人工检测.检测工作由本文的第一作者及一名拥有 3 年工作经验的
                 Web 应用开发者分别独立进行后,针对分歧讨论完成.
                    其中,Doc2Vec 和 LDA 的相似度值分别使用 Deeplearning4j 和 JGibbLDA 库计算,它们被软件分析相关研
                 究 [31] 和开源社区广泛验证和使用,因此文本分析的人工验证仅涉及输入数据和运算的准确性.结构方式的度量
                 值均源于抽象语法树的结构信息,验证工作将人工计算的结果与工具的结果进行了对比.
                    获取可靠的度量值后,实验需要进一步验证 JS4C 对实际内聚、耦合设计问题的检测效果.本文对数据集中
                 的项目采用了与度量值验证相同的人工检测流程,特别地,对于耦合问题,除了判定有无设计问题外,还需识别
                 出所有人工判定发生耦合的对象,否则视为错判.
                    为了回答 Q1 和 Q2,本文使用精确率(precision)和召回率(recall)度量检测的效果,指标的数值越大,表明检测
                 的效果越好.将 Code Smell 检测视作一个二分类问题,将存在 Code Smell 的类归为正样本类,不存在 Code Smell
                 的类归为负样本类.令预测为正的正样本数量为 TP(true positive,正确率)、预测为正的负样本数量为 FP(false
                 positive,误报率)、预测为负的正样本数量为 FN(false negative,漏报率),精确率和召回率分别如式(16)、式(17)
                 所示:
                                                              TP
                                                    Precision =                                      (16)
                                                            TP +  FP
                                                             TP
                                                     Recall =                                        (17)
                                                           TP +  FN
                    本文对数据集中全部的项目进行了检测,本节以 Awesome-qr.js 案例和 Three.js 为例,说明实验过程.本节的
   227   228   229   230   231   232   233   234   235   236   237