返回總目錄
你的程式以乙個臨時變數儲存某一表示式的運算結果。
將這個表示式提煉到乙個獨立函式中。將這個臨時變數的所有引用點替換為對函式的呼叫。此後,新函式就可以被其他函式使用。
臨時變數的問題在於:只在當前函式可見。如果你在同類的別的地方訪問這個變數,你就必須重新寫表示式來獲取這個變數,這樣的話你就會在不經意間讓你的函式變得複雜起來。如果將臨時變數替換為乙個查詢,那麼同類中所有函式都可以獲得這份資訊。
所以如果你想要使用extract method,那麼replace temp with query是必不可少的乙個步驟。而我們前面介紹的inline temp其實是這個手法的一部分,兩者的區別在於inline temp已經有了表示式自身,只需要做簡單的替換就可以,需要用表示式本身把臨時變數給去掉。而replace temp with query更加全面,裡面包含了提煉表示式到函式本身,然後替換引用點(inline temp)。如果你把所有的臨時變數都替換為乙個查詢,你的類的結構和邏輯將非常清晰,這樣將更加有利於你的重構和進行優化。
假設有以下簡單函式:
doublegetprice()
else
return baseprice *discountfactor;
}
我們現在將baseprice 和discountfactor這兩個臨時變數都替換掉。
先來替換baseprice,將baseprice右側表示式提煉出來,然後使用inline temp將baseprice的所有引用點都替換掉,並且把baseprice臨時變數的宣告去掉。
現在**變成這樣:
doublegetprice()
else
returngetbaseprice()*discountfactor;
}private
intgetbaseprice()
再以類似的方法提煉出getdiscountfactor();
privatedouble
getdiscountfactor()
return
0.98
;}
最終**是這樣的。
doublegetprice()
private
double
getdiscountfactor()
return
0.98;}
private
intgetbaseprice()
可以明顯的看到,這個重構手法對於函式本身來說,提高了清晰度,也讓我們進行後期重構能夠更加便捷。
我們常常在迴圈中用臨時變數儲存累加資訊。如果是這種情況的話,我們可以將整個迴圈都提煉出來。如果在迴圈中要累加好幾個值,那麼就應該針對每個累加值重複一遍迴圈。這樣,就可以很方便的將所有臨時變數都替換為查詢。
當然,這樣一來,我們可能擔心效能問題。本來我定義乙個臨時變數只需要查詢一次,現在我每次都要去做查詢。這個我們完全不必擔心。重構的目的是讓程式更加清晰,有了更加清晰的程式之後再具體做優化也不遲,況且根據二八原則,僅僅這條查詢語句倘若你系統真的出現了效能問題也不大可能,如果實在是因為這條語句,你也可以把變數再放回去。
to be continued...
重構手法之重新組織函式 5
返回總目錄 本小節目錄 你有乙個大型函式,其中對區域性變數的使用使你無法採用extract method。將這個函式放進乙個單獨物件中,如此一來區域性變數就成了物件內的字段。然後你可以在同乙個物件中將這個大型函式分解為多個小型函式。我們一直在強調,小型函式優美動人。只要將相對獨立的 從大型函式中提煉...
重構之重新組織函式 Inline Temp
inline temp 概述 乙個臨時變數,只被乙個簡單表示式賦值一次,而它妨礙了其它重構手法。動機 motivation inline temp多半是作為replace temp with query的一部分來使用。惟一單獨使用inline temp的情況是 你發現某個臨時變數被賦予某個函式呼叫的...
重構之重新組織資料
一.自封裝字段 你直接訪問乙個字段,但與字段之間的耦合關係逐漸變得笨拙。為這個字段建立取值 設值函式,並且只以這些函式來訪問字段。在字段訪問方式這個問題上,存在兩種截然不同的觀點。其中一派認為,在該變數定義所在的類中,你可以自由訪問它 另一派認為,即使在這個類中你也應該只使用訪問函式間接訪問。兩派之...