代码的坏味道

1、Duplicate Code(重复代码):代码重复几乎是最常见的异味了,他也是Refactoring的主要目标之一,代码重复往往来自于copy-and-paste编程风格,与他相对应的OAOO是一个好系统的重要标志。

2、  Long Method(长方法):他是传统结构化的遗毒,一个方法应该具有自我独立的意图,不要把几个意图放在一起。

3、  Large Class(大类):不要把太多的责任交给一个类。

4、Divergent Change(发散式变化):类中的各部分内容变化频率相差很大,有些状态一小时变化一次,有些则几个月甚至几年变化一次,导致各内容状态发生变化的原因也不同。面向对象的抽象就是把相对不变的和相对变化的相隔离,把问题变化的一方面和另一方面相隔离,这可以使相对不变的可以重用,问题变化的每个方面都可以单独重用。

5、  Shotgun Surgery(散弹式修改):和以上相反,对系统一个地方的改变涉及到其他许多地方的相关改变,这些变化率和变化内容相似的状态和行为通常应该放在同一个类中。

6、  Feature Envy(特性依赖):对象的目的就是封装状态以及与这些状态紧密相关的行为。假如一个类的方法频繁用get 方法存取其他类的状态进行计算,那么你要考虑把行为移到涉及状态数目最多的那个类。

7、Data Clumps(数据堆积):某些数据一起出现在很多类的成员变量中,一起出现在许多方法的参数中。这些数据可以独立形成对象。

8、Primitive Obsession(一味的使用原始数据类型):面向对象的新手习惯于用原始类型的数据来表示一个概念,比如对于范围会用两个数字,对于money会有浮点,因为新手没有使用对象来表达问题中存在的概念,这使得代码难以理解,解决问题的难度增大。好的习惯是扩充语言所提供的原始数据类型,用小对象来表示范围、money、转化率、邮政编码等数据对象。

9、Switch Statement(常量开关):基于常量的开关是OO的大敌,应该用子类、State或者Strategy。

10、Parallel Inheritance Hierarchies(并行的继承层次):并行的继承层次是Shotgun Surgery的极端情况,因为改变一个层次中某个类时必须同时改变另一个层次中的并行子类。

11、Lazy Class(懒惰的类):一个功能很少的类,类的维护需要额外的开销,如果一个类承担了太少的责任,那么应该消除。

12、Speculative Generality(理论上的通用):一个类如果实现了从未用到的功能和通用性,通常这样的类或方法的唯一用户就是testcase,删除。

13、Temporary Field(孤儿属性):一个对象的属性只能在某些特定的情况下才有意义。这样的代码将难以理解,专门建立一个对象来持有这些孤儿属性,把只和他相关的行为移到该类。最常用的就是一个特定的算法需要某些只有该算法才有用的变量。

14、Message Chain(消息链):消息链发生于当一个客户向一个对象要求另一个对象,然后客户又向另一个对象要求另一个对象,再向这另一个对象要求另外的对象,如此。这种情况需要隐藏分派。

15、Middle Main(中间人):面向对象的基本特性之一就是封装,而你经常会通过分派去实现封装,但是这一步不能走太远,假如你发现一个类接口的一大半方法都在做分派,那么你可能就需要移去这个中间人。

16、Inappropriate Intimacy(过度的亲密):某些类相互之间过于亲密,他们用了太多的时间去研究对方的私有部分。

17、Alternative Classes with Different Interfaces(不同接口中的可相互替代的类或方法):做相同的事情的方法有不同的函数signature,一致把它们往类层次上移动,直至协议一致。

18、Incomplete Library Class(不完整的类库):要建立一个好的类库很困难,我们大量的程序工作都是基于类库实现。然而,如此广泛而相异的目标对类库构建者提出了苛刻的要求,类库构建者也不是万能的,有时候我们会发现库类无法实现我们的功能,而直接对类库的修改又十分困难,这时就需要用各种方法进行Refactoring(重构)。

19、  Data Class(数据类):数据对象包括状态和行为,如果一个数据对象只有状态而没有行为,那么肯定是什么地方出问题了。

posted @ 2019-08-06 10:15  Coderlhx  阅读(1932)  评论(0编辑  收藏  举报