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)