If statement 重构条件
我必须根据一些条件输出一个文本,我如何重构它以使其清晰易懂和易于维护 如果最好的选择是replace with state,那么我需要为每个枚举组合创建一个类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
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