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 类的
   219   220   221   222   223   224   225   226   227   228   229