Page 224 - 《软件学报》2021年第8期
P. 224
2506 Journal of Software 软件学报 Vol.32, No.8, August 2021
Key words: Code Smell; JavaScript; cohesion; coupling; class
JavaScript(简称 JS)是一种使用弱类型和动态类型的解释型编程语言,JS 程序的结构和变量类型在运行时
才会明确,因此,大量为 Java 等强类型语言设计的静态分析手段难以奏效,导致其代码质量缺乏工具保障.同时,
它还包含诸多增强语言灵活度(flexibility)的特性,例如原型链、闭包、头等函数等,它们形成了复杂的代码组件
继承、组合方式.因此,编写 JS 程序颇具挑战性,期间易产生 Code Smell 和 Bug [1,2] .
[3]
Code Smell 是软件程序中存在不良设计和不良实现的征兆 ,其强度可由度量指标(metric)量化.正确地检
测和量化 Code Smell 可以指导软件重构,提高软件的可用性和可靠性.
然而,现有 Code Smell 度量不足以理解 JS 程序的复杂性和程序质量,常见的 Code Smell 度量很少被 JS 相
[4]
关的研究使用 ,需对其进行开发或改进,以适应 JS.目前已出现面向 JS 的 Code Smell 检测工具,例如 SonarQube,
[1]
JSNose ,它们仅面向微观层面上(即函数、语句)的内聚或耦合问题.
JSNose 主要讨论了函数、代码块及对象内部的 Code Smell,并引入了 3 种通用类 Code Smell 的检测方式
来检测对象内部的问题,例如过大对象和不当的继承,但研究不涉及多个对象间的设计问题.研究还提及了一种
[5]
文件层面的 Code Smell,它面向 JS,HTML 和 CSS 这 3 种语言在代码中混写的耦合问题.Saboury 等人 根据语
言标准的新变化,扩充并修正了 JSNose 的定义,此类修正主要发生在语法和语句层面上,涉及作用域和闭包等
问题.该研究还就 Code Smell 对 JS 代码易错性(fault-proneness)的影响排序,结果显示,部分涉及不当赋值的
Code Smell 更易引发程序错误.
上述微观研究可以提出程序实现的重构建议、局部提升程序的质量,但无法有效分析粒度更大的(例如类、
[6]
模块)设计问题.Palomba 等人 发现:因为大粒度的代码组件过于复杂,模块和类层面的 Code Smell 相比函数
Code Smell 更难被有效地识别,解决这类问题的效率和成功率极低,因此需要理论和工具辅助.
[7]
类(class)是 JS 的一种常见设计模式,在 Silva 等人 抽选的 60 个 JS 程序样本中,68%使用了类,34%较频繁
[8]
或频繁地使用了类.优秀的类设计体现为高内聚和低耦合 ,内聚(cohesion)和耦合(coupling)可用于衡量面向对
象程序功能分布的合理性,内聚是软件组件内功能的关联程度,耦合是软件组件间交互的频繁程度.
由于 JS 类的信息检测存在困难,导致部分 Code Smell 的通用检测方法难以复用,因此 Code Smell 的相关工
作仍未充分涉及 JS 类的常见设计问题.提出一个 JS 类的内聚耦合 Code Smell 检测方式是迫在眉睫的任务.
本文的主要贡献为:
(1) 结合代码的文本和结构信息,提出了一个检测 JS 类的内聚耦合 Code Smell 的静态分析方法 JS4C,它
可以量化 Blob、Feature Envy(简称 FE)和 Dispersed Coupling(简称 DC)这 3 种 Code Smell,并检测 JS
开源软件中的内聚耦合问题.
(2) 细化并改进了类耦合 Code Smell 的检测方式:首先,根据耦合、内聚的设计问题对 Fowler 定义的 22
种 Code Smell 进行了分类,对比并区分了 FE 的两类检测方式;其次,引入了 DC 细化耦合问题检测的
粒度,改进了其 CDISP 度量,以适应 JS 的弱类型语言特性.
(3) 指出了文本信息源对 JS Code Smell 检测的重要性.实验发现,引入文本特征可以提升 Code Smell 的检
测效果.
本文第 1 节介绍本文所涉研究领域的相关工作以及其中存在的困难和问题.第 2 节介绍本文所涉 3 种 Code
Smell,简述检测的各个阶段,包括预处理、检测和结果输出,是对检测流程的概览.第 3 节研究 3 种 Code Smell
的文本和结构方式检测算法,并给出一个综合判定策略.第 4 节给出实验,以验证检测结果的准确性,并探究对检
测准确性造成负面影响的因素.最后得出结论,并讨论今后的工作.
1 相关工作
1.1 检测JS类及相关信息
图 1 为 3 个拥有相同属性和方法的 Rental 类,图 1(a)的程序是一个 Java 类,其余两段程序为 JS 类,JS 类的