重构相关概念
重构定义
不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。
两顶帽子——一次只做一件事
- 添加新功能
- 重构
经典重构工作流程
- 测试保护
- 识别味道
- 采用手法
- 小步前进
SOLID原则
- 单一职责原则SRP
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 - 开闭原则OCP
一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。 - 里氏替换原则LSP
派生的子类应该是可以替换基类的。也就是说任何基类可以出现的地方,子类一定可以出现。 - 接口隔离原则ISP
类不应该被迫依赖他们不使用的方法,也就是说一个接口应该拥有尽可能少的行为,它是精简的,单一的。 - 依赖倒转原则DIP
高层模块不应该依赖低层模块,他们都应该依赖抽象,抽象不应该依赖于细节,细节应该依赖于抽象。
简单设计原则
- 通过所有测试
- 尽可能消除重复
- 尽可能清晰表达
- 更少的代码元素
代码坏味道
冗余和重复
- 重复代码
- 过多的注释
- 夸夸其谈未来性(过度设计)
局部膨胀
- 过长的参数列表
耦合结构不良
- 发散式变化(一个对象负责过多职责)
- 霰弹式修改(一个错误需要多处修改)
- 重复的switch
用多态替换switch
避免N:1:N结构
工程工具
- 代码静态检查
- 代码重复检查
重构手法
- 抽 抽取方法
- 替 内联方法
- 组 抽取类
- 改 重命名
- 移 移动方法
16字真言
旧的不变 新的创建 一步切换 旧的再见
简化语句
- 移动语句
- 合并条件表达式
- 以卫语句取代嵌套条件表达式
重组函数
- 提炼函数
- 内联函数
- 将查询函数与修改函数分离
- 移除标记参数
重组数据
- 拆分变量
- 提炼类
- 内敛类
- 类继承体系重构手法系列
成员搬移
继承关系调整
推荐书籍
《重构——改善既有代码的设计》
《代码大全》
《人件》
《人月神话》
《你的灯亮着吗》