代码重构4。
方法:
1重复的代码 封装和内联
2过长的方法
3过长的参数列
4相同的参数列,总是在一起的参数
5封装和过度封装:一个方法一个功能,一个方法里全是调用别的封装方法 不干实事
类:
1过大的类
2发散式变化:一个类会因为各种新需求而变化太大
3散弹式修改:一个变化导致多个类都会变化
4依恋情节:一个方法引用了很多个类,那这个方法到底该放在哪个类
5删除冗余类
6用多态代替switch
7消息链:一个对象请求另一个对象,后者又请求另一个。。。
一.重新组织函数
- 提炼方法:
好处:每个方法细粒度很小,让方法被复用的可能性增大,使高层方法看起来想 一行一行的注释,细粒度小的方法重写容易,只要提炼可以加强 方法的清晰度,就要提炼
做法: 设置函数名是为了让人更好的理解,重构的目的,剩下的做法原函数的临时变量、自己的临时变量是为了 让重构后 的功能不发生改变
2.内联函数
好处:
- 如果一个函数的内容和函数名一样清晰,就应该去掉这个函数,不必要的抽样方法让人不舒服;
- 过多的间接方法一层调一层,不是所有的间接层都有价值,就可以将无用的去掉;
- 在使用 以函数对象取代函数时,可以先使用内联,把过多的小函数 变成大函数,再新建函数对象
3.内联临时变量
唯一单独使用临时变量的情况:这个临时变量被赋予某个调用函数的返回值,就可以让它留在那
如果这个临时变量妨碍了其他重构,就去掉
4.用查询取代临时变量
好处:临时变量是暂时的,只能在所属函数内使用,如果想让类中所有函数都能获得此变量,就改成一个查询
以下都是例子:
5.引入解释性变量
跟取消临时变量正好相反,将复杂表达式或其中一部分放进一个临时变量,以此变量名来解释 用途。
好处:帮助人理解
尽量使用提炼方法,如果临时变量使提炼方法困难,再用解释性变量
6.分解临时变量
7.以函数对象取代函数
好处:提炼小型函数是最常用的方法,但如果一个方法里 临时变量非常多,会给提炼函数造成很大的困难,无法拆解时,就使用函数对象
8.替换算法
好处:重构可以将复杂的函数切成一个个小的函数,但有时候需要删除整个算法,代之以较简单的算法。
二.在对象之间搬移特性
1.搬移函数
好处:一个类和另一个类有太多合作而高度耦合,其中有的函数使用其他类的对象比自己所住对象都多,就要考虑搬移函数,让类更简单
2.搬移字段
某个字段,在所属类用的少,却在别的类用的多
3.提炼类
一个类承担一种责任,如果承担责任过多,考虑提炼
4.将类内联化
一个类的责任不明确,不负责任
5.隐藏委托关系
A类某个方法 通过B类 去调用C类,应该对外隐藏这种调用关系
6.移除中间人
和5正好相反, 不经过委托,显示出A通过调用B去调用C。
是否隐藏关系要看具体情况,如果person类中有大量的这种委托关系,需要写大量的委托函数,就没有必要了额