重新组织函数
大多数问题都源于Long Methods,因为他们往往包含了大量的信息,而这些信息有被函数中错综复杂的逻辑所掩盖,不易甄别。所以重新组织函数中最主要的重构手法就是extract method。在使用extract method的手法时一般需要用到处理参数的一些手法,如:replace temp with query,split temporary varaibable和replace method with method object.
当然如果发现原来的实现方式复杂导致了过程函数,而又另外的更为简明、解决方式更优的方法的话,可以使用substitute algorithm手法替换掉该Method。
一.Extract Method【★】
如果有一段代码可以组织在一起并且独立出来,那么就可以把它们放进一个独立的函数中,并让函数名解释这段代码的用途。
一般如果一个函数过长或者一段代码需要注释才能看懂,那么这段代码就可能需要放进一个可以自解释的独立函数中。
处理步骤:
1.提炼出该代码片段,放到一个新函数中,新函数的函数名能够描述该段代码的用途。
2.找出该新函数中访问到的作用域仅限于源函数的局部变量和参数。
这些变量中较为难处理里主要包括3类基本类型的局部变量和参数:
⑴.对于源函数的参数,直接放到新函数中的参数列表中。
注:应确保原函数中不要修改传入的参数。否则用过使用Remove Assignments to Parameters手法先处理掉。
⑵.仅用于该提炼代码片段的局部变量(临时变量),对于这里变量可以直接在新函数中声明为新函数的局部变量。
⑶.在提炼代码片段以外的地方进行了有意义地赋值或者访问的变量。
如果该代码段中只有一个局部变量被赋值了,那么可以考虑将该新函数修改为一个查询或者返回该变量值的函数。如果这样处理非常难或者有不止一个局部变量被修改了,那么这个段代码可能不能这样原封不动的提炼出来了,可能需要先根据一个变量一个职责的原则先用split temporary avariable等手法先处理下这个方法,然后再尝试提炼。另外也可以先使用relpace temp with query的手法消灭一部分局部变量。
3.处理完局部变量之后,进行编译。
4.替换源函数中的代码段为调用该新函数,并去除不用的局部变量声明。
5.编译,测试。
二.Inline method
如果一个函数的实现同他的函数名称一样明了,而且比较简单。那么就可以将该函数的内容移入到调用该函数的地方去。然后移除该函数。
一般该手法是配合Extract Method使用的,在进行Extract Method之前使用Inline Method,然后使用Extract Method重新组织函数。
注:如果该函数是多态调用的,那么不可以进行这样的重构。
三.Inline Temp
使用不多。
四.Replace Temp with Query
程序中以一个临时变量保存一个表达式的结果,那么可以将该表达式提炼到一个新函数中去,然后在使用这个临时变量的地方换成调用该函数即可。
注:该手法用在Extract Method之前用来减少临时变量。
五.Introduce Explaining Variable
用的不多,基本上都是可以使用extract method。
六.Split Temporary Variables
原则:每个临时变量都应该只承担一个责任。
如果一个变量被赋值了一次以上的(不包括循环变量和结果累计变量),那么就意味着该变量的职责不是一个了,就应该被替换为多个变量,每个变量分担一个职责。
七.Replace Method with Method Object【★】
有一个大型函数,其中局部变量的使用使得你无法采用Extract Method的时候:
将这个函数放到一个单独的对象中,如此一来函数中的局部变量就变成了该对象的属性字段了。然后你就可以在这个对象中将这个大型函数分解成多个小函数了。
处理步骤:
1.根据该大型方法的功能,新建一个类。
2.新类中新建一个final属性保存该大型函数所在的原对象。
3.对于原函数中的局部变量和参数在新对象中新建一个属性与之对应。
4.新建一个构造函数,构造参数包含一个源对象和各个局部变量以及源函数的参数
5.新建方法,然后将原函数搬入(假设命名为compute)
6.重构该函数。
7.编译测试。
8.替换原函数体为new 一个新对象,并调用新建对象的方法compute。
八.Substitute Algorithm
用新算法替换掉旧函数体
分享到:
相关推荐
第6章 重新组织函数 109 第7章 在对象之间搬移特性 141 第8章 重新组织数据 169 第9章 简化条件表达式 237 第10章 简化函数调用 271 第11章 处理概括关系 319 第12章 大型重构 359 第13章 重构,复用...
提供组件机构代码校验函数,可以由外部函数直接调用,返回true或false
MySQL关于自定义函数以及常用函数的组织点的总结(例如日期函数)
第6章 重新组织函数 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数 6.1 Extract Method(提炼函数) 6.2 Inline Method(内联函数) 6.3 Inline Temp(内联临时变量) 6.4 Replace Temp with Query(以查询取代临时变量) 6.5 Introduce Explaining Variable(引入...
本人oracle写的标量函数,结果返回0表示校验失败,1表示校验合法。本函数在商业应用中使用多年禁得起考验!
oracle组织机构代码验证函数,CHECKORGCODE.sql
tacklebox, 组织和共享 fish shell 函数的框架 Tacklebox问题组织和共享 shell 代码库和Fragment是很困难的。解决方案Tacklebox是 Fish shell 框架,它使得组织和共享有用的shell 功能。工具和主题集合变得很容易。...
18位身份证和组织机构代码校验ORACLE函数
基于神经元特性的径向基函数神经网络自组织设计方法.pdf
所列出的MPI 函数和变量是按照它们的类别组织的。为方便查找特定的函数,附3.1 中给出了一个MPI 的函数、变量名称按字母顺序排列的索引。 本附录的内容主要参考文献[8, 9] 以及MPICH的部分在线手册编写而成
每个函数可以单独放在一个文件中,也可以将若干个功能相关的函数放在一个文件中,C语言程序可以由多个文件组成,文件负责组织存放若干函数。 (2)源程序文件是C程序的编译单位,每个文件单独编译,便于调试,方便...
10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理