在平时开发中会遇到很多类似于根据不同的场景获取不同的值的场景,最常想到的就是用if/else进行判断处理。
但是这种写法,代码的复用性和可读性就会很差,而且耦合性就会很高。那么在改动时可能会影响整体功能,从而在新增/删除时就需要重测功能。
改造优化前的代码
先上代码:可以看到大量的if/else判断,当然还有人喜欢用switch/case语句。
public static String getResult(String inParam){
if ("A".equals(inParam)){
return "java";
}else if ("B".equals(inParam)){
return "python";
}else if ("C".equals(inParam)){
return "php";
}else{
return "c";
}
}
假如说后续要增加一个类型,那么就需要继续在if/else中加判断,对代码的可读性就会很差。
改造优化后的代码
可以用ImmutableMap,它是map的一种,可以在里面存放需要映射的对象关系的值。
查看源码可知:ImmutableMap是一个不可变的Map对象。
这样用的话,不论新增还是删除,都需要调整map中的数据即可,而不需要改动业务逻辑的代码。
在使用时有两种用法
//用法1
ImmutableMap.of();
//用法2
ImmutableMap.<String,String>builder()
.put("A","java")
.build();
那以用法1为例:
public class ImmutableMapDemo {
public static final Map<String,String> resultMap =
ImmutableMap.of(
"A","java",
"B","python",
"C","php",
"D","c"
);
public static void main(String[] args) {
String aa=resultMap.get("A");
System.out.printf(aa);
}
}
每个判断分支逻辑很复杂,可引入策略模式
举例,在:“A”这个判断的分支时,需要引入很多的业务处理再返回时,可以运用设计模式中的策略模式。
具体可参考我写的另一篇文章:
可以针对每个不同的值,进入到不同的方法中进行处理。这样会降低代码的耦合性。
特别说明
ImmutableMap.of方法入参最多只能有5对,如果添加的数据超过5对,需要改用builder方法.
Map<String, String> INTEGER_STRING_MAP = new ImmutableMap.Builder<String, String>().
put("A","java").
put("B","python").
put("C","php").
put("D","c").
put("E","c++").
put("F","vue").
build();
复盘
- 减少if/else的目的在于,可读性会提升;
- 降低代码的耦合性,以达到新增/删除时,不调整代码的业务逻辑;