第六章 重新组织函数

6.1 提炼函数

  •  一个过长的函数或者一段,需要注释才能理解用途的代码,将这段代码放入一个独立的函数。
  • 每个函数的粒度很小,复用的机会就会很大。高层函数可读性就很高,看起来就是再读一堆注释。函数都是细粒度,复写也会更容易。
  • 提炼出的函数,根据这个函数的意图来命名(以它做什么命名,而不是怎么做命名)
  • 将被提炼代码段中需要读取的局部变量,当作参数传给目标函数

6.2 内联函数

  • 如果一个函数其内部代码和函数名称同样清晰易读,应该去掉这个函数,直接是用其中的代码。非必要的间接性总是让人不舒服
  • 如果有一群不甚合理的函数,可以先放到(内联)一个大的函数里,再从中提炼组织合理的小型函数
  • 间接层有其价值,但不是所有间接层都有价值,用内联函数去除无用的间接层
  1. 检查函数,确定它不具多态性。如果子类继承了这个函数,就不要将此函数内联,因为子类无法覆写一个根本不存在的函数。
  2. 找出这个函数的所有被调用点
  3. 将这个函数的所有被调用点都替换成函数本体
  4. 编译,测试
  5. 删除该函数定义

6.3 内联临时变量

  如果临时变量妨碍了其他的重构手法,应该将其内联化

  1. 检查给临时变量赋值的语句,确保等号右边的表达式没有副作用
  2. 如果这个临时变量并未被声明为final,那就将它声明为final然后编译。这可以检查该临时变量是否真的只被赋值一次
  3. 找到该临时变量的所有引用点,将它们替换成为临时变量赋值的表达式
  4. 每次修改后,编译并测试
  5. 修改完所有引用点,删除该临时变量的声明和赋值语句
  6. 编译测试

6.4 引入解释性变量

  将一个复杂表达式的一部分,放进一个临时变量。用这个变量名称解释表达式用途。例如if(多个条件),不要直接写在if里,可以定义一个临时变量。这点在阿里的开发规范中也有体现

6.5 分解临时变量

  除了循环变量、结果收集变量,其他临时变量应该只被赋值一次,如果超过一次。就应该分解为多个变量,每个变量只承担一个责任。同一个临时变量承担    两件不同的事情,容易让人糊涂。

6.6 移除对参数的赋值

  Java使用值传递,参数可以拿来用。但请不要赋值

6.7 函数对象替换函数

      创建一个函数对象,将函数放在对象里。相关逻辑比较多的情况

 

posted @ 2023-04-24 11:34  爱喝茶的猫先生  阅读(17)  评论(0)    收藏  举报