從某個對象中取出若干值,將它們做爲某一次函數調用時的參數。改成傳遞整個對象。 函數
有時候咱們會看到有來自同一對象的若干項數據做爲參數,傳遞給某個函數。這樣的問題在於:萬一未來被調用函數須要新的數據項,就必須查找並修改對此函數的全部調用。若是把這些數據所屬的整個對象傳給函數,能夠避免這種問題。 性能
除了可使參數列更穩固以外,Preserve Whole Object每每還能提升代碼的可讀性。過長的參數列很難使用,由於調用者和被調用者都必須記住這些參數的用途。此外,不適用完整對象也會形成重複代碼,由於被調用函數沒法利用完整對象中的函數來計算某些中間值。 測試
不過事情總有兩面。若是傳的是數值,被調用函數就只依賴於這些數值,而不依賴它們所屬的對象。但若是傳遞的是整個對象,被調用函數所在的對象就須要依賴參數對象。若是這會使依賴結果惡化,那麼就不應使用該重構手法。 this
還有另外一種不適用Preserve Whole Object的理由:若是被調用函數只須要參數對象的其中一項數值,那麼只傳遞那個數值會更好。我並不認同這種觀點,由於傳遞一項數值和傳遞一個對象,至少在代碼清晰度上是等價的(固然對於按值傳遞的參數來講,性能上可能有所差別)。更重要的考量應該放在對象之間的依賴關係上。 spa
若是被調用函數使用了來自另外一個對象的不少項數據,這可能意味着該函數實際上應該被定義在那些數據所屬的對象中。因此,考慮Preserve Whole Object的同時,也應該考量Move Method。 對象
還有一種常見狀況:調用者將本身的若干數據做爲參數,傳遞給被調用函數。這種狀況下,若是該對象有合適的取值函數,可使用this取代這些參數值,並沒有需操心對象依賴問題。 io
1.對目標函數新添一個參數項,用以表明原數據所在的完整對象。 編譯
2.判斷哪些參數可被包含在新添加的完整對象中。 重構
3.選擇上述參數之一,將被調用函數中原來引用該參數的地方,改成調用新添參數對象的相應取值函數。 引用
4.刪除該項參數。
5.編譯,測試
6.針對全部可從完整對象中得到的參數,重複上述過程。
7.刪除調用端中那些帶有被刪除參數的代碼。
8.編譯,測試。