1. 程式人生 > >重構改善既有代碼設計--重構手法06:Split Temporary Variable (分解臨時變量)

重構改善既有代碼設計--重構手法06:Split Temporary Variable (分解臨時變量)

font bsp 責任 獨立 剖析 ron 代碼 一個 變量

你的程序有某個臨時變量被賦值超過一次,它既不是循環變量,也不被用於收集計算結果。針對每次賦值,創造一個獨立、對應的臨時變量

double temp = 2 * (_height + _width);
System.out.println(temp);
temp = _height * _width;
System.out.println(temp);

重構後:

final double perimeter = 2 * (_height + _width);
System.out.println(perimeter);
final double area = _height * _width;
System.out.println(area);

動機:臨時變量有各種不同用途,其中某些用途會很自然的導致臨時變量被多次賦值。“循環變量”和“結果收集變量”就是典型的例子:循環變量會隨循環的每次運行而改變; 結果收集變量負責將“通過這個函數的運算”而構成的某個值收集起來。

除了這2種情況,還有很多臨時變量保存一段冗長代碼的運算結果,以便稍後使用。這種臨時變量應該只被賦值一次。如果它們被賦值超過一次,就意味著它們在函數中承擔了一個以上的職責。如果臨時變量承擔多個責任,它就應該被替換為多個臨時變量,每個變量只承擔一個責任。同一個臨時變量承擔2件不同的事情,會令代碼閱讀者糊塗。

做法:1、在待分解臨時變量的聲明及其第一次被賦值處,修改其名稱。如果是結果收集變量就不要分解它。

2、將新的臨時變量聲明為final。

3、以該臨時變量的第二次賦值動作為邊界,修改此前對該臨時變量的所有引用點,讓它們引用新的臨時變量。

4、在第二次賦值處,重新聲明原先的那個臨時變量。

5、編譯、測試。

6、逐次重復上述過程。每次都在聲明處對臨時變量改名,並修改下次賦值之前的引用點。

總結:即在一個函數內部,除了循環變量和收集變量這兩種外,其余的臨時變量只能被賦值一次,如果多次賦值,則應該解剖析出更多的臨時變量出來,而為了驗證是否多次賦值,同樣可以聲明為final;當解剖出多個臨時變量,並且此時都是只賦值一次,那麽就可以采用使用查詢替換臨時變量或則內聯臨時變量繼續優化,或者是解釋性變量方式優化代碼了。

重構改善既有代碼設計--重構手法06:Split Temporary Variable (分解臨時變量)