java 重构 if else_java中繁杂的if/else怎么重构
if條件判斷是程序中最基本也最常用的判斷,但是如果設(shè)計的不好,會在代碼中發(fā)現(xiàn)嵌套很多層的if/else,寫的人可能覺得沒什么,但看的和維護的時候,把人拉去祭天的心都有。
本文就寫一下重構(gòu)多層嵌套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
}
策略模式有多種實現(xiàn)方式:
方式2.1 多態(tài)
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();
}
再直接調(diào)用
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 表驅(qū)動法
如果對數(shù)據(jù)庫知識有了解的話,會知道從表里查一條數(shù)據(jù)非常便捷。那在java代碼中有沒有類似表的結(jié)構(gòu)呢,數(shù)組和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];
}
總結(jié)
以上是生活随笔為你收集整理的java 重构 if else_java中繁杂的if/else怎么重构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库内NOT NULL_浅谈
- 下一篇: php面向对象封装mysql_php m