重构——4以查询取代临时变量(Replace Temp with Query)

以查询取代临时变量(Replace Temp with Query)

你的程序以一个临时变量保存某一个表达式的结果。将这个表达式提炼到一个独立函数中,将这个临时变量所有的引用点替换为对新函数的调用,此后,新函数就可以被其他函数使用

一、动机

临时变量是暂时的,只能在所属函数中使用

二、做法

1、找出只被赋值一次的临时变量

2、将该临时变量声明为final

3、编译

4、将“对该临时变量赋值”之语句的等号右侧部分提炼到一个独立函数中。首先将函数声明为“private”,日后有需要在放松保护,确保提炼出来的函数无任何副作用

5、编译,测试

6、在该临时变量身上实施Inline Temp

时间: 2024-10-24 17:08:25

重构——4以查询取代临时变量(Replace Temp with Query)的相关文章

重构——22以对象取代数组(Replace Array with Object)

以对象取代数组(Replace Array with Object) 你有一个数组,其中的元素各自代表不同的东西:以对象替换数组.对于数组中的每个元素,以一个字段来表示 一.动机 数组应该只用于"以某种顺序容纳一组相似对象" 二.做法 1.新建一个类表示数组所拥有的信息,并在其中以一个public字段保存原先的数组 2.修改数组的所有用户,让它们改用新类的实例 3.编译,测试 4.逐一为数组元素添加取值/设值函数.根据元素的用途,为这些访问函数命名.修改客户端代码,让它们通过访问函数取

重构——33以字段取代子类(Replace Subclass with Fields)

以字段取代子类(Replace Subclass with Fields) 你的各个子类的唯一差别只在"返回常量数据"的函数上:修改这些函数,使他们返回超类的某个新增字段,然后销毁子类 一.动机 1.建立子类的目的,是为了增加新特性或变化其行为 2.子类中只有常量函数,实在没有足够的存在价值 二.做法 1.对所有子类使用Replace Constructor with Factory Method 2.如果有任何代码直接引用子类,令它改而引用超类 3.针对每个常量函数,在超类中声明一个

重构——49以函数取代参数(Replace Parameter with Methods)

以函数取代参数(Replace Parameter with Methods) 对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数:让参数接受者去除该项参数,并直接调用前一个参数 一.动机 如果函数可以通过其他途径获得参数值,那么它就不应该通过参数取得该值 二.做法 1.如果有必要,将参数的计算过程提炼到一个独立的函数中 2.将函数本体内引用该参数的地方改为调用新建的函数 3.每次替换后,编译并测试 4.全部替换完成后,使用Remove Parame

重构——56以测试取代异常(Replace Exception with Test)

以测试取代异常(Replace Exception with Test) 面对一个调用者可以预先检查的条件,你抛出了一个异常:修改调用者,使它在调用函数之前先做检查 一.动机 异常只应该被用于异常的,罕见的行为,也就是那些产生意料之外错误的行为,而不应该成为条件检查的替代品 二.做法 1.在函数调用点之前,放置一个测试语句,将函数内catch区段中的代码复制到测试句的适当的if分支中 2.在catch区段起始处加入一个断言,确保catch区段绝对不会被执行 3.编译,测试 4.移除所有的catc

重构——67以委托取代继承(Replace Inheritance with Delegation)

以委托取代继承(Replace Inheritance with Delegation) 1.某个子类只使用了超类接口中的一部分,或是根本不需要继承而来的数据 2.在子类中新建一个字段用以保存超类:调整子类函数,令它改而委托超类:然后去掉两者之间的继承关系 一.动机 超类中的许多操作并不真正适用于子类 二.操作 1.在子类中新建一个字段,使其引用超类的一个实例,并将它初始化为this 2.修改子类内的所有函数,让它们不再使用超类,转而使用上述那个受托字段.每次修改后,编译并测试 3.去除两个类之

重构——68以继承取代委托(Replace Delegation with Inheritance)

以继承取代委托(Replace Delegation with Inheritance) 你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托关系:让委托类继承受托类 一.动机 需要受托类中的所有函数 二.做法 1.让委托端成为受托端的一个子类 2.编译 3.将受托字段设为该字段所处对象本身 4.去掉简单的委托函数 5.编译并测试 6.将所有其它涉及委托关系的代码,改为调用对象自身 7.移除受托字段

重构——3内联临时变量(Inline Temp)

内联临时变量(Inline Temp) 你有一个临时变量,只被一个简单表达式赋值一次,而它妨碍了其他重构手法.将所有对该变量的引用动作,替换为对它赋值的那个表达式自身 一.动机 1.作为"以查询取代临时变量"的一部分使用 2.临时变量妨碍了其他的重构手法 二.做法 1.检查给临时变量赋值的语句,确保等号右边的表达式没有副作用 2.如果这个临时变量并未被声明为final,就将它声明为final,然后编译,确保这个变量真的只被赋值了一次 3.找到该临时变量的所有引用点,将它们替换为&quo

重构——8以函数对象取代函数(Replace Method with Method Object)

以函数对象取代函数(Replace Method with Method Object) 有一个大型函数,其中对局部变量的使用使你无法采用Extract Method.将这个函数放进一个单独的对象里中,如此一来局部变量就成了对象内的字段,然后你就可以在同一个对象中将这个大型函数分解为多个小型函数 一.动机 1.小函数优美动人,只要将相对独立的代码从大型函数中提炼出来,就可以大大提高代码的可读性 2.局部变量的存在会增加函数分解难度.如果一个函数之中局部变量泛滥成灾,那么想分解这个函数是非常困难的

重构——47以明确函数取代参数(Replace Parameter with Explicit Methods)

以明确函数取代参数(Replace Parameter with Explicit Methods) 你有一个函数,其中完全取决于参数值而采取不同的行为:针对该参数的每一个可用值,建立一个独立函数 一.动机 1.根据不同参数值作出不同的行为,那么就应该使用本项重构 2.接口更加清楚 二.做法 1.针对参数的每一种可能性,新建一个明确函数 2.修改表达式的每个分支,使其调用合适的新函数 3.修改每个分支后,编译并测试 4.修改原函数的每一个被调用点,改而调用上述的某个合适的新函数 5.编译,测试