第6章:重新组织函数

来源:互联网 发布:luac windows 编辑:程序博客网 时间:2024/05/23 11:29

1.Extract Method

将这段代码放到一个单独的函数中,并让函数名来解释该函数的用途

当发现一段很长的函数或者当需要注释才能让人理解代码的用途时,就需要将这段代码放进一个单独的函数中去了。其中目标函数的函数名字,应该是解释该函数做了什么而不是说明它是如何做的。这样在高层函数中看代码就像看注释一样了。

Extract Method分为以下几种情况:

(1).无局部变量(No Local Variables)

这种情况是最简单的,只需要将代码复制出来,然后取一个解释该段代码做了些什么的名字,然后将原函数中的代码改为对目标函数的调用就行了。

(2).有局部变量,但只是调用而不做任何修改(Using Local Variables)

这种情况就简单的将变量作为参数传给目标函数就行了。

(3).对局部变量再赋值(Reassigning)

这里又分为两种情况,一个是变量只在目标函数中使用,这时就可以把用到的变量在目标函数中声明就行了。另外一种情况当变量还做了其他处理时候,只要把该变量传给目标函数即可。

当返回值不止一个时,一个比较好的办法就是提炼另一个函数来返回。

 

2.Inline Method

对函数调用点插入函数本体。

当你发现Extract Method中的代码和函数名一样清晰可读时,就可以使用Inline Method,在源代码中去掉这个函数,而直接使用目标函数中的代码。因为虽然中间层是有价值的,但不是所有的中间层都又价值。需要将那些没有价值的中间层删掉。

还有一种情况,当你发现一段代码很不合理时,想使用Inline Method方法,然后使用另外重构手段,这样的效果往往会更好。

当然在使用这个方法时,最重要的是需要检查该函数是否具有多态性

 

3.Inline Temp

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

当你发现有一个临时变量只被赋值过一次,而且又阻碍了另外的重构方法时,就可以用该方法进行处理。

还有一种情况,Inline Temp方法多半是作为Replace Temp with Query的一部分来进行使用的。

 

4.Replace Temp with Query

将对局部变量赋值的表达式提炼到一个独立的函数中(Query==查询式),然后使用Inline Temp,将对该局部变量的所有引用点替换为对新函数的调用,新函数可以被其他函数调用。当然理想的情况是Query不会受其他因素影响,当发生其他情况时,可以运用Split Temporary Variable或者Separate Query From Modifier使情况变简单些。

当然这样可能会带来性能的问题,先不用管它,如果性能很差了。以后替换回来也是很方便的。

 

5.Introduce Explaining Variable

将一个复杂表达式 (或者其一部分)放进一个临时变量,用此变量名来解释表达式用处。

if( price > 100 && age <20) ,则可以替换为 bool minPrice = price >100; bool maxAge = age<20;

这个方法在逻辑半段(Conditional Logic)中,经常使用。但试用Extract Method方法也能解决此类问题,而且Extract

Method的作用域要大的多。当试用Extract Method很麻烦的时候,试用Introduce Explaining Variable是不错的选择。

 

6.Split Tempprary Viraible

当一个临时变量被赋值超过一次,而该临时变量又不是循环变量或者集用临时变量(通过整个函数的运算而构成的变量)时,针对每一次赋值,创造一个独立的,对应的临时变量。

这个方法是确保一个临时变量值负责一个任务(除以上两种情况的变量)。

 

7.Remove Assignments to Parameters

当发现代码中有对参数进行赋值操作时,应该以一个临时变量取代。

参数分为两种类型,一个是值穿参(PASS BY VALUE)还有一个是引用传参(PASS BY Refrence)。当是值类型时,对参数进行赋值并不会产生另外的影响,只是让代码复杂点而已,但如果是引用类型的话,原函数造成影响。

原创粉丝点击