El enfoque basado en tablas de diseño reduce la complejidad ciclomática del código

El enfoque basado en tablas de diseño reduce la complejidad ciclomática del código

1. El método basado en tablas de diseño reduce la complejidad ciclomática del código

Primero veamos un problema

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

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

Naturalmente, podemos pensar en tal método

    /**
     * 传统的方式实现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;
    }

Pero este código es un poco detallado. Si hay docenas de esquemas, ¿no tenemos que escribir docenas de si más?
Eso aumentará en gran medida la dificultad del mantenimiento del código. Cada uno de los demás contribuye con una complejidad ciclomática al código. Debemos utilizar alguna forma de optimizar el código anterior y reducir la complejidad ciclomática.

Para lograr el propósito anterior, se recomienda utilizar el método basado en tablas para optimizar, no solo puede reducir la complejidad del tiempo a O (1), sino también reducir la complejidad ciclomática en 1.
Al mismo tiempo, para la mantenibilidad del código, podemos guardar la relación de mapeo en el archivo de configuración por adelantado, escribirlo como un par clave-valor de tipo json, analizarlo con Gson, etc., o entregar dinámicamente un fragmento de json (es decir, configurado por el servidor).

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

Supongo que te gusta

Origin blog.csdn.net/qq_23594799/article/details/108027989
Recomendado
Clasificación