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