皓月白熏 2022-08-29 11:52 采纳率: 80.8%
浏览 133
已结题

还是关于if else if else优化问题?

还是关于if else if else优化问题?
下面这段代码,因为针对不同的版本,要才有不同的处理逻辑。如果以后再有版本还是再里面建判断,但是感觉这个也不太适合用策略模式,因为逻辑太少了,希望大家帮忙看一下,xiexie
下面是代码入口

private String createNccSign(String version,String appPubKey,String appSecret){
    if(NcVersionEnum.NC_VERSION_2005.getVersion().equals(version)){
      return SHA256Util.getSHA256(CLIENT_ID + CLIENT_SECRET + PUBKEY);
    }else if(NcVersionEnum.NC_VERSION_2105.getVersion().equals(version) ||
            NcVersionEnum.NC_VERSION_2111.getVersion().equals(version)){
      return SHA256Util.getSHA256(CLIENT_ID + CLIENT_SECRET + PUBKEY, PUBKEY);
    }else if(NcVersionEnum.NC_VERSION_2207.getVersion().equals(version)){
      return SHA256Util.getSHA256(CLIENT_ID + appSecret + appPubKey, appPubKey);
    }
    return "";
  }

这是是定义的枚举类:

public enum NcVersionEnum {
    NC_VERSION_2005("ncc_2005_native"),
    NC_VERSION_2105("ncc_2105_native"),
    NC_VERSION_2111("ncc_2111_native"),
    NC_VERSION_2207("ncc_202207"),

    DEFAULT_ERP_VERSION("NC");

    private static final List<NcVersionEnum> ncVersionEnums = new ArrayList<>();

    static {
        ncVersionEnums.add(NC_VERSION_2005);
        ncVersionEnums.add(NC_VERSION_2105);
        ncVersionEnums.add(NC_VERSION_2111);
        ncVersionEnums.add(NC_VERSION_2207);
    }


    private String version;

    NcVersionEnum( String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    /**
     * 根据版本得到对应的枚举类。
     * @param version 版本
     * @return 对应的枚举类,如果没有返回默认版本
     */
    public static NcVersionEnum getByVersion(String version) {
        for (NcVersionEnum versionEnum : NcVersionEnum.values()) {
            if (versionEnum.getVersion().equals(version)) {
                return versionEnum;
            }
        }
        return DEFAULT_ERP_VERSION;
    }

    /**
     * 根据枚举类的版本得到是否需要走
     * @param ncVersionEnum
     * @return
     */
    public static boolean isNCCVersion(NcVersionEnum ncVersionEnum){
        return ncVersionEnums.contains(ncVersionEnum);
    }
}

下面是根据判断分别要走的加密

public static String getSHA256(String str, String key) {
        //加盐
        byte[] salt = new byte[16];
        try {
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(key.getBytes());
            random.nextBytes(salt);
        } catch (NoSuchAlgorithmException ignore) {
            //加密算法固定,不会抛出该异常
        }
        String saltValue = Base64Util.encryptBASE64(salt);
        return getSHA256(str + saltValue.replaceAll("[\r\n]", ""));
    }

    public static String  getSHA256(String str) {
        MessageDigest messageDigest;
        String encodestr = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str.getBytes(StandardCharsets.UTF_8));
            encodestr = byte2Hex(messageDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        return encodestr;
    }

一般这种情况应该怎么优化,万一以后再加个版本啥的。
备注:这种大写的都是写死的CLIENT_ID
这种小写 appSecret的都是传进来的,针对不同的版本有的要传进来,有的写死的。

  • 写回答

6条回答 默认 最新

  • yedelzx 2022-08-29 15:11
    关注

    个人觉得switch和if else没有区别,没啥大必要去转换。我觉得可以用反射去做,根据你第一段代码,把NcVersionEnum写到配置文件里,然后用properties类型,每个类型对应一个解决方法的类全路径(这些类的方法名和参数需要一致),然后代码里你只需要匹配这个值去拿到类路径,反射出来去执行那个方法就可以了,然后问题是这个方法的参数要统一getSHA256()这个方法,参数你可以包成一个对象,所有可能的值,都set进去,只需要在处理的类里面去判断就行。这样的话,有新的来的话,你只需要新增一个解决类(如果解决方法相同可以服用),然后配置文件加一个对应关系就可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 9月14日
  • 已采纳回答 9月6日
  • 修改了问题 8月29日
  • 创建了问题 8月29日

悬赏问题

  • ¥15 一道python难题2
  • ¥15 一道python难题
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备