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

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


                                                Table  9  Other detection results               (%)
                                                    表 9   其他检测结果                                (%)
                                     低内聚类      高耦合类      内聚耦合问题同现率/         内聚耦合相关       文本信息源
                           项目名
                                       占比        占比         秩和检验 P 值         系数/P 值        占比
                        Awesome-qr.js  77.78     55.56       55.56%/0.04      −/>0.05      36.36
                          Three.js     25.43     50.86     66.88%/6.27e−34  0.46/6.3e−18   45.14
                           PDF.js      5.23      9.91      47.28%/1.34e−08   0.27/0.04     57.06
                           FloraJS     41.67     54.17      76.92%/1e−04     0.58/0.04     41.38
                           Pixi.JS     28.41     44.32     48.84%/5.21e−07   0.63/0.002    36.17
                          Brackets     30.00     46.88     55.70%/6.56e−16    −/>0.05      40.98

                 4.3   实验讨论
                    对于 Q1,根据表 7 和表 8 中 Doc2Vec 列的精确率和召回率数据,可见其总体表现与检测 Java Code Smell
                 的同类文献    [15] 相仿,JS4C 能够比较准确地检测和识别内聚和耦合问题.如表 7 所示,使用 Doc2Vec 作为文本检测
                 算法的 JS4C 在检测耦合问题方面的整体表现更好,在保持与其他方式相当精确率的前提下,大幅提升了召回
                 率;如表 8 所示,在检测内聚问题时,其优势更为全面和显著.
                    本文还参考相关文献得出的内聚和耦合问题的关联和性质,通过表 9 中第 4 列、第 5 列的其他指标验证了
                 其中的结论,以印证对 Q1 的回答.Badri 等人        [36] 指出,内聚和耦合的度量间存在相关性.数据集的 6 个项目中,有 4
                                                                                    [8]
                 个得出了类似结论,其中,Awesome-qr.js 相关性不显著的原因是数据不足.Chahal 等人 认为:“高内聚、低耦合”
                 尽管在设计原则中并列出现,但实现高内聚不意味着低耦合,然而在复用性较差的设计中,二者会同时出现.根
                 据秩和检验 P 值,可知内聚和耦合问题的分布显著不同,因此它们并不是同一种问题;通过同现率,可印证两种问
                 题有较高概率同时出现.
                    对于 Q2,JS4C 包含因上游软件和算法等特性较难排除的已知问题,以及针对软件的具体情况而排除的干
                 扰因素,排除干扰因素可以有针对性地提升在特定项目中的表现,已知问题则需要在后续工作中持续改进.
                    已知问题包括:(1) JS4C 基于类检测工具 JSDeodorant 扩展,检测效果受其制约,尽管 JSDeodorant 是目前效
                 果最好的 JS 类检测工具,但由于实现类的方式多样,工具会漏检部分构造不规范的类(例如使用对象定义且没
                 有构造器的情形),影响到了检测精度;(2)  文本过短会导致文本模型得出不合理的相似度,因此目前有较多代码
                 行数较小的类被误判为低内聚类;(3)  由于 JS 使用弱类型系统,目前使用被调用函数签名的特征推断对象的类,
                 如果特征不明显,对象所属的类可能无法被准确推断,进而影响 NSCDISP,ATFM 等结构方式度量计算.
                    除此之外,还有能因地制宜而排除的干扰因素.
                    在检测耦合问题的实验中,JS4C 在 Three.js 和 FloraJS 的例子中的精确率表现不甚理想,主要的错判包括 2
                 类情况.
                    (1)  与浏览器支持的 WebGL、Canvas 和页面事件等功能接口交互的类和函数中,JS4C 的结构方式将其识
                        别为一种不明来源的耦合,它们实为对浏览器底层功能的封装.对于这类问题,可以通过建立浏览器
                        底层功能函数库的白名单,并将这些函数列入文本检测流程中的“停用词”范畴,以优化检测效果.
                    (2)  由于文本相似度检测的特性,FE 的检测会受到 Duplicate Code(重复代码)的干扰.在 Code Smell 优先
                        级排序的相关研究中        [37] ,Duplicate Code 优先于 FE,该问题可通过 Code Smell 排序的方式规避.
                    在检测内聚问题的实验中,受干扰导致的错判包括 3 类情况.
                    (1)  数据类(data class)或模型类(model)中与业务逻辑无关的存取和序列化等函数提高了结构方式内聚
                        性的度量值、干扰了判断:一方面,JS 的存取函数并没有通用的模板代码,其命名和实现方式不遵循特
                        定规则;另一方面,部分存取函数也包含少量的业务逻辑,因此不能简单地排除全部的存取函数.
                    (2)  代码中存在大篇幅的、与业务逻辑无关的变量默认值,影响了文本方式的判断结果.
                    (3)  部分工具类有低内聚的特性,易被判为低内聚类.对于该问题,一方面,工具类是否为反模式仍有争论;
                        另一方面,若实有必要,可以通过工具函数的检测算法                  [38] 将其排除.
                    对于 Q3,文本检测算法提升了检测效果:一方面,在表 9 中,易见文本信息源占据了约 4 成的比例,是重要的
   230   231   232   233   234   235   236   237   238   239   240