If statement 重构条件

If statement 重构条件,if-statement,switch-statement,refactoring,conditional,If Statement,Switch Statement,Refactoring,Conditional,我必须根据一些条件输出一个文本,我如何重构它以使其清晰易懂和易于维护 如果最好的选择是replace with state,那么我需要为每个枚举组合创建一个类 public enum CalcType {A, B, C, D} public enum LicensingOption {HOME, PRO, ULTIMATE} public void printHeader() { switch (calc) { case A: printHead

我必须根据一些条件输出一个文本,我如何重构它以使其清晰易懂和易于维护

如果最好的选择是replace with state,那么我需要为每个枚举组合创建一个类

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();
}

这是一个很好的例子,说明了模式可以帮助管理代码的复杂性,特别是如果将来要添加其他LicensingOption和CalcTypes

此模式用于计算机编程,以封装同一对象基于其内部状态的各种行为。对于对象来说,这是一种更干净的方式,可以在运行时更改其行为,而无需求助于大型单片条件语句,从而提高可维护性

我在下面为您的案例附上了一个状态模式实现的示例,但请注意,从您的代码示例中很难真正给您提供好的建议(
printW1
printweaderz
printweadera
没有给我那么多关于您的领域的信息),但是我尽了最大努力给你一些与你提供的代码相当的东西。您可能希望将某些行为从CalcType移动到LicensingOption,因为我不清楚这两个状态在应用程序中是如何相互作用的

配置

//无论您决定以何种方式获得该配置
public CalcType CalcType=Config.CalcTypen
公共许可选项license=Config.LicensingOption
计算类型类

抽象类CalcType{
public void printHeader(){
//printHeader()的默认行为是printHeaderByLicensingOption();
//除了CalcTypeA和CalcTypeB之外,我们将在CalcTypeA和CalcTypeB中重新定义它们。
license.printHeaderByLicensingOption()许可证
}
public void printFooter(){
//printFooter()的默认行为是printFooterByLicensingOption();
//除了CalcTypeA,所以我们将在CalcTypeA中重新定义它。
license.printFooterByLicensingOption()的
}
public void printFooterW(){
//printFooterW()的默认行为是printW2();
//除了CalcTypeB,所以我们将在CalcTypeB中重新定义它。
printW2();
}
}
类CalcTypeA扩展了CalcType{
public void printHeader(){
printHeaderX()
}
public void printFooter(){
printFooterX()
}
}
类CalcTypeB扩展了CalcType{
public void printHeader(){
印刷厂()
}
public void printFooterW(){
printW1();
}
}
许可选项类

抽象类许可选项{
//这些方法都有非常不同的行为,从您的示例中很难知道是否存在任何“默认”。
//假设没有,只需将它们声明为抽象的,并仅在子类中定义它们。
抽象公共无效printHeaderByLicensingOption();
抽象公共无效printFooterByLicensingOption();
}
类许可证{
public void printerheaderbylicensingoption(){
printHeaderW();
}
public void printFooterByLicensingOption()打印页脚{
calcType.printFooterW()
}
}
类别家庭许可证{
public void printerheaderbylicensingoption(){
printHeaderZ();
}
public void printFooterByLicensingOption()打印页脚{
printFooterZ()
}
}
类最终许可证{
public void printerheaderbylicensingoption(){
printHeaderA();
}
public void printFooterByLicensingOption()打印页脚{
printFooterA()
}
}

注意:确保您声明的函数是虚拟的(Java中的默认值,而不是C++)。

这是一个很好的例子,说明模式可以帮助管理代码的复杂性,特别是如果您将来要添加其他许可选项和计算类型

此模式用于计算机编程,以封装同一对象基于其内部状态的各种行为。对于对象来说,这是一种更干净的方式,可以在运行时更改其行为,而无需求助于大型单片条件语句,从而提高可维护性

我在下面为您的案例附上了一个状态模式实现的示例,但请注意,从您的代码示例中很难真正给您提供好的建议(
printW1
printweaderz
printweadera
没有给我那么多关于您的领域的信息),但是我尽了最大努力给你一些与你提供的代码相当的东西。您可能希望将某些行为从CalcType移动到LicensingOption,因为我不清楚这两个状态在应用程序中是如何相互作用的

配置

//无论您决定以何种方式获得该配置
public CalcType CalcType=Config.CalcTypen
公共许可选项license=Config.LicensingOption
计算类型类

抽象类CalcType{
public void printHeader(){
//printHeader()的默认行为是printHeaderByLicensingOption();
//除了CalcTypeA和CalcTypeB之外,我们将在CalcTypeA和CalcTypeB中重新定义它们。
license.printHeaderByLicensingOption()许可证
}
public void printFooter(){
//printFooter()的默认行为是printFooterByLicensingOption();
//除了CalcTypeA,所以我们将在CalcTypeA中重新定义它。
license.printFooterByLicensingOption()的
}
public void printFooterW(){
//printFooterW()的默认行为是printW2();
//除了CalcTypeB,所以我们将在CalcTypeB中重新定义它。
printW2();
}
}
类CalcTypeA扩展了CalcType{
public void printHeader(){
printHeaderX()
}
public void printFooter(){
printFooterX()
}
}
类CalcTypeB扩展了CalcType{
公共空间p