设计-表驱动法降低代码的圈复杂度

设计-表驱动法降低代码的圈复杂度

1、设计-表驱动法降低代码的圈复杂度

先来看一个问题

设计一个根据不同scheme判断应用内打开还是外部打开的程序。

/**
 * 优化一段代码,降低代码的圈复杂度
 *
 * scheme        打开
 * weixin://    true
 * mqq://       true
 * baidu://     true
 * https://     false
 *
 */

很自然的,我们可以想到这样的方法

    /**
     * 传统的方式实现scheme判定
     * @param scheme
     * @param yes
     * @return
     */
    public static boolean shouldOpenSchemeBySystem(String scheme,boolean yes){
        if(!isCorrectFormat(scheme)){
            return false;
        }
        String schemePrefix=scheme.substring(0,scheme.indexOf("://"));
        if(schemePrefix.equals("weixin://")){
            return false;
        }else if(schemePrefix.equals("mqq://")){
            return false;
        }else if(schemePrefix.equals("baidu://")){
            return false;
        }else if(schemePrefix.equals("https://")){
            return true;
        }else {
            //other schemes ...etc
        }
        return false;
    }

但是这段代码有点啰嗦,假如有几十个scheme,那我们岂不是要写几十个if else?
那样就大大的增加了代码的维护难度,每个if else都为代码贡献了一个圈复杂度,我们必须药采用某种方式来优化上面的代码,降低圈复杂度。

为了达到上面的目的,建议采用表驱动法优化,不仅可以把时间复杂度降为O(1),也可将圈复杂度降低1。
同时,为了代码的可维护性,我们可以预先将其中的映射关系存入配置文件,写成json类型的键值对,用Gson等进行解析,或者动态下发一段json(即是由服务器配置)。

    private static Map<String,Boolean> schemeMap;
    /**
     * 表驱动的方式实现scheme判定
     * @param scheme
     * @return
     */
    public static boolean shouldOpenSchemeBySystem(String scheme){
        if(!isCorrectFormat(scheme)){
            return false;
        }
        Map<String,Boolean> map=loadSchemeOption();
        String schemePrefix=scheme.substring(0,scheme.indexOf("://"));
        if(!map.containsKey(schemePrefix)){
            return false;
        }
        return map.get(schemePrefix);
    }

    public static Map<String,Boolean> loadSchemeOption(){
        if(schemeMap==null){
            //load properties from file or network,json format is perfect.
            schemeMap=new HashMap<>();
        }

        return schemeMap;
    }
    public static boolean isCorrectFormat(String scheme){
        return scheme!=null&&scheme.contains("://");
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值