1 重复代码
- 重复的魔法数字:定义为常量
- 重复的代码块:提取函数
- 重复的类实现:使用类的继承或者扩展代替
- 兄弟子类中相同:上移到父类
- 相似的方法:将差异部分作为参数自定义方法实现
- 不同类中的重复:提取新类。
2 过长的函数
- 提取注释、循环,以用途命名
- 以查询代替临时变量
- 分解条件表达式
3 过大的类
- 将关联变量提取为新类、子类
- 重复代码提取为方法
4 过长参数列表
- 用参数对象替代将过多的参数
5 发散式变化
- 使一个类只受一种变化的影响,将每种变化提取到新的类中
6 霰弹式修改
- 使一种变化只影响一个类,将变化在多个类中的影响提取到一个类中
7 依恋情节
- 尽可能的将数据和数据的行为操作放一起
8 数据泥团
- 将总是在不同类中一起出现的字段提取到独立类中
9 基本类型偏执
- 使用对象替换单独数据值
- 以类、子类、状态模式和策略模式替代类型码
- 经常放一起的字段提取类
- 引入参数对象
- 以对象替代数组
10 switch惊悚现身
- 使用多态替换switch语句
- 提取函数
- 以子类、状态模式和策略模式替代类型码
- 单一函数中
- 以明确函数取代参数
- 选择条件有null:引入NULL对象
11 平行继承体系
平行继承体系 是 霰弹式修改 的特殊情况。每当为某个类增加一个子类后,必须也为另一个类增加一个子类。
常见的解决方案是: 将相同的操作抽象到父类、引用类解决。
12 冗赘类
精简无用的类
- 没用的组件:将类内联化
- 子类没有足够工作:合并继承层次
13 夸夸其谈未来性
用不上的各种装置
- 不必要的委托:将类内联化
- 没用的抽象类:合并继承层次
- 未使用的参数:移动参数
- 函数名称带有多余抽象意味:重命名方法
14 令人迷惑的暂时字段
- 将为特定情况设置的临时变量,相关代码提取到新类中
- 在需要的情况下创建NULL对象,避免条件式代码
15 过度耦合的消息链
消息事件传递链过长
- 隐藏委托关系:提取消息最终对象代码到独立函数中
16 中间人
过度运用委托
- 去除中间人:直接和真正负责的对象打交道
- 以继承取代委托:把中间人变成对象的子类
17 狎昵关系
过于狎昵的类需要被岔开
- 移动方法、字段
- 双向关联改为单项关联
- 继承取代委托
- 隐藏委托关系
18 异曲同工的类
两函数功能相同签名不同:根据用途重命名方法
19 不完美的类库
- 修改类库中的一两个函数:引入外部方法
- 添加额外的行为:引入本地扩展
20 纯稚的数据类
类似于贫血型Model.期望为model增加set/get函数,保护数据不容易在外部被修改.
- 封装字段
- 封装集合
- 不该被修改的自动:去除setter方法
- 尝试移动使用setter、getter的方法到data类
21 被拒绝的遗赠
子类继承了父类中子类不需要的部分函数和数据
- 为子类新建一个兄弟类,将不需要的部分移至此类
- 用委托代替继承关系
22 过多的注释
尝试代码自解释