首页 > 代码库 > 重构笔记

重构笔记

提炼函数(Extract Method)

我们需要的是一些简短而命名良好的函数。首先每个函数的粒度小的话,那该函数被复用的机会就越大;其次,这会提高代码可读性,使高层函数读起来像注释;再次,如果函数都是细粒度,则覆写起来会容易些。

1、首先使用以查询代替临时变量(Replace Temp with Query)对原函数进行改造,对于一个方法的临时变量:

  • 有参数传入时避免对参数进行直接赋值(Java是按值传递),而是创建一个临时变量得到参数的值。
  • 若临时变量存在多次赋值,将该临时变量分解为多个临时变量,此时临时变量都可以声明为final。
  • 将对该临时变量赋值的语句的等号右侧部分提炼到一个独立的函数中。
  • 对该临时变量的所有引用点都替换为对应的函数名。

2、开始提炼函数

  • 创造一个新函数,根据这个函数的意图对他命名(以“做什么”来命名),并将提炼出的代码从原函数复制到该新函数中。
  • 检查是否有“仅作用于被提炼代码段”的临时变量,如果有,在目标函数中将其声明为临时变量;检查是否有既作用于原函数,又作用于被提炼代码段的临时变量,如果有,将其作为目标函数的返回值Return给原函数。
  • 将被提炼代码中需要读取的局部变量,当作参数传递给目标函数。
  • 编译,测试。

 

提炼超类(Extract SuperClass)

重复代码是系统中最糟糕的东西之一,而提炼超类就是为两个类建立一个超类,并将相同特性迁移至超类,这就是继承。

1、在提炼超类进行继承之前,我们有必要通过组合进行提炼类的操作。组合就是对整体类到局部类的一个分解过程,而整体类能够灵活的对局部类进行封装,改变局部类的接口。如下例:

import java.util.Set;public class  IntSet{    private Set<Integer> set;        public IntSet(Set<Integer> set){        this.set=set;    }        public boolean add(int a) {        return set.add(a);    }        public boolean remove(int a) {        return set.remove(a);    }}

在这段代码中Inset和Set之间就是组合的关系,Intset是整体类,Set是局部类,而我们在InSet类中取消了Set类的许多方法,起到了改变局部类接口的作用。

2、开始提炼超类

  • 创建一个空白得抽象超类。
  • 从高层函数开始,将某个待提升函数的代码段赋值到超类中的新函数中并进行命名。
  • 若待提示函数使用了子类的一个字段,使用Pull up Field将字段也提升至超类中。
  • 若待提升的函数中出现了子函数:若子函数的实现完全相同,则把子函数也全部提升至超类;若不完全相同,可在超类中将该子函数声明为抽象函数。
  • 逐一编译,测试每一个子类。

重构笔记