《重構-改善既有代碼的設計》學習筆記---Replace Temp with Query(以查詢取代臨時變量)

臨時變量的問題在於:函數

它們是暫時的,並且只能在所屬函數內使用。因爲臨時變量只在所屬函數內可見,因此,若是不少地方都在用這個臨時變量,就會驅使你寫出更長的函數。若是把臨時變量替換爲一個查詢,那麼其餘函數中均可以得到這份信息。spa

以查詢取代臨時變量是提煉函數以前必不可少的一個步驟。局部變量會使代碼難以被提煉,因此應該儘量把他們替換爲查詢式。code

這個重構手法較爲簡單的狀況是:臨時變量只被賦值一次或者賦值給臨時變量的表達式不受其餘條件影響。blog

示例:get

初始代碼爲(2個臨時變量):it

function getPrice () {
    var basePrice = _quantity * _itemPrice;
    var discountFactor;
    if(basePrice > 100){
        discountFactor = 0.95;
    } else {
       iscountFactor = 0.98;
    }
    return basePrice * discountFactor;
}        

一、把賦值動做的右側表達式提煉出來io

function getPrice () {
    var basePrice = basePrice();
    var discountFactor;
    if(basePrice > 100){
        discountFactor = 0.95;
    } else {
       iscountFactor = 0.98;
    }
    return basePrice * discountFactor;
} 

function basePrice () {
    return  _quantity * _itemPrice;
}

二、替換臨時變量的引用點,,並刪除臨時變量的聲明。function

function getPrice () {
    var discountFactor;
    if(basePrice() > 100){
        discountFactor = 0.95;
    } else {
       iscountFactor = 0.98;
    }
    return basePrice() * discountFactor;
} 

function basePrice () {
    return  _quantity * _itemPrice;
}

三、用相似的辦法,提煉另一個臨時變量class

function getPrice () {
    return basePrice() * discountFactor();
} 

function basePrice () {
    return  _quantity * _itemPrice;
}

function discountFactor () {
     if(basePrice() > 100){
        return 0.95;
    } else {
      return 0.98;
    }
}

若是沒有把basePrice替換爲一個查詢式,很難提煉discountFactor(),須要手動傳入basePrice做爲參數。變量

 

我的感悟:

以一個臨時變量保存某一表達式的運算結果,若是這個臨時變量在多個地方用到,能夠考慮用此方法,將表達式提煉到一個獨立函數中。

相關文章
相關標籤/搜索