(4/8)枚举的错误用法 之 方法返回值

▄︻┻┳═一Agenda:html

▄︻┻┳═一(1/8)[代码整洁之道]你真的会用枚举吗?非也!java

▄︻┻┳═一(2/8)枚举的错误用法 之 方法参数post

▄︻┻┳═一(3/8)枚举的错误用法 之 方法参数(二)url

▄︻┻┳═一(4/8)枚举的错误用法 之 方法返回值spa

▄︻┻┳═一(5/8)枚举的错误用法 之 方法体内部code

▄︻┻┳═一(6/8)枚举的错误用法 之 分支判断htm

▄︻┻┳═一(7/8)借助枚举说一下数据类型定义规范blog

▄︻┻┳═一(8/8)RPC接口能用枚举就请考虑枚举接口


 

 

继续讲枚举的使用。本文举例说明方法返回值使用枚举类型对程序可读性和可维护性的影响。字符串

【先上代码】

以下代码逻辑比较简单:判断busTyp和crdTyp不一样状况下的取值,来给字符串cnlTyp赋值,并最终返回这个字符串。

// PpdUtils.java

/**
 * 获取通道类型
 *
 * @param busTyp
 * @param crdTyp
 * @return
 */
public static String getCnlTyp(String busTyp, String crdTyp) {
    String cnlTyp = "";
    BusTypEnum busTypDict = BusTypEnum.getByKey(busTyp);

    switch (busTypDict) {
        case B2C_CHARGE:
        case B2C_CONSUME_COMPLETION:
        case GWAY_CONSUME_COMPLETION:
        case B2C_ENT_CONSUME_COMPLETION:
        case B2C_ENT_REPAYMENT:
        case PGW_GW_COMPLETION:
        case CREDIT_PAY_COMPLETION:
        case CREDIT_PAY_COMPLETION_REFUND:
            cnlTyp = CnlTypEnum.B2C.getValue();

            break;

        case B2B_CHARGE:
        case B2B_CHARGE_FOR_ENT:
        case B2B_CHARGE_ORDER_ADDITIONAL:
        case B2B_ENT_CONSUME_COMPLETION:
        case B2B_ENT_REPAYMENT:
        case PGW_B2B_COMPLETION:
            cnlTyp = CnlTypEnum.B2B.getValue();

            break;

        case QPAY_CONSUME_COMPLETION:
        case QUICK_CHARGE:
        case PGW_QPAY_COMPLETION:

            if (CardTypeEnum.CreditCard.equals(crdTyp)) {
                cnlTyp = CnlTypEnum.CQP.getValue();
            } else {
                cnlTyp = CnlTypEnum.DQP.getValue();
            }

            break;

        case OCP_CONSUME_COMPLETION:
        case OCP_ENT_CONSUME_COMPLETION:
        case OCP_ENT_REPAYMENT:
        case OCP_REFUND:
            cnlTyp = CnlTypEnum.OCP.getValue();

            break;

        default:
            break;
    }

    return cnlTyp;
}

 

【重构方式】

本文重点讨论的是方法的返回值。因此呢,对于上面的方法,咱们撇开两个入参不说,其余代码不足也勿喷。

咱们注意到,方法体里要返回的变量cnlTyp,在switch的每一个分支里,给它的赋值都是CnlTypEnum项的value。

那么,显然,这个方法不必返回字符串了,而应该直接返回CnlTypEnum。一样,方法内部的变量cnlTyp的类型重构为CnlTypEnum。

这样,相比于返回String,调用方能直观的知道返回值的具体类型及可取值范围,从而提升了可读性。 

重构后的代码为:

// PpdUtils.java

/**
 * 获取通道类型
 *
 * @param busTyp
 * @param crdTyp
 * @return
 */
public static CnlTypEnum getCnlTyp(String busTyp, String crdTyp) {
    CnlTypEnum cnlTyp = null;
    BusTypEnum busTypDict = BusTypEnum.getByKey(busTyp);

    switch (busTypDict) {
        case B2C_CHARGE:
        case B2C_CONSUME_COMPLETION:
        case GWAY_CONSUME_COMPLETION:
        case B2C_ENT_CONSUME_COMPLETION:
        case B2C_ENT_REPAYMENT:
        case PGW_GW_COMPLETION:
        case CREDIT_PAY_COMPLETION:
        case CREDIT_PAY_COMPLETION_REFUND:
            cnlTyp = CnlTypEnum.B2C;

            break;

        case B2B_CHARGE:
        case B2B_CHARGE_FOR_ENT:
        case B2B_CHARGE_ORDER_ADDITIONAL:
        case B2B_ENT_CONSUME_COMPLETION:
        case B2B_ENT_REPAYMENT:
        case PGW_B2B_COMPLETION:
            cnlTyp = CnlTypEnum.B2B;

            break;

        case QPAY_CONSUME_COMPLETION:
        case QUICK_CHARGE:
        case PGW_QPAY_COMPLETION:

            if (CardTypeEnum.CreditCard.equals(crdTyp)) {
                cnlTyp = CnlTypEnum.CQP;
            } else {
                cnlTyp = CnlTypEnum.DQP;
            }

            break;

        case OCP_CONSUME_COMPLETION:
        case OCP_ENT_CONSUME_COMPLETION:
        case OCP_ENT_REPAYMENT:
        case OCP_REFUND:
            cnlTyp = CnlTypEnum.OCP;

            break;

        default:
            break;
    }

    return cnlTyp;
}
相关文章
相关标签/搜索