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 为例,说明实验过程.本节的