【技术篇】往事不堪回首,如何避免代码中大量if-else

前言:
if-else代码是每一个程序员最容易写出的代码,同时也是最容易被写烂的代码,稍不注意,就产生一堆难以维护和逻辑混乱的代码。非常容易产生Bug~有句话讲得好“程序员最喜欢自己if-esle,但是不喜欢别人大量的if-else”,虽然 if-else 是必须的,但滥用 if-else 会对代码的可读性、可维护性造成很大伤害,给人一种非常lowB的感觉,接下来就让我们走近科学,探索背后的问题~~

在日常回首自己写的代码,写if-else不外乎两种场景:异常逻辑处理和不同状态处理。

两者最主要的区别是:异常逻辑处理说明只能一个分支是正常流程,而不同状态处理的所有分支都是正常流程。
话不多说,直接上Demo:

//栗子1:异常逻辑处理例子
XianYu xy= getXianYu();
if (xy!= null) {
    //do something
}else{
    //do something
 }
//栗子2:状态处理例子
XianYu xy= getXianYu();
if (xy.getType == 1) {
    //do something
}else if (xy.getType == 2) {
    //do something
}else{
    //do something
}

下面给出解决方法:
1.提前Return
这是判断条件取反的做法,代码在逻辑表达上会更清晰,看下面代码:

XianYu xy= getXianYu();
if (xy == null) {
    //do something
}else{
    //do something
 }

其实每次看到这种代码,心理都很是无语,完全可以先判断 == null,干掉else

XianYu xy= getXianYu();
if (xy == null) {
 return xx;
}
 //do something
 

这样写的话是不是看着清爽、利落很多呢?

2.使用switch-case 语句。
个人感觉这种方式其实只是换种写法而已,实际上并没有优化多少。不过当判断层数多的时候倒是switch写法的效率高一些 ;

public int getXianYu(int a, int b, String operator) {
    int result = 0;
    switch (operator) {
    case "add":
        result = a + b;
        break;
    case "multiply":
        result = a * b;
        break;
    case "divide":
        result = a / b;
        break;
    case "subtract":
        result = a - b;
        break;
    case "modulo":
        result = a % b;
        break;
    default:
        result = Integer.MIN_VALUE;
    }
    return result;
}
}

3.使用Map结合多态模式。
这种方式的简单思路就是定义一个接口,在实现该接口的不同类里面来放if-else中不同分支动作,然后用一个map来管理

public class Test {
	static Map<String, String> operates = new HashMap<String, String>();
	static {
		operates.put("1", "小咸");
		operates.put("2", "小鱼");
		operates.put("3", "小刘");
		operates.put("4", "小米");
	}
	
	public static void main(String[] args) {
		String operateType = "1";		
		String operate = operates.get(operateType);
		if (operate != null) {
			System.out.println(operate );
		}
	}

4.使用函数式编程。
这种方法原理上跟3是一样的,只是这种方法的分支动作采用了Java8中新特性函数式编程来实现,避免了3中每个分支动作一个实现类的写法。

// 维护if-else分支动作
Map<String, Student> colorMap = new HashMap<>();
colorMap.put("YELLOW", () -> {
    System.out.println("这里执行YELLOW对应的逻辑...");
});
colorMap.put("BLUE", () -> {
    System.out.println("这里执行BLUE对应的逻辑...");
});
colorMap.put("GREEN", () -> {
    System.out.println("这里执行GREEN对应的逻辑...");
});

#End
遇到大量if记住下面的口诀:
互斥条件表驱动
嵌套条件校验链
短路条件早return
零散条件可组合

以上是我在日常开发中的自我总结,各位看官有更好的方法欢迎推荐,
互相学习~~

猜你喜欢

转载自blog.csdn.net/weixin_42777004/article/details/106891380
今日推荐