1
我必須輸出基於某些條件的文本,我該如何重構這個以清楚理解和維護?重構條件
如果最好的選擇是用狀態替換,我需要爲每個枚舉組合創建一個類?
public enum CalcType {A, B, C, D}
public enum LicensingOption {HOME, PRO, ULTIMATE}
public void printHeader() {
switch (calc) {
case A:
printHeaderX();
break;
case B:
printHeaderY();
break;
default:
printHeaderByLicensingOption();
}
}
public void printHeaderByLicensingOption() {
switch (license) {
case PRO:
printHeaderW();
break;
case HOME:
printHeaderZ();
break;
case ULTIMATE:
printHeaderA();
break;
}
}
public void printFooter() {
if (calc.equals(CalcType.A))
printFooterX();
else
printFooterByLicensingOption();
}
public void printFooterByLicensingOption() {
switch (license){
case PRO:
printFooterW();
break;
case HOME:
printFooterZ();
break;
case ULTIMATE:
printFooterA();
break;
}
}
public void printFooterW(){
if (calc.equals(CalcType.B))
printW1();
else
printW2();
}
您可以將許可證轉換爲虛擬對象,並根據許可選項將其實例化爲不同的子類。然後每個子類都可以確切地知道要打印什麼,與其類型相對應。每個許可證可能會限制它允許應用程序執行的操作;那麼每個子類都會包含一些不重要但有用的謂語,「我是否許可做X?」。 –