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 成的比例,是重要的