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?”。 –