buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

(6/8)枚举的错误用法 之 分支判断

▄︻┻┳═一Agenda:

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

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

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

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

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

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

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

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


 

 

继续讲枚举的使用。前文阐释了方法请求参数、方法返回值、POJO属性定义成枚举类型的好处。本文讲在方法内部的分支判断的场景下使用枚举的正确方式。

【先上代码】

private boolean riskCheck(RefundReqBO refundReq, RefundRspBO refundRsp, RpmOrdDO rpmOrd, RpmRtulDO rpmRtul) throws YGException {

    ... ...
    
    String apprSts = realTimeRiskCheckRsp.getApprSts();//风控审批状态
    String nmlSts = realTimeRiskCheckRsp.getNmlSts();//名单状态
    logger.infoFmt("风控检查结果[风控审批状态={},名单状态={}]",apprSts,nmlSts);

    YGPubUtil.copyProperties(rpmRtul,rpmOrd);
    boolean passFlg = false;
    boolean notifyFlg = false;
    if(StringUtils.equals(apprSts, ApprStsEnum.REFUSE.getValue())) {
        //拒绝 登记退款订单
        rpmRtul.setRskApprSts(ApprStsEnum.REFUSE.getValue());//风控拒绝
        rpmRtul.setRfdSts(RefundStsEnum.REFUSE.getSts());//审批拒绝
        refundRsp.setMsgCd(realTimeRiskCheckRsp.getWarnCd());
        refundRsp.setMsgInf(realTimeRiskCheckRsp.getWarnCd());
        
        ... ...
    
    }else if(StringUtils.equals(apprSts,ApprStsEnum.APPROVAL.getValue())) {
        //审批 更新消费订单 登记退款订单 返回
        logger.info("风控检查riskCheck ------> 进入审批");
        int retCod = rpmOrdService.updateOrdStsByPrimaryKey(... ...);
        if(retCod!=1){
            refundRsp.setMsg(RPMMessageCodeEnum.FAILED_TO_UPDATE_PAYMENT_ORDER);
            return false;
        }
        rpmRtul.setRskApprSts("1");//风控审批中
        rpmRtul.setRfdSts(RefundStsEnum.RFD_APPROVAL.getSts());//退款审批中
        notifyFlg = true;
    }else{
        //通过,继续
        logger.info("风控检查riskCheck ------> 通过");
        passFlg = true ;
    }
        
    ... ...
    
}

 

【重构方式】

为了紧扣主题,所以这里只聚焦于上面方法里的变量apprSts。

我们看,上面的分支判断if...else if...else里,条件都是基于apprSts与枚举ApprStsEnum比较来进行逻辑判断的。那么,对于这种情况,从代码整洁度的角度来讲,应把apprSts定义为枚举类型ApprStsEnum,这时的分支判断就显得清晰多了。

private boolean riskCheck(RefundReqBO refundReq, RefundRspBO refundRsp, RpmOrdDO rpmOrd, RpmRtulDO rpmRtul) throws YGException {

    ... ...
    
    ApprStsEnum apprSts = ApprStsEnum.getByValue(realTimeRiskCheckRsp.getApprSts());//风控审批状态
    String nmlSts = realTimeRiskCheckRsp.getNmlSts();//名单状态
    logger.infoFmt("风控检查结果[风控审批状态={},名单状态={}]",apprSts,nmlSts);

    YGPubUtil.copyProperties(rpmRtul,rpmOrd);
    boolean passFlg = false;
    boolean notifyFlg = false;
    switch (apprSts) {
        case REFUSE:
            //拒绝 登记退款订单
            rpmRtul.setRskApprSts(ApprStsEnum.REFUSE.getValue());//风控拒绝
            rpmRtul.setRfdSts(RefundStsEnum.REFUSE.getSts());//审批拒绝
            refundRsp.setMsgCd(realTimeRiskCheckRsp.getWarnCd());
            refundRsp.setMsgInf(realTimeRiskCheckRsp.getWarnCd());
            
            ... ...
    
            break;
        case APPROVAL:
            //审批 更新消费订单 登记退款订单 返回
            logger.info("风控检查riskCheck ------> 进入审批");
            int retCod = rpmOrdService.updateOrdStsByPrimaryKey(... ...);
            if(retCod!=1){
                refundRsp.setMsg(RPMMessageCodeEnum.FAILED_TO_UPDATE_PAYMENT_ORDER);
                return false;
            }
            rpmRtul.setRskApprSts("1");//风控审批中
            rpmRtul.setRfdSts(RefundStsEnum.RFD_APPROVAL.getSts());//退款审批中
            notifyFlg = true;
            break;
        default:
            //通过,继续
            logger.info("风控检查riskCheck ------> 通过");
            passFlg = true ;
            break;
    }
        
    ... ...
    
}

同时,ApprStsEnum里新建静态方法getByValue:

@Getter
public enum ApprStsEnum {
    ADOPT("0", "通过"),
    APPROVAL("4", "审批"),
    REFUSE("9", "拒绝");

    private final String value;
    private final String name;

    private ApprStsEnum(String value, String name) {
        this.value = value;
        this.name = name;
    }

    public static ApprStsEnum getByValue(String value) {
        if (StringUtils.isBlank(value)) {
            return null;
        }
        for (ApprStsEnum item : ApprStsEnum.values()) {
            if (value.equalsIgnoreCase(item.getValue())) {
                return item;
            }
        }
        return null;
    }
}

 

posted on 2018-08-29 15:25  buguge  阅读(706)  评论(0编辑  收藏  举报