Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

重新组织函数-《Refactoring》重构系列一

$
0
0

一、Extract Method(提炼函数)


将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。

动机:过长函数代码,或者一段需要注释才能让人理解的代码。

原则:过长代码的判断,并不是看函数的长度,关键在于函数名称和函数本体之间的语义距离

后续临时变量是实施Extract Method的最大困难。如果临时变量众多,先运用Replace Temp with Query减少临时变量。如果这么做,提炼函数工作还是困难重重,我就会动用Replace Method with Method Object,这个重构手法不在乎代码中有多少临时变量,也不在乎我们怎样使用它。

二、Inline Method(内联函数)


在函数调用点插入函数本体,然后移除该函数。

动机:(1)其内部代码和函数名称同样清晰易读。
          (2)手上有一群组织不胜合理的函数,你可以将它们都内联到一个大型函数,再从中Extract Method。

tip:可以使用Inline Method来去除系统中无用的间接层。

三、Inline Temp(内联临时变量)


将所有对该变量的引用动作,替换为对它复制的那个表达式自身。

动机:作为Replace Temp with Query的一部分使用,唯一使用情况:你发现某个临时变量被赋予某个函数调用的返回值,而且这个临时变量妨碍了其他的重构手法,如Extract Method。

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


将表达式提炼到一个独立函数中。

动机:你的程序以一个临时变量来保存某一表达式的值,如果把临时变量替换为一个查询,那么一个类中的所有函数都将可以获得这份信息。

后续:使用Replace Temp with Query要确保提炼出来的函数没有副作用,也就是说该函数并不修改任何对象的内容,如果修改内容,对他进行Separate Query from Modifler。

五、Introduce Explaining Variable(引入解释性变量)


将复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式的用途。

动机:(1)适合对条件子句进行该重构。
      (2)在较长算法中,可以运用临时变量来解释

后续:应该在什么时候使用Introduce Explaining Variable呢?答案是:在Extract Method需要花费更大工作量时。(比如一个含有大量局部变量的算法),这时候就要用Introduce Explaining Variable来理清代码,然后再考虑下一步该怎么办。搞清楚代码逻辑之后,可以运用Replace Temp with Query把中间引入的解释性临时变量去掉,当然如果最终使用Replace Method with Method Object,那么中间引入的解释性临时变量也有价值。

六、Split Temporary Variable(分解临时变量)


针对每次赋值创建一个临时变量。

动机:程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果时。

原则:如果一个变量被赋值超过一次,且不是循环变量和计算结果变量时,它的职责超过一种,会令代码阅读者糊涂,(职责单一,oop原则吧)。

七、Remove Assignments to Parametres(移除对参数的赋值)


代码想对一个参数进行赋值,这使以一个临时变量取代参数的位置。

动机:对参数赋值,它降低了代码的清晰度,容易混用按值传递和按引用传递这两种参数传递方式。

tip:Java只采用按值传递的方式。按值传递的意思是:你可以改变这个参数的值,但不能改变这个参数的引用。


八、Replace Method with Method Object(以函数对象取代函数)


你有一个大型函数,其中对局部变量的使用使你无法采用Extract Method,将这个函数放进一个单独对象中,如此i来局部变量就成了对象内的字段。然后你可以再同一个对象中对这个大型函数分解为多个小型函数。

动机:局部变量泛滥成灾,Replace Temp with Query可以助你减轻压力,但有时候你发现根部无法拆解一个需要拆解的函数,就要用到函数对象这个法宝。

tip:函数对象新建的类中,建立一个final字段,用以保存原先大型函数所在的对象(源对象),已下划线作为字段名称的前缀。

九、Subsitute Algorithm(替换算法)


将函数主题替换为另一个算法。

动机:更清晰简单的代码。

十、总结

以混淆的几种情况下坚持如下原则
(1)尽量减少临时变量。
(2)保持函数名与语义的一致。
(3)保持函数内部逻辑的清晰的情况下适当增加解释性的临时变量。
(4)对于没有比较的分离与间接层,尽量采取内联的方式。

final字段:


同时在重构和平时编程中,必要处使用final字段。
重新组织函数这节,final主要起到两个用处,
(1)禁止临时变量的两次赋值(Split Temporary Variable中)
(2)禁止对参数赋值(Remove Assignments to Parametres中)
当然还有很多地方都要用到final,比如Remove Assignments to Parametres时等等。

方法链选择:


Extract Method->(Introduce Explaining Variable)->Replace Temp with Query->Replace Method with Method Object
同时Remove Assignments to Parametres+Split Temporary Variable

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。-vernon

原文地址:http://blog.csdn.net/a511596982/article/details/8830362

作者:a511596982 发表于2013-4-21 10:52:43 原文链接
阅读:33 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>