Summary: 某個函數須要從調用端獲得更多信息。爲此函數添加一個對象,讓該對象帶進函數所需信息。程序員
動機:安全
Add Parameter是一個很經常使用的重構手法,使用這項重構的動機很簡單:你必須修改一個函數,而修改後的函數須要一些過去沒有的信息,所以你須要給該函數添加一個參數。函數
實際上我比較須要說明的是:不使用本項重構的時機。除了添加參數外,你經常還有其餘選擇。只要可能,其餘選擇都比添加參數要好,由於它們不會增長參數列的長度。過長的參數列是很差的味道,由於程序員很難記住那麼多參數,並且長參數列每每伴隨着壞味道Data Clumps。測試
請看看現有的參數,而後問本身:你能從這些參數的到所須要的信息嗎?若是回答是否認的,有可能經過某個函數提供所需信息嗎?你究竟把這些信息用於何處?這個函數是否應該屬於擁有該信息的那個對象全部?看看先有參數,考慮一下,加入新參數是否合適?也許你應該考慮使用Introduce Parameter Object。spa
作法: Add Parameter的作法和Rename Method很是類似。對象
1.檢查函數簽名是否被超類或子類實現過。若是是,則須要針對每份實現分別進行下列步驟。接口
2.聲明一個新函數,名稱與原函數相同,只是加上新添參數。將舊函數的代碼複製到新函數中。編譯
à若是要添加的參數不止一個,將它們一次性添加進去比較容易重構
3.編譯。引用
4.修改舊函數,令它調用新函數。
à若是隻有少數幾個地方引用舊函數,你能夠大膽放心地跳過這一步驟。
à此時,你能夠給參數提供任意值。但通常來講,咱們會給對象參數提供null,給內置型參數提供一個明顯非正常值。對於數值型參數,咱們建議使用0之外的值,這樣你比較容易未來認出它。
5.編譯,測試。
6.找出舊函數的全部被引用點,修改它們,令它們改而引用新函數。每次修改後,編譯並測試。
7.刪除舊函數。
à若是舊函數是該類public接口的一部分,你可能沒法安全地刪除它。這種狀況下,將它保留在原處,並將它標記爲deprecated(建議不使用)。
8.編譯,測試。