java 重构 if else_java中繁杂的if/else怎么重构

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];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值