Martin Fowler也在其著作《重构:改善即有代码的设计》提到:“代码坏味道(Bad Code Smells)”是低质量的代码设计和实现所显现的“症状”。书中罗列了22种代码坏味道以及对应的重构手法。
- 1 Duplicated Code --(重复代码)难维护。
[解决方法]:同一个类中则提取公共函数,不同类中可以函数提炼独立类,或者提到父类。
- 2 Long Method --(函数长)难理解。
[解决方法]:拆分成若干函数,消除函数内的临时变量,从而使函数体变短。
- 3 Large Class --(类大)难理解。
[解决方法]:拆分成若干类,将相关性比较高的属性或方法放到一个新的类。
- 4 Long Parameter List --(参数多)难用,难理解。
[解决方法]:将参数封装成结构或者类。
- 5 Divergent Change --(万能类)发散式修改,一个类受多种变化的影响,好多需求的修改,都会动他。
[解决方法]:将总是一起变化的东西拆到一个新的类。
- 6 Shotgun Surgery --(天女散花的逻辑)散弹式修改,改某个需求的时候,要改很多类。
[解决方法]:将各个修改点,集中起来,合成一个新类。
- 7 Feature Envy --(红杏出墙的函数)使用了大量其他类的成员
[解决方法]:将这个函数挪到那个类里面。
- 8 Data Clumps --(数据团)常一起出现的一坨数据。
[解决方法]:他们那么有基情,就在一起吧,给他们一个新的类。
- 9 Primitive Obsession --(偏爱基本类型)热衷于使用int,long,String等基本类型。
[解决方法]:反复出现的一组变量,完全可以用对象来代替这些变量。
- 10 Switch Statements --(switch语句)switch惊悚现身
[解决方法]:多数情况下简单的多态就可以解决,或者是枚举可以解决。另外就是state/strategy模式。
- 11 Parallel Inheritance Hierarchies --(平行继承)增加A类的子类ax,B类也需要相应的增加一个bx。
[解决方法]:应该有一个类是可以去掉继承关系的,继承改为组合。
- 12 Lazy Class --(冗赘类)如果他不干活了,炒掉他吧。
[解决方法]:如果一个类体现不出其价值,把这些不再重要的类里面的逻辑,合并到相关类,删掉旧的。
- 13 Speculative Generality --(夸夸其谈未来性)
[解决方法]:不用的类或属性或方法删掉,多余的继承折叠,多余的委托内联化,过大的理想具体化。
- 14 Temporary Field --(临时字段)仅在特定环境下使用的变量。
[解决方法]:将这些临时变量集中到一个新类中管理。
- 15 Message Chains --(消息链)过度耦合的才是坏的。
[解决方法]:拆函数或者移动函数。
- 16 Middle Man --(中介)大部分都交给中介来处理了。
[解决方法]:把过度委托的中间类删除,或者把过度委托的函数放在本类,或者用继承替代委托。
- 17 Inappropriate Intimacy --(太亲密)职责不清,两个类彼此使用对方的私有的东西。
[解决方法]:划清界限拆散,或合并,或改成单项联系。继承往往造成过度亲密,使用委托代替
- 18 Alternative Classes with Different Interfaces --(相似的类,有不同接口)异曲同工的类
[解决方法]:重命名,移动函数,或抽象子类。要么分开,要么合并。
- 19 Incomplete Library Class --(不完善的类库)
[解决方法]:本地使用可以包成新的类。加少量的函数则包一层函数
- 20 Data Class --(纯数据类)类很简单,仅有公共成员变量,或简单操作函数。
[解决方法]:将相关操作封装进去,减少public成员变量(映射了数据库的对象除外)。
- 21 Refused Bequest --(继承过多)父类里面方法很多,子类只用有限几个。
[解决方法]:用委托替代继承关系。
- 22 Comments --(太多注释)这里指代码太难懂了,不得不用注释解释。
[解决方法]:避免用注释解释代码,而是说明代码的目的,背景等。好代码会说话。
- 注:
作为一本很多年前的书,其中关注的Java语言与软件工程方法论已经发展了,有部分“坏味道”需要发展的眼光来看。
閱讀更多 EndlessTechWorld 的文章