重构——1提炼函数(Extract Method)

提炼函数(Extract Method)

你有一段代码可以被组织在一起并独立出来,将这段代码放进一个独立的函数中,并让函数名称解释该函数的用途。

一、动机

1、每个函数的粒度都小,那么被复用的几率就大

2、函数的长度不是问题,关键在于函数名称和函数本体之间的语义距离

3、使高层函数读起来向一系列注释

4、如果函数都是细粒度,那么函数覆盖也会更容易些

二、做法

1、创建函数,名字要起好

2、转移代码

3、检查提炼出的代码是否引用了作用域限于原函数的变量(临时变量和源函数参数)

4、检查是否有任何的局部变量的值被提炼出的代码改变,如果有:将被提炼的代码段处理为一个查询,分解临时变量, 以查询取代临时变量

5、将被提炼代码中需要读取的局部变量,当做参数传递给目标函数

6、处理完所有的局部变量之后,进行编译

7、在原函数中,将被提炼代码段替换为对目标函数的调用,删掉多余的临时变量声明

8、编译,测试

时间: 2024-09-24 07:10:26

重构——1提炼函数(Extract Method)的相关文章

代码重构(一):函数重构规则

重构是项目做到一定程度后必然要做的事情.代码重构,可以改善既有的代码设计,增强既有工程的可扩充.可维护性.随着项目需求的不断迭代,需求的不断更新,我们在项目中所写的代码也在时时刻刻的在变化之中.在一次新的需求中,你添加了某些功能模块,但这些功能模块有可能在下一次需求中不在适用.或者你因为需求迭代与变更,使你原有的方法或者类变得臃肿,以及各个模块或者层次之间耦合度增加.此时,你要考虑重构了.   重构,在<重构,改善既有代码的设计>这本经典的书中给出了定义,大概就是:在不改变代码对外的表现的情况

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

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

重构——63提炼超类(Extract Superclass)

提炼超类(Extract Superclass) 两个类有相似特性:为这两个类建立一个超类,将相同的特性搬移到超类 一.动机 减少重复代码 二.做法 1.为原本的类新建一个空白的抽象超类 2.运用Pull Up Field,Pull Up Mehtod,Pull Up Constructor Body逐一将子类的共同元素上移到超类 3.每次上移后,编译并测试 4.检查留在子类中的函数,Extract Method,Pull Up Method,也许可以Form Template Method 5

php 数组处理函数extract详解及实例代码_php实例

php 数组处理函数extract extract函数用于从数组中将变量导入到当前的符号表 基本语法 int extract ( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]] ) 本函数用来将变量从数组中导入到当前的符号表中.检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突. 参数介绍: 参数 描述 var_array 必需.规定要使用的数组

php 数组处理函数extract详解及实例代码

php 数组处理函数extract extract函数用于从数组中将变量导入到当前的符号表 基本语法 int extract ( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]] ) 本函数用来将变量从数组中导入到当前的符号表中.检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突. 参数介绍: 参数 描述 var_array 必需.规定要使用的数组

重构——12提炼类(Extract Class)

提炼类(Extract Class) 并发和事务的风险:某个类做了两个类做的事:建立一个新类,将相关的字段和函数从旧类搬移到新类 一.动机 1.让类的抽象更清楚,让类的责任更明确 2.如果某些数据和函数总是一起出现,某些数据经常同时变化甚至彼此相依,这就表示你应该将它们分离出去 3.子类化的时候你发现某些特性需要以一种方式来子类化,另外一些特性需要以另一种方式子类化,这就意味着你需要分解原来的类 二.做法 1.决定如何分解类所负的责任 2.建立一个新类,用以表现从旧类分离出来的责任 3.建立从"

重构——62提炼子类(Extract Subclass)

提炼子类(Extract Subclass) 类中的某些特性只被某些实例用到:新建一个子类,将上面所说的那一部分特性移到子类中 一.动机 你发现类中的某些行为只被一部分实例用到,其他实例不需要它们 二.做法 1.为源类定义一个新的子类 2.为这个新的子类提供构造函数 3.找出调用超类构造函数的所有地点.如果它们需要的是新建的子类,令它们改而调用新的构造函数 4.逐一使用Push Down Method和Push Down Field将源类特性移到子类去 5.Replace Conditional

重构——46令函数携带参数(Parameterize Method)

令函数携带参数(Parameterize Method) 若干函数做了类似的工作,但在函数本体中却包含了不同的值:建立单一函数,以参数表达那些不同的值 一.动机 去除重复代码,提高灵活性 二.做法 1.新建一个带有参数的函数,使它可以替换先前所有的重复性函数 2.编译 3.将调用旧函数的代码改为调用新函数 4.编译,测试 5.对所有旧函数重复上述步骤,每次替换后,修改并测试

重构——52隐藏函数(Hide Method)

隐藏函数(Hide Method) 有一个函数,从来没有被其它任何类用到:将这个函数改为private 一.动机 提高函数可见度容易,降低稍微困难一些 二.做法 1.经常检查有没有可能降低某个函数的可见度 2.尽可能降低所有函数的可见度 3.没完成一组函数的隐藏之后,编译并测试