Page 231 - 《软件学报》2021年第8期
P. 231

黄子杰  等:检测 JavaScript 类的内聚耦合 Code Smell                                          2513


                    对于 FE,本文将存在结构耦合(0<CINT)作为检测 FE 的前置条件,并优先取文本方法的检测值.如式(15)所
                 示,强度值 I fe 为
                                                   ⎧ TI  fe ,    0 CINT<  且 TI >  0
                                                                    fe
                                               I =  fe  ⎪ NSI fe , 0 CINT且 TI =  fe  0               (15)
                                                          < ⎨
                                                   ⎪
                                                   ⎩ 0,        0≥ CINT
                                            LCOM5               I blob=MAX(TI blob,NSI blob)
                                           类间低内聚


                                         NSI blob>动态阈值
                                                           OR          BLOB
                                          TI blob>动态阈值

                                   Fig.5    Unified identification strategy of cohesion design problem
                                              图 5   内聚设计问题的综合判定策略


                         NSI fe>动态阈值
                                          OR        同某类发生耦合
                          TI fe>动态阈值
                                                                         AND         Feature Envy
                                                  0<CINT,即结构耦合存在
                                 CINT           动态阈值<
                          与外部类成员的耦合强度             CINT                                Dispersed
                                                           AND      NSI dc>动态阈值       Coupling
                                CDISP
                             耦合的分散程度
                                                                                      I dc=NSI dc

                                    Fig.6    Unified identification strategy of coupling design problem
                                              图 6   耦合设计问题的综合判定策略

                 3.4   可行性分析
                    本文的先进性体现在以下几处:在结构分析方面,本文讨论并选定了 3 种 Code Smell 的检测方式和阈值,针
                 对 JS 检测任务提升了 DC 检测涉及的 FDP 和 CDISP 指标的宽容度,使其适应类型不明的情况;在文本分析方
                 面,本文使用了更优的文本分析算法,并利于文本语义特征实现文本和结构分析的检测结果互补.针对两种分析
                 方法的特点,本文制定了 3 种 Code Smell 的综合判定策略.
                    将文本分析和结构分析结合是可行且有效的.
                    •   一方面,代码组件的文本中蕴含业务逻辑和组件功能(例如 service,manager)信息,这些信息在结构分析
                        时往往难以被充分利用        [30] .已有学者尝试改善这一情况,例如:Moha 等人         [26] 检测 Blob 时,在结构方式的
                        基础上根据类名判断组件功能;Palomba 等人            [15] 通过实验得出文本和结构分析的检测结果互补,相互
                        结合可以获得更好的检测效果,将两种信息源结合的工作较少.
                    •   另一方面,JavaScript 的类型系统和 Java 等强类型语言不同,在变量声明时无需明确类型,导致传统的静
                        态分析难以奏效,无法获得像强类型语言一样详实的类型信息.
                    判定 Blob 使用文本和结构方式的最大值的原因是:(1) Blob 的结构方式只需要检测访问本地和外部数据的
                 次数,对于外部数据的访问,无需明确操作涉及的类,因此获得的结构信息是完整的;(2)  本文的强度值均标准化
                 至[0,1]区间,可以直接比对.
                    判定 FE 时,之所以优先取文本方法的检测值,是因为结构方式检测 FE 需要确定耦合对象所属的类.由于 JS
   226   227   228   229   230   231   232   233   234   235   236