Summary: 你有一個函數,其中徹底取決於參數值而採起不一樣行爲。針對該參數的每個可能值,創建一個獨立函數。java
動機:函數
Replace Parameter with Explicit Methods 偏偏相反於Parameterize Method。若是某個參數有不少種可能的值,而函數內又以條件表達式檢查這些參數值,並根據不一樣參數值作出不一樣的行爲,那麼就應該使用本項重構。調用者本來必須賦予參數適當的值,以決定該函數作出何種響應。如今既然你提供了不一樣的函數給調用者私用,就能夠避免出現條件表達式。此外你還能夠得到編譯期檢查的好處,並且接口也更清楚。若是以參數值決定函數行爲,那麼函數用戶不但須要觀察該函數,並且還要判斷參數值是否合法,而「合法的參數值」每每不多在文檔中被清楚地提出。測試
就算不考慮編譯器檢查的好處,只是爲了 得到一個清晰的接口,也值得你執行本項重構。哪怕只是給一個內部的布爾變量賦值,相較之下,Witch.beOn()也比Switch.setState(true)要清晰得多。spa
可是,若是參數值不會對函數行爲有太多影響,你就不該該使用Replace Parameter with Explicit Methods。若是狀況真這樣,而你也只須要經過參數爲一個字段賦值,那麼直接使用設值函數就好了。若是的確須要條件判斷的行爲,可考慮使用Replace Conditional with Polymorphism。code
作法:對象
1. 針對參數的每一種可能值,新建一個明確函數。接口
2.修改條件表達式的每一個分支,使其條用合適的新函數。ci
3.修改每一個分以後,編譯並測試。文檔
4.修改原函數的每個被調用點,改而調用上述的某個合適的新函數。編譯器
5.編譯,測試。
6.全部調用端都修改完畢後,刪除原函數。
範例:
下列代碼中,咱們根據不一樣的參數值,創建Employee之下不一樣的子類。如下代碼每每是Replace Constructor with Factory Method的施行成果:
static final int ENGINEER = 0; static final int SALESMAN = 1; static final int MANAGER = 2; static Employee create(int type){ switch(type){ case ENGINEER: return new Engineer(); case SALESMAN: return new Salesman(); case MANAGER: return new Manager(); defaule: throw new IllegalArgumentException("Incorrect type code value"); } }
因爲這是一個工廠函數,咱們不能實施Replace Conditional with Polymorphism,由於使用該函數時對象根本還沒建立出來。因爲能夠預見到Employee不會有太多新的子類,因此咱們能夠放心地爲每一個子類創建一個工廠函數,而沒必要擔憂工廠函數的數量會劇增。首先,根據參數值創建相應的新函數:
static Employee createEngineer(){ return new Engineer(); } static Employee createSalesman(){ return new Salesman(); } static Employee createManager(){ return new Manager(); }
而後把switch語句的各個分支替換爲對新函數的調用,每修改一個分支,都須要編譯並測試,直到全部分支修改完畢爲止:
static Employee create(int type){ switch(type){ case ENGINEER: return Employee.createEngineer(); case SALESMAN: return Employee.createSalesman(); case MANAGER: return Employee.createManager(); defaule: throw new IllegalArgumentException("Incorrect type code value"); } }
接下來,咱們把注意力轉移到舊函數的調用端。咱們把諸以下面這樣的代碼:
Employee kent = Employee.create(ENGINEER);
替換爲:
Employee kent = Employee.createEngineer();
修改完create()函數的全部調用者以後,就能夠把create()函數刪掉了。同時也能夠把全部常量都刪掉。