语句级
主要是代码段、参数等方面的小维度的坏味道
重复代码 Duplicated Code
定义
- 同一个类、兄弟类、不相干类中出现相同表达式或函数
消除
- 提炼函数
- 函数上移(到超类或新类)
- 替换算法
过长参数列 Long Parameter List
定义
- 参数列表太长
- 全局数据是邪恶的
消除
- 以函数取代参数(被调函数内直接获取)
- 保持对象完整
- 引入参数对象
数据泥团 Data Clumps
定义
- 多项数据捆绑出现
消除
- 提炼类(老类提新类)
- 引入参数对象
- 保持对象完整
过多的注释 Comments
定义
- 注释闻起来香
- 但是往往意味着代码臭
消除
- 提炼函数
- 函数改名(自解释)
- 引入断言(针对要说明的默认条件)
基本类型偏执 Primitive Obsession
定义
- 对象的价值在于模糊了基本数据与大类之间的界限
- 新手不愿意构造小对象
消除
- 提取类
- 引入参数对象
- 以对象取代数据(提取成员变量及对应接口为类)
- 以对象取代数组(同类型不同含义构成的数组)
- 以类取代类型码(不影响行为的纯类型码)
- 以子类取代类型码(可继承,影响行为,不变的类型码)
- 以state/strategy取代类型码(影响行为,不可继承或变化的类型码)
函数级
主要是函数级、类级等方面的大维度的坏味道
过长函数 Long Method
定义
- 小函数支持了间接层的解释能力、共享能力、选择能力
- 小函数的好名字能使其相比大函数更容易理解
- 需注释说明的地方、条件表达式、循环,是常要提炼为独立函数的代码
消除
- 提炼函数
- 以查询替代取代临时变量
- 引入参数对象(缩短参数列表)
- 保持对象完整(缩短参数列表)
- 以函数对象取代函数(局部变量改为类成员变量)
- 分解条件表达式(条件分支处理提取为函数)
过大的类 Long Class
定义
- 单个类做的事情太多
消除
- 提炼类
- 提炼子类
- 提炼接口
冗赘类 Lazy Class
定义
- -让没价值的类慷慨就义
消除
- 折叠继承体系(父子类合并)
夸夸其谈未来性 Speculative Generality
定义
- 现在用不上的就删吧,留着干哈
消除
- 折叠继承体系(无用的抽象类)
- 将类内联化(不必要的委托)
- 移除参数(无用的参数)
- 函数改名(多余的抽象函数名)
令人迷惑的暂时字段 Temporary Field
定义
- 某个变量仅为类或函数内的某个特定情况而设
消除
- 提炼类(变量相关代码提取为新类)
- 引入Null对象(避免四处判空)
发散式变化 Divergent Change
定义
- 一个类受多种变化影响
- 一个类理应只收到一种变化影响而修改
消除
- 提炼类(提取变化处理到不同类)
霰弹式修改 Shotgun Surgery
定义
- 一种变化需到不同类或函数中都修改
消除
- 搬移函数(统一到类集中修改)
- 搬移字段(统一到接口集中修改)
switch惊悚现身 Switch Statements
定义
- switch容易出现重复,多出swtich就得改多处
- 这里先要消除的类型码成员变量,其次是条件表达式
消除
- 以子类取代类型码
- 子类返回各自的类型码
- 以State/Strategy取代类型码
- 无法继承或类型码会变化时
- 构建Type类及newType工厂方法提供给设置类型接口
- 以多态取代条件表达式(基于上述两方法)
对象级
主要是类及对象间关系方面的坏味道
依恋情结 Feature Envy
定义
- 一个函数调用了一个类或多个类较多的取值函数
- 数据和对数据的操作包装在一起,应该只在一处变化
消除
- 提取函数
- 搬移函数
平行继承体系 Parallel Inheritance Hierachies
定义
- 霰弹式修改的特殊情况
- 为某个类增加一个子类时必须为另一个类增加相应子类
消除
- 搬移函数(让当前类实例应用另一个继承体系的类实例)
- 搬移字段
过度耦合的消息链 Message Chains
定义
- 一个对象获取下一个对象,再获取下一个对象,依次下去得到最终对象
消除
- 隐藏委托关系
- 提取函数
- 搬移函数
中间人 Middle Man
定义
- 过度委托,如一半接口都委托出去
消除
- 移除中间人(与隐藏委托关系 是反作用)
- 内联函数(仅少量委托出去的
- 接口)
- 以继承替换委托(有非委托接口时)
狎昵关系 Inappropriate Intimacy
定义
- 两个类互相依赖,互相访问private成员
消除
- 搬移函数(减少依赖)
- 搬移字段
- 将双向关联改为单向关联(避免双向依赖)
- 提取类(提取公共部分)
- 隐藏委托关系(通过中间人委托)
- 以委托取代继承(子类继承太多)
异曲同工的类 Alternative Classes with Different Interfaces
定义
- 两个函数做同样的事情,命名却不同
消除
- 重命名函数
- 搬移函数
- 提取子类
不完美的库类 Incomplete Library Class
定义
- 库类不能满足新增功能
消除
- 引入外加函数
- 引入本地扩展(买进来再加工)
- 对象创建自己控制,则继承库类
- 否则,扩展类用委托方式
纯稚的数据类 Data Class
定义
- 只有数据和读写数据接口的类(我国有矿,等你来挖)
消除
- 封装字段(收归国有,打击非法渠道)
- 封装集合
- 移除设值函数
- 搬移函数(自主研发挖矿)
- 提取函数(自己不行就引入外资)
- 隐藏函数 (彻底国营)
被拒绝的遗赠 Refused Bequest
定义
- 有些接口或数据不想继承
消除
- 函数下移(你不想要的给你兄弟)
- 字段下移
- 以委托取代继承(断绝父子关系,我们只谈生意)