• 9.6 replace conditional with polymorphism (以多態取代條件表達式)

    2016-08-13

    條件表達式,根據對象類型的不同而選擇不同的行為。

    將這個條件表達式的每一個分支放進一個子類內的覆寫函數中,然后將原始函數聲明為抽象函數。

    動機:

    多態使你不必編寫明顯的條件表達式。

    如果同一組條件表達式在程序許多地方出現,那么使用多態的收益是最大的。

    做法:

    使用replace conditional with polymorphism之前,首先必須有一個繼承結構。

    如果要處理的條件表達式是一個更大函數中的一部分,首先對條件表達式進行分析,然后使用extract method。

    如果有必要,使用move method將條件表達式放置到繼承結構的頂端。

    任選一個子類,在其中建立一個函數,使之覆寫超類中容納條件表達式的那個函數。將與該子類相關的條件表達式分支復制到新建函數中,并調整。

    舊代碼

    class Engineer extends EmployeeType{     int getTypeCode(){         return Employee.ENGINEER;     } } class Manager extends EmployeeType{     int getTypeCode(){         return Employee.MANAGER;     } } class Salesman extends EmployeeType{     int getTypeCode(){         return Employee.SALEMAN;     } } class Employee... private employeeType _type; int payAmount(){     switch(getType()){     case EmployeeType.ENGINEER:         return _monthlySalary;     case EmployeeType.SALESMAN:         return _monthlySalary + _commission;     case EmployeeType.MANAGER:         return _monthlySalary + bonus;     default;         throw new RuntimeException();     } } int getType(){     return _type.getTypeCode(); } void setType(int arg){     _type = EmployeeType.newType(arg); } class employeeType... static EmployeeType newType(int code){     switch(code){         case ENGINEER:             return new Engineer();         case SALESMAN:             return new Salesman();         case MANAGER:             return new Manager();         default:             throw new IllegalArgumentException();     } } static final int ENGINEER = 0; static final int SALESMAN = 1; static final int MANAGER = 2;


    新代碼

    class Employee... private Engineer _type; int payAmount(){     return _type.payAmount(this); }   class Engineer... int payAmount(Employee emp){     return emp.getMonthlySalary(); } class Salesman... int payAmount(Employee emp){     return emp.getMonthlySalary() + emp.getCommission(); } class Manager... int payAmount(Employee emp){     return emp.getMonthlySalary() + emp.getBonus(); }  class EmployeeType... abstract int payAmount(Employee emp);






    天堂网