重构交换机代码中的公共代码

时间:2017-05-10 13:36:03

标签: java

switch (customerPaymentInfo.getPtType()) {
        case CASH:
            test();
            otherMethod1();
            break;
        case CARD:
            test();
            otherMethod2();
            break;
        default:
            throw new IllegalArgumentException("Payment Type is Not Correct.");
    }

在上面的代码中,我有一个常用的方法,一个是CASH或CARD都执行的。

开关盒有可能单次使用吗?

对于if块的情况,我们可以编写以下代码:

if (customerPaymentInfo.getPtType().equals("CASH") || customerPaymentInfo.getPtType().equals("CARD")) {
    test();
}

3 个答案:

答案 0 :(得分:3)

从另一个角度来看这可能会很好。为什么会有转换?看起来otherMethod1()otherMethod2()以不同的方式做同样的事情,取决于付款类型。

我的图片othMethod1()可能类似于processPaymentByCash()processPaymentByCard()。然后,实施的差异应该由这些支付类型的不同类处理:

class PaymentCash extends Payment {
    processPayment() {
        test();
        // Code from othermethod1
    }
}

class PaymentCard extends Payment {
    processPayment() {
        test();
        // Code from othermethod2
    }
}

class PaymentWhatever extends Payment {
    processPayment() {
        throw new IllegalArgumentException("Payment Type is Not Correct.");
    }
}

然后,上面的开关将被这一个衬垫简单地替换:

customerPaymentInfo.getPtType().processPayment();

现在,您的代码中仍然有两次调用test(),但恕我直言,这完全取决于代码的更大背景。

看起来应该将不同的付款类型实现为枚举值。

答案 1 :(得分:0)

解决此问题的一种方法是使用switch

的级联属性
switch (customerPaymentInfo.getPtType()) {
    case CASH:
    case CARD:
        test();
        break;
    default:
        throw new IllegalArgumentException("Payment Type is Not Correct.");
}

switch (customerPaymentInfo.getPtType()) {
    case CASH:
        otherMethod1();
        break;
    case CARD:
        otherMethod2();
        break;
    default:
        throw new IllegalArgumentException("Payment Type is Not Correct.");
}

但是现在你在switch语句上有冗余。

另一种方法是首先检查IllegalArgumentException,然后运行test()然后执行switch语句:

if (!customerPaymentInfo.getPtType().equals(CASH) || !customerPaymentInfo.getPtType().equals(CARD))
    throw new IllegalArgumentException("Payment Type is Not Correct.");
test();
switch(customerPaymentInfo.getPtType()) {
  //switch code
}

最后,只有Java8解决方案,如果你有很多这样的情况(他们有一个共同的调用和一个特定的调用),你可以将它们分组用于公共调用,对于特定的部分,你可以使用枚举和函数的映射

switch (customerPaymentInfo.getPtType()) {
    case CASH:
    case CARD:
        test();
        functionMap.get(customerPaymentInfo.getPtType()).apply(holderOfOtherMethod);
        break;
    default:
        throw new IllegalArgumentException("Payment Type is Not Correct.");
}

答案 2 :(得分:-1)

    case CASH:
    case CARD:
        test();
        if(customerPaymentInfo.getPtType().equals("CASH"))
            otherMethod1();
        else
            otherMethod2();
        break;