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

黄子杰  等:检测 JavaScript 类的内聚耦合 Code Smell                                          2515


                 度量数据在第 4.2 节中的表 7~表 9 展示.
                    Awesome-qr.js 的 1.2.0 版本 [32] 约有 1 500 行代码,可在客户端或服务端运行.它拥有两个工具类、7 个功能
                 类,且多个类具有低内聚特征.
                    表 4 列出了对该项目受 FE 和 DC 影响的全部函数及检测结果.由于上述函数的代码及变量命名均无显著
                 的业务特征(例如 mod 和 multiply)或特征过多、分散(例如 draw),甚至未出现在软件项目中,故文本分析难以确
                 定目标的耦合类.然而,它们的确存在耦合问题,对于这类较为困难的任务,JS4C 体现出了良好的适应性.
                               Table 4    Detection results and effectiveness of FE and DC in Awesome-qr.js
                                      表 4   Awesome-qr.js 中 FE 和 DC 的检测结果和检测效果
                                                I dc/       NSI fe/    I fe/耦合类   I fe/耦合类
                       类名         函数名                                                         人工判定
                                              耦合对象          耦合类        (Doc2Vec)   (LDA)
                    QRPolynomial   mod     0.4/QRMath,入参 e   0/无         0/无        0/无        QRMath
                    QRPolynomial  multiply  0.5/QRMath,入参 e  0/无         0/无        0/无        QRMath
                      Drawing      draw         0/无          0/无         0/无        0/无      QRCodeModel
                                           0.33/QRRSBlock,   0.17/      0.17/
                    QRCodeModel    make                                             0/无      QRRSBlock
                                               QRUtil     QRRSBlock   QRRSBlock
                                             0.4/Drawing,   1/Drawing,   1/Drawing,   1/Drawing,
                   AwesomeQRCode  makeCode                                                   QRCodeModel
                                            QRCodeModel   QRCodeModel  QRCodeModel  QRCodeModel
                      QRUtil     getLostPoint   0/无          0/无         0/无         0       QRCodeModel
                    表 5 列出了该项目 Blob 的检测结果.在上述检测结果中,对于 QR8bitByte,文本分析未检测到 Code Smell,
                 而结构分析检出了最高强度的 Code Smell.因为类中定义了多个未经函数成员访问的属性,内聚性不足,但函数
                 成员的名称却与业务逻辑有关.对于 AwesomeQRCode,它未包含任何属性成员,故结构分析会失效,但文本分析
                 却可以检测出它实现了不相关的多种职责.

                                  Table 5    Detection results and effectiveness of Blob in Awesome-qr.js
                                       表 5   Awesome-qr.js 中 Blob 的检测结果和检测效果
                        类名        代码行数     NSI blob   TI blob(Doc2Vec)  I blob(Doc2Vec)  TI blob(LDA)  I blob(LDA)   人工判定
                     QRCodeModel    533     0.58      0.51        0.58       0.61      0.61      有
                       Drawing      327     0.68      0.74        0.74       0.61      0.68      有
                     QRPolynomial    44      0        0.29        0.29        0         0        有
                      QRBitBuffer    28     0.26      0.21        0.26        0        0.26      有
                      QR8bitByte     41      1         0           1          0         1        有
                    AwesomeQRCode    55      0        0.46        0.46       0.56      0.56      有
                      QRRSBlock     197      0         0           0          0         0        无
                       QRUtil       213      0         0           0          0         0        有
                       QRMath        18      0         0           0          0         0        无
                    Awesome-qr.js 的体积较小,在相关性分析中难以获取足够的有效数据,需要使用规模较大的软件演示后续
                 步骤.Three.js [33] 是利用 WebGL 和 HTML5 特性实现的开源浏览器端三维引擎,截至 2018 年 9 月,该项目已有近
                 25 000 次代码提交(commit)、88 个发布(release)版本和近 1 000 名代码贡献者(contributor).本文利用 JS4C 对
                 Three.js r95 版本代码中的 232 个类进行了检测,并分析 Code Smell 的分布规律及它们之间的关系,其中,共 103
                 个类涉及本文讨论的 3 种 Code Smell.
                    对于系统内所有的类,获取 3 种 Code Smell(Blob,FE,DC)强度的集合 BLOB,FE,DC.本文利用 Spearman 等
                 级相关方法(Spearman’s rank correlation coefficient) [34] 分析三者间的两两相关性,该方法可用于未知概率分布的
                 两组顺序数据,取上述两组数据作为输入值,可输出其相关系数ρ及相关性的显著程度 P.判定显著程度前,需要
                                                                   [6]
                 选定一个显著等级(significant level)值α,实践中,α通常取值 0.05 .在该取值下,当 P<α时,可认为两组数据的差
                 异具有显著性,即具有统计意义;当 P<0.01 时,可认为两组数据的差异非常显著.相关系数ρ利用单调方程评价两
                 个统计变量的相关性,它的值域为[−1,1].如表 6 所示,ρ值可对应相关性,当数据中没有重复值,且两组变量完全
                 单调相关时,ρ相关系数则为+1 或−1.
   228   229   230   231   232   233   234   235   236   237   238