▄︻┻┳═一Agenda:
▄︻┻┳═一(1/7)[代码整洁之道]你真的会用枚举吗?非也!
▄︻┻┳═一(2/7)枚举的错误用法 之 方法参数
▄︻┻┳═一(3/7)枚举的错误用法 之 方法参数(二)
▄︻┻┳═一(4/7)枚举的错误用法 之 方法返回值
▄︻┻┳═一(5/7)枚举的错误用法 之 方法体内部
▄︻┻┳═一(6/7)枚举的错误用法 之 分支判断
▄︻┻┳═一(7/7)借助枚举说一下数据类型定义规范
继续讲枚举的使用。本文举例说明方法返回值使用枚举类型对程序可读性和可维护性的影响。
【先上代码】
如下代码逻辑比较简单:判断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; }