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.