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

2510                                   Journal of Software  软件学报 Vol.32, No.8,  August 2021

                                            借助Google
                        输入软件
                                           Closure Compiler  类成员  计算NSCDISP,  值域为[0,1]的  值域为[0,1]的
                        系统源码                                LCOM5等度量值
                                             分析AST     类引用                  文本分析强度值       最终强度值
                                结构分析所需
                                 抽象语法树     类型推断和类间         基于类及类间引用
                                            关系检测引擎          关系的结构方式             综合
                         类检测                                 强度检测算法             判定                 输出

                          引擎                                                              判定结果
                                                            基于相似度的              策略
                                                              文本方式
                                文本分析所需     文本标准化引擎          强度检测算法
                                  源码文本
                                                                            经Min-Max标准化的
                                                     LDA/Doc2Vec
                                                    计算文本相似度                   值域为[0,1]的
                                                                             结构分析强度值
                           信息抽取阶段             预处理阶段            检测阶段                 判定阶段
                                           Fig.2    Code Smell detection process of JS4C
                                              图 2   JS4C 的 Code Smell 检测流程
                 3    检测算法和判定策略

                 3.1   基于结构分析的强度检测算法
                                                                     [6]
                    Code Smell 检测的传统方法使用代码的结构信息作为信息源 ,图 3 展示了本节涉及的结构信息和度量.
                                                函数总数k和属性总数l
                                         内部成员                  LCOM5             Min-Max标准化    NSI blob

                                                      频次a    (a-kl)÷(l-kl)

                                                    频次
                                                内部成员引用         ATLM       差      Min-Max标准化     NSI fe
                     软件系统        类                         频次
                                                       频次             ATFM-ATLM
                                                               ATFM

                                                      加权频次               比值
                                        外部引用                   NSFDP    NSCDISP  Min-Max标准化    NSI dc

                                                    函数调用频次            NSFDP÷CINT
                                                                CINT

                                              Fig.3    Overview of structural analysis
                                                    图 3   结构分析概览
                 3.1.1    结构方式检测 DC
                    Palomba 等人 [16] 对 Java 的 DC 检测使用了 CINT(coupling intensity,耦合强度)、CDISP(coupling dispersion,
                 耦合分散度)和 FDP(foreign data provider,外部数据提供类)这 3 种度量.其中,CINT 为被检测函数中经去重的函
                 数调用次数,FDP 指标用是所有被访问的数据所属类的去重集合.CDISP 的计算公式如式(1)所示.
                                                           N (FDP ( ))f
                                                  CDISP ()f =                                         (1)
                                                            CINT ()f
                    由于 JS 的语言特性限制了类型检测,即便类型推断可确定部分类型,也无法确定全部函数的入参类型和数
                 据访问操作的变量类型.CINT 和 CDISP 的计算都依赖类型判定,若不作改进,检测难以进行.
                    据此,本文提出非严格的 NSCDISP(non-strict coupling dispersion),它的非严格是针对 FDP 和 CINT 必须精
                 确检测函数入参(input parameter)的类型而言的.尽管引用的对象类型难以精确检出,但类中的数据访问操作总
   223   224   225   226   227   228   229   230   231   232   233