Page 226 - 《软件学报》2021年第8期
P. 226
2508 Journal of Software 软件学报 Vol.32, No.8, August 2021
量阈值条件构成,规则也可以包含其他非数值型特征(例如函数名等文本特征) [14] .
本文检测 3 种 Code Smell,包括 Blob,FE 和 DC.Blob 体现低内聚,其余二者体现高耦合,定义分别为:
(1) Blob 表现为一个类,它实现了系统中的多种不同职责、体积庞大且复杂,其函数间的内聚性低 [6,14,15] .
(2) DC 表现为一个函数,与其所在类相比,它更依赖多个非所在类的操作 [16,17] .
(3) FE 表现为一个函数,与其所在类相比,它更依赖某个特定的、非所在类的操作 [6,15] .
[9]
根据软件组件的粒度及设计问题类型,表 1 给出了 Fowler 定义的 22 种 Code Smell 的分类情况.其中,FE
因同时涉及方法和类的耦合,故出现两次.God Class 亦称 Blob,后文均使用 Blob 的表述.
Table 1 Code Smell classification by the types of design problems and their granularity
表 1 以设计问题种类及其粒度为依据的 Code Smell 的分类
粒度/设计问题 低内聚 高耦合 其他
Data Clumps,
方法/函数 Long Method, Feature Envy Switch Statements
Long Parameter List
与类的继承无关 与类的继承相关 与类的继承无关 与类的继承相关 Alternative Classes with
Feature Envy, Different Interfaces,
Middle Man, Shotgun Surgery,
类 Data Class,
God Class Refused Bequest Inappropriate Intimacy, Parallel Inheritance Primitive Obsession,
Divergent Change, Hierarchies Temporary Field
Message Chains
Comments,
Duplicate Code,
包/软件系统 − − Dead Code,
Speculative Generality,
Incomplete Library Class
[7]
Silva 等人 指出:JS 软件项目极少使用类的继承特性,在样本中仅占 8%.故本文仅讨论与类继承无关的
Code Smell.Palomba 等人 [18] 提出,Refused Bequest 同 Message Chains 以及 FE 同 Inappropriate Intimacy 具有极
高的同现性.故本文不涉及 Message Chains 和 Inappropriate Intimacy.林涛等人 [19] 指出:Divergent Change 与
Shotgun Surgery 矛盾对立、存在权衡关系,且其检测过程需要对多版本进行分析.故不列入研究范围.Middle
Man 是一种耦合 Code Smell,表现为类代理(delegate)了过多其他类的操作,可视作 FE 的一个特殊情况.
综上,在表 1 的 22 种 Code Smell 中,本文聚焦 Blob 与 FE.因 FE 的量化标准不一,故需分类讨论.根据表 2,
标准可分为两类:其一,确定被检类与一或多个类发生耦合,但不确定与其耦合的类;其二,确定被检类与一个类
发生耦合,并确定与其耦合的类.为了细化耦合问题的检测,本文对 FE 取后者的定义及检测方式.为了覆盖同多
个类发生耦合情况,本文引入 DC [16] .
Table 2 Comparison of three Code Smells related to class coupling
表 2 3 种类耦合相关的 Code Smell 对比
检测方式/检测细节 FE(Lanza 等人 [14] ) FE(Fokaefs 等人 [20] ) DC(Palomba 等人 [16] )
耦合对象 一或多个类 一个类 多个类
确认耦合对象类名 否 是 否
3 个:外部数据访问次数 2 个:对特定非所在类的 2 个:耦合强度,即外部数据及
(ATFD)、本地属性访问 属性及方法访问的最高 函数访问次数(CINT)、耦合
度量参数
比例(LAA)、外部数据 次数、对所在类本地 分散度,即外部数据提供类
提供类个数(FDP). 属性及方法的访问次数. 个数与 CINT 的比值(CDISP).
本文是否采用 否 是 是
结构分析的挑战,是由 JS 语言特性和 Code Smell 度量指标的特性共同构成的,它们包括:
(1) JS 的语言特性导致结构分析所需的精确信息难以获取,检测耦合 Code Smell 需要推断类型或依赖其
他信息源.
(2) 部分 Code Smell 的量化标准不一.
(3) 类的 Code Smell 检测方式均针对以 Java 为代表的非解释型语言,对于 JS,需要改进部分度量.