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)的类型而言的.尽管引用的对象类型难以精确检出,但类中的数据访问操作总