第六章 重新组织函数
6.1 提炼函数
- 一个过长的函数或者一段,需要注释才能理解用途的代码,将这段代码放入一个独立的函数。
- 每个函数的粒度很小,复用的机会就会很大。高层函数可读性就很高,看起来就是再读一堆注释。函数都是细粒度,复写也会更容易。
- 提炼出的函数,根据这个函数的意图来命名(以它做什么命名,而不是怎么做命名)
- 将被提炼代码段中需要读取的局部变量,当作参数传给目标函数
6.2 内联函数
- 如果一个函数其内部代码和函数名称同样清晰易读,应该去掉这个函数,直接是用其中的代码。非必要的间接性总是让人不舒服
- 如果有一群不甚合理的函数,可以先放到(内联)一个大的函数里,再从中提炼组织合理的小型函数
- 间接层有其价值,但不是所有间接层都有价值,用内联函数去除无用的间接层
- 检查函数,确定它不具多态性。如果子类继承了这个函数,就不要将此函数内联,因为子类无法覆写一个根本不存在的函数。
- 找出这个函数的所有被调用点
- 将这个函数的所有被调用点都替换成函数本体
- 编译,测试
- 删除该函数定义
6.3 内联临时变量
如果临时变量妨碍了其他的重构手法,应该将其内联化
- 检查给临时变量赋值的语句,确保等号右边的表达式没有副作用
- 如果这个临时变量并未被声明为final,那就将它声明为final然后编译。这可以检查该临时变量是否真的只被赋值一次
- 找到该临时变量的所有引用点,将它们替换成为临时变量赋值的表达式
- 每次修改后,编译并测试
- 修改完所有引用点,删除该临时变量的声明和赋值语句
- 编译测试
6.4 引入解释性变量
将一个复杂表达式的一部分,放进一个临时变量。用这个变量名称解释表达式用途。例如if(多个条件),不要直接写在if里,可以定义一个临时变量。这点在阿里的开发规范中也有体现
6.5 分解临时变量
除了循环变量、结果收集变量,其他临时变量应该只被赋值一次,如果超过一次。就应该分解为多个变量,每个变量只承担一个责任。同一个临时变量承担 两件不同的事情,容易让人糊涂。
6.6 移除对参数的赋值
Java使用值传递,参数可以拿来用。但请不要赋值
6.7 函数对象替换函数
创建一个函数对象,将函数放在对象里。相关逻辑比较多的情况
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号