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

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

                 档,训练 Doc2Vec 模型.通过该模型,可计算任意两组代码段文本的余弦相似度.余弦相似度的值域落在[−1,1]间,
                 负值的物理意义即为负相关.由于负值偶发,且本文不关注代码段负相关的信息,参照 Positive PMI                           [28,29] 对类似
                 问题的处理方式,将余弦相似度的负值视为 0,即对于文本段 T a ,T b ,其中 a 与 b 为任意代码片段,其相似度定义如
                 式(8)所示.
                                                      ⎧ 0,                  SIM  ( , ) 0T T <
                                           PSIM  (, )T T = ⎨         a  b                             (8)
                                                 a  b
                                                      ⎩ SIM  (, ), ( , )T T b  SIM T T ≥ 0
                                                            a
                                                                       b
                                                                     a
                                                         函数与所有的类       最大值
                                                                      MaxPSIM      TI fe
                                                         文档
                                            训练   Doc2Vec  向量
                                  软件系统             模型    余弦  PSIM
                                                        相似度
                                        任意两组
                                         代码段                           均值
                                                            同一类的    ClassCohesion  TI blob
                                            输入              函数之间
                                   源码文本

                                               Fig.4    Overview of textual analysis
                                                    图 4   文本分析概览

                    本文采用类似的方式,利用 LDA 计算文本的相似度,并将其作为对照组,相似度值域为[0,1].
                    本文参考 Palomba 等人    [18] 使用系统内全部非零度量值的中位数(non-null median)作为 TI fe 和 TI blob 的阈值.
                 3.2.1    文本方式检测 FE
                    此方法的基本思路是:对于被检函数 f,若存在一个非所属类,它与 f 的相似度比 f 同所属类的相似度相比更
                 高,则存在耦合,可判定检出 FE.定义 f 所属的类为 C O ,计算 f 所有类的集合 SC ALL 中每个类的文本相似度.即:对
                 于任意 C i ∈SC ALL ,计算 PSIM(f,C i ),记录最大值为 MaxPSIM,如式(9)所示.
                                                                 ( ,T
                                       MaxPSIM  (, f SC  ) =  MAX(PSIM T  )),C ∈ SC                   (9)
                                                   ALL             f  i C  i  ALL
                                              [6]
                    对于 FE,定义 Code Smell 的强度 为式(10).
                                      TI  fe (, f SC ALL ,C O ) =  MaxPSIM ( , f SC ALL ) PSIM T−  ( ,T C O )  (10)
                                                                            f
                 3.2.2    结构方式检测 Blob
                    此方法的基本思路是:类的函数间越不相关,则类的内聚性越低,Blob 的强度越大.
                                                                                 [6]
                    对于被检类 C 及其函数成员的集合 F,如式(11)所示,定义 Code Smell 的强度 为
                                                TI blob (C)=1−ClassCohesion(C)                       (11)
                 其中,ClassCohesion 为类函数间的相关性计算函数,其定义            [15] 如式(12)所示.
                                                    () =
                                         ClassCohesion C  meanPSIM  ( , f f  j  ), , f f ∈ F         (12)
                                                                  i
                                                                          j
                                                                       i
                                                          ≠
                                                         ij
                 3.3   综合判定策略
                    本文按设计问题将 Code Smell 分为内聚类和耦合类,图 5 中的 Blob 属于内聚类,图 6 中的 DC 和 FE 属于
                 耦合类.
                    判定分为两个步骤:首先,筛选 Code Smell 度量强度超过阈值的检测对象;其次,根据文本和结构方式的强
                 度确定 Code Smell 的最终强度.对于 Blob,通过结构和文本分析检测到的 Code Smell 之并集识别.如式(13)所示,
                 强度值 I blob 取两者的最大值:
                                                  I blob =MAX(TI blob ,NSI blob )                    (13)
                    对于 DC,本文采用结构分析识别,即 NSI dc >动态阈值,如图 6.强度值 I dc 取结构分析的强度如式(14)所示.
                                                        I dc =NSI dc                                 (14)
   225   226   227   228   229   230   231   232   233   234   235