重构——重新组织函数

2016-11-22  本文已影响17人  hklbird

函数重构几乎都是源自于Long Methods。这导致了函数包含的信息过多,信息带来的逻辑错综复杂。

1 Extract Method(提炼函数)

<b>Summary:</b>将一段代码放进一个独立函数中,并让函数名称解释该函数的用途。
<b>Motivation:</b>将过长的函数分割成独立的函数,改善代码清晰度。
<b>Routine:</b>

2 Inline Method

<b>Summary</b>:再函数调用点插入函数本体,然后移除该函数。
<b>Motivation</b>:某些函数其内部结构和函数名同样清晰易读,也肯能是重构之后使其内容和名称变得同样清晰;手底下一些错误拆分的函数内联到一个大型函数中,再重新从中提炼小函数;中间层级过于多,导致了函数只是一个其余函数的代理。这三类是需要使用内联手法进行refacting。
<b>Routine</b>:

3 Inline Temp 和 Replace Temp With Query

3.1 InlineTemp

<b>Summary:</b>将所有对该变量的引用动作替换位对它赋值的那个表达式自身。
<b>Motivation:</b>一般是作为Replace Temp with Query的一部分使用的,所以真正的动机是后者。唯一单独使用Line Temp的情况,某个临时变量被赋予某个函数调用的返回值,并阻碍了其他的重构手法。
<b>Routine:</b>

3.2 Replace Temp With Query(以查询代替临时变量)

Summary:将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换位对新函数的调用。此后,新函数就可以被其他函数调用。

double basePrice =_quantity * _itemPrice;
if(basePrice>1000)
  return basePrice * 0.95;
else 
  return basePrice * 0.98;
……
double basePrice(){
  return _quantity * _itemPrice;
}

<b>Motivation:</b>临时变量是暂时的,只能在所属函数内使用。由于临时变量只在所属函数内可见,所以它们会驱使你写更长的函数。如果把临时变量替换位一个查询,那么同一个类中的所有函数都将可以获得这份信息。这将带来极大的帮助,写除清晰的代码。
<b>Routine:</b>

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

<b>Summary:</b>将复杂表达式(或者其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。
<b>Motivation:</b>在条件逻辑中,判定条件往往相当复杂,引入解释性变量来对应其意义来明晰代码逻辑;另外,在较长的算法中,可以运用临时变量来解释每一步运算的意义。
<b>Routine:</b>

5 Split Temporary Variable(分解临时变量)

<b>Summary:</b>针对每次赋值,创造一个独立,对应的临时变量。
<b>Motivation:</b>临时变量有各种不同用途,其中某些用途会很自然地导致临时变量被多次赋值。循环变量和循环收集变量就是其中的典型例子。除了这两种情况,还有很多临时变量用于保存一段冗长代码的运算结果,以便稍后使用。这种临时变量应该只有一次赋值,赋值多次就代表这临时变量承担多个责任,就应该被分解替换。
<b>Routine:</b>

6 Remove Assignments to Parameters(移除对参数的赋值)

<b>Summary:</b>以一个临时变量取代该参数的位置。
<b>Motivation:</b>这会降低代码的清晰度,会让人搞不清楚是参数的值域被修改还是新的被指向的值域被修改。
<b>Routinue:</b>

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

<b>Summary:</b>将函数放进一个单独对象中,如此一来局部变量就成了对象内的字段。然后可以在一个对象中将大型函数切分位多个小型函数。
<b>Motivation:</b>如果一个函数之中局部变量泛滥成灾,那么像分解这个函数是非常困难的,当Replace Temp with Query无法更笨上拆解一个函数时,应该用对象。
<b>Routinue:</b>

8 Substitute Algorithm(替换算法)

<b>Summary:</b>把某个算法替换位更清晰的算法。
<b>Motivation:</b>替换更好或者更易修改的函数。
<b>Routinue:</b>

上一篇下一篇

猜你喜欢

热点阅读