Replace Parameter with Explicit Methods (以明確函數取代參數

Summary 你有一個函數,其中徹底取決於參數值而採起不一樣行爲。針對該參數的每個可能值,創建一個獨立函數。java

                                               

動機:函數

 Replace Parameter with Explicit Methods 偏偏相反於Parameterize Method。若是某個參數有不少種可能的值,而函數內又以條件表達式檢查這些參數值,並根據不一樣參數值作出不一樣的行爲,那麼就應該使用本項重構。調用者本來必須賦予參數適當的值,以決定該函數作出何種響應。如今既然你提供了不一樣的函數給調用者私用,就能夠避免出現條件表達式。此外你還能夠得到編譯期檢查的好處,並且接口也更清楚。若是以參數值決定函數行爲,那麼函數用戶不但須要觀察該函數,並且還要判斷參數值是否合法,而「合法的參數值」每每不多在文檔中被清楚地提出。測試

就算不考慮編譯器檢查的好處,只是爲了 得到一個清晰的接口,也值得你執行本項重構。哪怕只是給一個內部的布爾變量賦值,相較之下,Witch.beOn()也比Switch.setState(true)要清晰得多。spa

可是,若是參數值不會對函數行爲有太多影響,你就不該該使用Replace Parameter with Explicit Methods。若是狀況真這樣,而你也只須要經過參數爲一個字段賦值,那麼直接使用設值函數就好了。若是的確須要條件判斷的行爲,可考慮使用Replace Conditional with Polymorphismcode

作法:對象

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()函數刪掉了。同時也能夠把全部常量都刪掉。

相關文章
相關標籤/搜索