inFusion错误类型分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1God Class
1.1特征
上帝类通常为过多的操做其他类的数据,从而破坏了类的封装性。上帝类从其他类中获得功能,同时增加了自身的耦合性,通常会导致自己体积过大和较大的复杂度。
判断一个上帝类的标准有:
1.CPFD (Capsules Providing Foreign Data) 从多个不相关类(模块)中引用数据
2.WOC(Weighted Operation Count)类的所有函数的圈复杂度之和超过65
3.TCC (Tight Capsule Cohesion)TCC < 1/3 类需要具有低内聚的特性(类中直接相关的方法与
全部方法之比小于1/3),也就是较少的private方法
4.需要同时满足以上条件才可以被认定为上帝类
1.2修改
破坏CPFD, WOC, TCC 中的一个。
2Message Chains
2.1特征
过度耦合的消息链
如果你看到用户向一个对象索求(request)另一个对象,然后再向后者索求另一个对象,然后再索求另一个对象……这就是Message Chains。实际代码中你看到的可能是一长串
getThis()或一长串临时变量。采取这种方式,意味客户将与查找过程中的航行结构(structure of the navigation)紧密耦合。一旦对象间的关系发生任何变化,客户端就不得不做出相应修改。
Infusion通常会寻找具有较多调用其他类数据访问接口的方法,而且会检查返回值是否匹配。
2.2修改
采用“隐藏委托关系”修改。
先观察Message Chains最终得到的对象是用来干什么的,看看能否以Extract Method 把使用该对象的代码提炼到一个独立函数中,再运用Move Method 把这个函数推入Message Chains。
3 FeatureEnvy
3.1 特征
函数对某个class的兴趣高过对自己所处之host class的兴趣。最通常的焦点便是数据,通常为某个函数为了计算某值,从另一个对象那儿调用几乎太多取值函数(getting method)。
ATFD(Access To Foreign Data)方法从外部获取了数据
LDA(Locality of Data Accesses)内部变量与所有可以获取数据方法之比<1/3,也就意味着该方法过多的使用了外部数据,而非自身数据。
FDP(Access To Foreign Data)数据来源于很少几个类
3.2 修改
如果一个类A使用了类B的过多数据来完成某项操作或计算,那改操作就应该放在B类中。
针对ATFD,通常较难进行修改,除非该类不访问其他类。
针对LDA,可以采用增加类本身的成员变量来进行修改,提高LDA比值。
针对FDP,可以考虑将类B拆分为多个类,从而增加FDP个数。
4Blob Class
4.1特征
可以译为复杂类,它具有体积大,高度复杂的特征,因而难以维护。除此之外,如此大的类(通常超过千行)大大增加了与外部类耦合的可能性,并降低了自身的内聚性。
附加Infusion判断blob class的标准:
4.2修改
修改时可以根据4.1给出的标准破坏其判断条件。
5 Blob Module
5.1 特征
类似于blob class,指模块高度复杂且体积过大。它的检测标准非常类似于blob class,只有稍微的不同:
在面向过程语言中,函数中的长参数列表是正常的。
5.2 修改
一般情况下通过拆分模块或类降低规模和复杂度。
6 Cyclic Dependencies
6.1 特征
循环依赖,也即在依赖结构中存在有“环”。这种设计缺陷出现在系统及子系统级别,如果两个或更多的子系统相互依赖,维护和重用几乎是不可能的。
Infusion的检测规则使用与面向对象和面向过程代码。检测工具会绘制依赖图,并根据此图判断是否存在循环依赖。
6.2 修改
略
7 Data Class
7.1 特征
数据类是单纯的数据持有者,它通常不包含复杂的功能,但是会被其他类频繁和密切的引用。缺乏功能意味着这个类的数据和操作是分离的,不符合面向对象的特征。Data class缺乏封装性,由于允许其他类较为自由的存取其内部数据,导致data class较为脆弱和难以维护。
Infusion在检测时会判断data class的特征:轻量级类,包含大量的get和set方法(或public 属性)。
7.2 修改
将它处的方法移到data class中,提高其封装性;或编写高复杂度函数。
8 Data Clumps
8.1 特征
数据泥团,是《重构》提到的代码坏气味的一种。
“喜欢成群结队地待在一块儿。你常常可以在很多地方看到相同的三或四笔数据项:两个classes内的相同值域(field)、许多函数签名式(signature)中的相同参数。”
也就是一组数据重复出现,如一组数据从一个方法传递到另外一个方法,这些数据完全可以抽取为一个对象来进行处理。
8.2 修改
将这些参数抽取为对象。
9 Data Module
类似于data class,可以翻译为数据模块。为面向过程的设计缺陷。一个模块暴漏了太多数据,但自身却没有完成什么功能,也即太过开放。
检测规则非常容易:提供了过多数据为外部访问;复杂度过低
10. Distorted Hierarchy
10.1 特征
扭曲的层次
通常指继承层次过窄和过深。研究表明人的记忆难以记住超过6的层次,因此此类缺陷常常导致代码难以维护。
除此之外,它还可能预示着代码存在封装性的问题,或是划分的粒度太细。
10.2 修改
修改不合理的继承层次,渐少深度和增加广度(多个类继承自某父类,则该父类具有较高的广度)。