zoukankan      html  css  js  c++  java
  • (2/8)枚举的错误用法 之 方法参数

    ▄︻┻┳═一Agenda:

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

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

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

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

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

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

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

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


    【承上文】

    承上文[代码整洁之道]你真的会用枚举吗?非也!

    敲黑板,划重点:

    如果把某域定义成了枚举,那么,正确使用枚举要注意如下几点

    • 除了对外交易的输入输出,程序内部涉及到该域的,一律用枚举类型。例如:方法参数、方法返回值、bo的属性。
    • 接收到外来的数据后,在使用该域时,应先把该域转换成枚举类型。

    接下来举例继续唠叨。

    【不当用法】

    如下方法:

        public static String getMNBNotifyUrl(YGBizMessageContext bizCtx, String reqCode, String notifyTyp,
                boolean isBack, Logger logger) {
            StringBuffer sb = new StringBuffer();
            sb.append(bizCtx.getPara("_MNB_NOTIFY_ADDR"));//cde syscfg.xml里http://192.168.40.222:9280/bkg/
            sb.append(notifyTyp).append("/");
    
            if (isBack) {
                sb.append("b");
            }
    
            sb.append("notify").append(".");
            sb.append(reqCode);
            logger.infoFmt("获取回调地址[{}]", sb.toString());
    
            return sb.toString();
        }

    调用:

    String noticeUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay.getValue(),
                    NotifyDataTypeEnum.FORM.getNotifyTyp(), true, logger);//
    String returnUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay.getValue(),
                    NotifyDataTypeEnum.FORM.getNotifyTyp(), false, logger);//

    【重构为】

    方法改为:

        public static String getMNBNotifyUrl(YGBizMessageContext bizCtx, MNBNotifyCodeEnum reqCode, NotifyDataTypeEnum notifyTyp,
                boolean isBack, Logger logger) {
            StringBuffer sb = new StringBuffer();
            sb.append(bizCtx.getPara("_MNB_NOTIFY_ADDR"));//cde syscfg.xml里http://192.168.40.222:9280/bkg/
            sb.append(notifyTyp.getNotifyTyp()).append("/");
    
            if (isBack) {
                sb.append("b");
            }
    
            sb.append("notify").append(".");
            sb.append(reqCode.getValue());
            logger.infoFmt("获取回调地址[{}]", sb.toString());
    
            return sb.toString();
        }

    调用:

    String noticeUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay, NotifyDataTypeEnum.FORM, true, logger);//
    String returnUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay, NotifyDataTypeEnum.FORM, false, logger);//

     

    【分析】

    上面的getMNBNotifyUrl方法是一个Util方法,供工程里其他各module调用。其他module的开发人跟这个方法的开发人往往不是同一个人。

    我们比较重构前后的可读性,看原来的方法,reqCode和notifyTyp是String,调用者并不清楚传什么值,只有看哪里调用了才能明白;如果找不到调用的代码,那么就只能去问定义这个方法的程序猿了。而重构后将这2个参数改为枚举,一目了然!

    退一万步讲,即使调用者和定义者是同一个人,重构后的代码也比之前的要好,为什么?还是那3个字:可读性提高了。

     

    【扩展:看开源项目中枚举的使用】

    如下是log4j-api包下的两个方法。logIfEnabled方法是一个基础方法,供debug、info、error、fatal等方法及重载方法调用。可以看到,logIfEnabled方法的第二个参数是枚举类型Level,而不是String。

    //** abstract class AbstractLogger
    
    public void error(Message msg, Throwable t) {
        this.logIfEnabled(FQCN, Level.ERROR, (Marker)null, (Message)msg, (Throwable)t);
    }
    public void error(String message, Object p0, Object p1) {
        this.logIfEnabled(FQCN, Level.ERROR, (Marker)null, message, p0, p1);
    }
    public void logIfEnabled(String fqcn, Level level, Marker marker, String message, Object p0, Object p1) {
        if (this.isEnabled(level, marker, message, p0, p1)) {
            this.logMessage(fqcn, level, marker, message, p0, p1);
        }
    
    }
  • 相关阅读:
    python2代码改成python3踩过的坑
    Mac下为什么有的文件名后带一个* 星号?
    Mac 的 Vim 中 delete 键失效的原因和解决方案(转)
    使用pandas处理大型CSV文件(转)
    Java基础——02
    javaee相关基础
    Cookie&Session笔记
    EL&JSTL笔记------jsp
    JavaWeb基础
    Java基础——01
  • 原文地址:https://www.cnblogs.com/buguge/p/9487855.html
Copyright © 2011-2022 走看看