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

概括
        你有一个复杂的表达式。
         将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名来解释表达式用途。
      例子
if((platform.toUperCase().indexOf("MAC") > -1) &&
    (browser.toUperCase().indexOf("IE") > -1) &&
    wasInitialized() && resize > 0 
    ){
    //do something
}

重构后
final boolean isMacOs = platform.toUperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = (browser.toUperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0 ;
if(isMacOs && isIEBrowser && wasInitialized() && wasResized){
    //do something
}

动机
        表达式可能非常复杂而难以阅读,此时,临时变量可以帮你讲表达式分解为较容易管理的形式。
        
        使用情况:
        (1)条件逻辑中,你可以用这项重构将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。
        (2)在较长算法中,可以运用临时变量来解释每一步运算的意义。
        
        重构的作者并不常用这种手法,他总是尽量使用Extract Method来解释一段代码的意义。原因:因为临时变量只在它所处的那个函数才有意义,局限性较大,而函数可以在对象的真个生命周期都有用,并且可被其他对象使用。有时候当局部变量使用Extract Method难以进行时,重构的作者才使用本重构手法。
做法
.
实践
      重构作者更喜欢用Extract Method。一开始会把这些新函数声明为private,如果其他对象也需要,可以很容易的改变这些函数的访问限制。且Extract Method的工作量通常并不比Introduce Explaining Variable来的大。

     何时使用本重构手法: 在Extract Method需要花费更大工作量时。




posted @ 2013-11-27 14:10  tanhaiyuan  阅读(228)  评论(0编辑  收藏  举报