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,需要改进部分度量.
   221   222   223   224   225   226   227   228   229   230   231