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

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

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("://");
    }

猜你喜欢

转载自blog.csdn.net/qq_23594799/article/details/108027989