重构
在不破坏原有功能的前提下,调整其内部结构。
为什么要重构
提高程序的可读性、可维护性。同时,重构也能发现旧代码的bug。
我们在程序设计第一版的时候,不可能是完全正确的。
软件结构要随着系统的升级而适应变化。
什么时候重构
应该随时重构 (除非程序已腐化得非常严重)
当然,也有一些重构的好时机
- 软件增加新功能的时候
- 重构能够帮助理解原来的代码
- 出现bug或需要调试程序时
- 说明程序的可读性不佳,重构让代码更具可读性
常用的重构手法
1.提取子函数
把一个较长的函数拆分为多个子函数,每个子函数应只负责一个职责,每个子函数的命名应能清晰反映它的职责。
protected void printAllStudentsInfo(){
List<Student> allStudents = loadAllStudentsFromDB();
sortStudents(allStudents);
printStudentsInfo(allStudents);
}
2.上移函数到父类
可共用的函数放到父类中
3.下移函数到子类
父类中的函数如果不是子类都需要的,那么下移到下一个类型层级中。
4.封装固定的调用逻辑
对于常用的调用逻辑,可封装为一个大函数进行调用。
5.参数过多应封装成类
当一个函数参数过多的时候,参数的含义表达会变得复杂,应封装成对象,容易理解。
6.重构支柱 - 转移函数
转移函数: 将一个函数从一个类移动到另一个类中,使每个类都更简单。
如果一个类中和另一个类有太多行为,导致高度耦合,那么应考虑转移该函数到更适合的类型中。
7.使用NullObject来避免为空判断
默认赋值为NullObject可以避免if的为空判断
8.状态模式/策略模式可减少过多的if-else判断
不是所有的if-else都需要使用模式,要根据当前场景来决定
9.单一职责原则
一个类应只负责一个职责,有且只有一个原因引起类的变更,一个类如果有多个职责,应拆分为多个类。
从而使代码简单,职责清晰,易于维护。