设计-表驱动法降低代码的圈复杂度
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("://");
}