if条件判断是程序中最基本也最常用的判断,但是如果设计的不好,会在代码中发现嵌套很多层的if/else,写的人可能觉得没什么,但看的和维护的时候,把人拉去祭天的心都有。
本文就写一下重构多层嵌套if的方法。
首先我们要有一个原则:一个方法中的if嵌套不要超过3层,否则不易于阅读和维护。
好,原则有了,那我们就要尽量往原则上靠。
方法1 提前return
如下面这个例子
Java
if (condition){
// do something
} else {
return '';
}
1
2
3
4
5
if(condition){
// do something
}else{
return'';
}
可以直接改成这样
Java
if (!condition){
return '';
}
// do something
1
2
3
4
5
if(!condition){
return'';
}
// do something
方法2 策略模式
一个例子
Java
if (paramRoute.equals("a"){
// do something
} else if (paramRoute.equals("b"){
// do something
} else if (paramRoute.equals("c"){
// do something
} else {
// do something
}
1
2
3
4
5
6
7
8
9
if(paramRoute.equals("a"){
// do something
}elseif(paramRoute.equals("b"){
// do something
}elseif(paramRoute.equals("c"){
// do something
}else{
// do something
}
策略模式有多种实现方式:
方式2.1 多态
Java
interface ParamRoute {
void run() throws Exception;
}
class ParamA implements ParamRoute {
@Override
void run() throws Exception{
// do something
}
}
class ParamB implements ParamRoute {
@Override
void run() throws Exception{
// do something
}
}
class ParamC implements ParamRoute {
@Override
void run() throws Exception{
// do something
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interfaceParamRoute{
voidrun()throwsException;
}
classParamAimplementsParamRoute{
@Override
voidrun()throwsException{
// do something
}
}
classParamBimplementsParamRoute{
@Override
voidrun()throwsException{
// do something
}
}
classParamCimplementsParamRoute{
@Override
voidrun()throwsException{
// do something
}
}
初始化时,把各种策略对象放到Map中
Java
ParamRoute paramRoute = map.get(param);
paramRoute.run();
1
2
ParamRouteparamRoute=map.get(param);
paramRoute.run();
方式2.2 枚举
Java
public enum ParamRoute{
ParamA {
@Override
void run(){
// do something
}
},
ParamB { @Override void run(){ // do something } },
ParamC { @Override void run(){ // do something } };
abstract void run();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
publicenumParamRoute{
ParamA{
@Override
voidrun(){
// do something
}
},
ParamB{@Overridevoidrun(){// do something } },
ParamC{@Overridevoidrun(){// do something } };
abstractvoidrun();
}
再直接调用
Java
ParamRoute paramRoute = map.valueOf(param);
paramRoute.run();
1
2
ParamRouteparamRoute=map.valueOf(param);
paramRoute.run();
方法3 Optional
这是JDK8的新特性,用于非空判断。
如下面这个例子
Java
if (condition){
// do something
} else {
return '';
}
1
2
3
4
5
if(condition){
// do something
}else{
return'';
}
可以直接改成这样
Java
Optional optional = Optional.ofNullable(param);
// action1 和 action2 分别是不同的方法
optional.map(action1).orElse(action2);
1
2
3
Optionaloptional=Optional.ofNullable(param);
// action1 和 action2 分别是不同的方法
optional.map(action1).orElse(action2);
方法4 表驱动法
如果对数据库知识有了解的话,会知道从表里查一条数据非常便捷。那在java代码中有没有类似表的结构呢,数组和Map就可以看做一种简单的表。如下例:
int getDays(int month){
if ( month == 1) return 31;
if ( month == 2) return 29;
if ( month == 3) return 31;
// 略去一部分月份
if ( month == 11) return 30;
if ( month == 12) return 31;
}
1
2
3
4
5
6
7
8
intgetDays(intmonth){
if(month==1)return31;
if(month==2)return29;
if(month==3)return31;
// 略去一部分月份
if(month==11)return30;
if(month==12)return31;
}
改成:
Java
int monthDays[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int getDays(int month){
return monthDays[--month];
}
1
2
3
4
5
intmonthDays[12]={31,29,31,30,31,30,31,31,30,31,30,31};
intgetDays(intmonth){
returnmonthDays[--month];
}