if...else优化篇(一)

if...else优化篇(一)

  • 前言
  • 一、为什么要优化if...else代码?
  • 二、案例分析
    • 1.场景一
      • 1.1上面代码,提供3种解决思路。
        • 1.1.1 使用多态实现优化
        • 1.1.2 使用反射实现优化
        • 1.1.3 使用枚举实现优化
    • 2.场景二
            • 上面代码,利用数组来优化。
    • 3.场景三
    • 3.场景四
  • 总结
    • 优化存在的误区


前言

你的代码中是否存在着大量的if/else,无从下手呢?在实际项目开发中,不是一成不变的,软件的更新,维护,修改需求,都需要代码有良好的可拓展性,所以软件系统的可拓展性是十分的重要的,然而过多的if…else,会大大的降低代码的可拓展性。


提示:该偏博文从多个案例讲解如何优化if/else,来提升可拓展性,降低耦合。

一、为什么要优化if…else代码?

实际项目开发中,软件的需求不是一成不变的,软件的更新,维护,都需要代码有良好的可拓展性,所以软件系统的可拓展性是十分的重要的,然而过多的if…else,会大大的降低代码的可拓展性。

二、案例分析

1.场景一

  • 需求:根据不同的值来判定,不同的模式

代码如下(示例):

//待优化
public void StrategyCase(String condition){
	//判断空值
	if(condition == null)
		return;
	if(condition.equals("FlightMode")){
		//飞行模式
	}else if(condition.equals("PowerSavingMode")){
		//省电模式	
	}else if(condition.equals("SuperPowerSavingMode")){
		//超级省电模式
	}
	/*.......{
		等等模式
	}*/
}

1.1上面代码,提供3种解决思路。

在设计模式中,有讲到,将会变化部分拿出来封装。降低代码的耦合和可拓展性。

1.1.1 使用多态实现优化

//接口
public interface StrategyMode {
	void run();
}
//实现接口【创建一个PowerSavingMode类】
public class FlightMode implements StrategyMode{
	@Override
	public void run() {
		//This is flight mode.
		System.out.println("This is flight mode.");
	}
}
//实现接口【创建一个PowerSavingMode类】
public class PowerSavingMode implements StrategyMode{
	@Override
	public void run() {
		//This is power saving mode.
		System.out.println("This is power saving mode.");
	}
}
//实现接口【创建一个SuperPowerSavingMode类】
public class SuperPowerSavingMode implements StrategyMode{
	@Override
	public void run() {
		//This is super power saving mode.
		System.out.println("This is super power saving mode.");
	}
}
import java.util.HashMap;
import java.util.Map;
public class StrategyFather {
	static Map<String,StrategyMode> map = new HashMap<>();
	
	public void addMode(String str, StrategyMode mode) {
		map.put(str, mode);
	}
}
//测试类
public class Test extends StrategyFather{
	//用于存储对应的模式
	public static void main(String[] args) {
		Test test = new Test();
		//测试
		test.StrategyCase("FlightMode");
		test.StrategyCase("PowerSavingMode");
		test.StrategyCase("SuperPowerSavingMode");
	}
	
	public Test() {
		//添加模式
		addMode("FlightMode", new FlightMode());
		addMode("PowerSavingMode", new PowerSavingMode());
		addMode("SuperPowerSavingMode", new SuperPowerSavingMode());
	}
	
	public void StrategyCase(String condition){
		StrategyMode mode = map.get(condition);
		mode.run();
	}
	
}

实际上,调用者,只需要知道StrategyCase里面的两句代码就行了。实现细节都已经封装了起来。
该优化的弊端是需要通过Map来添加对应的模式,根据键值来查找对应的模式。

1.1.2 使用反射实现优化

  • 思路:该案例传入的就是字符串,那么只要模式字符串的名字与方法名字对应那么就可以通过字符串来找到对应的方法,并且调用就好了。
//存储模式行为的类
public class ModeBehavior {
	//飞行模式
	public void FlightMode() {
		System.out.println("This is flight mode.");
	}
	//省电模式
	public void PowerSavingMode() {
		System.out.println("This is power saving mode.");
	}
	//超级省电模式
	public void SuperPowerSavingMode() {
		System.out.println("This is super power saving mode.");
	}
}
//测试类
import java.lang.reflect.Method;
public class Test{
	public static void main(String[] args) {
		new Test();
	}
	public Test(){
		ModeBehavior modeBehavior = new ModeBehavior();
		//只需要传入对应的模式名,就能找到对应的模式应该执行的方法。
		StrategyCase("SuperPowerSavingMode",modeBehavior);
		StrategyCase("FlightMode",modeBehavior);
		StrategyCase("PowerSavingMode",modeBehavior);
	}
	//这里实现反射
	public void StrategyCase(String str,Object obj) {
		Class modeClazz = obj.getClass();
		try {
			Method method = modeClazz.getDeclaredMethod(str);
			method.invoke(obj);
		} catch (Exception e) {
			//不存在该方法
			System.out.println("该模式不存在");
		}
	}
}

1.1.3 使用枚举实现优化

  • 思路:枚举也可以存储方法,根据名称找到对应的方法。
public enum EnumRealization {
	FlightMode{
		public void run() {
			System.out.println("This is flight mode.");
        }
	},
	PowerSavingMode{
		public void run() {
			System.out.println("This is power saving mode.");
        }
	},
	SuperPowerSavingMode{
		public void run() {
			System.out.println("This is super power saving mode.");
        }
	};
	public abstract void run();
}
//测试类
public class Test{
	public static void main(String[] args) {
		Test enumTest = new Test();
		enumTest.StrategyCase("FlightMode");
		enumTest.StrategyCase("PowerSavingMode");
	}
	
	public void StrategyCase(String condition) {
		EnumRealization enumRealization = EnumRealization.valueOf(condition);
		enumRealization.run();
	}
}

2.场景二

  • 需求:给定一个月份,返回该月有多少天,数据以2021年作为测试年份。
  • 思路:利用数组存储值,通过索引查找。

代码如下(示例):


/*
获取月份天数
待优化
*/ 
public int getMonthDays(int number) {
	if(number == 1) return 31;
	if(number == 2) return 28;	
	if(number == 3) return 31;
	if(number == 4) return 30;
	if(number == 5) return 30;
	if(number == 6) return 30;
	if(number == 7) return 30;
	if(number == 8) return 30;
	if(number == 9) return 30;
	if(number == 10) return 30;
	if(number == 11) return 30;
	if(number == 12) return 31;
	//不存在
	return -1;
}
上面代码,利用数组来优化。
/*获取月份天数(优化)*/
int[] mMonthDay = {31,28,31,30,31,30,31,31,30,31,30,31};
public int getMonthDays(int number) {
	//越界判定(一般不在这判定)
	if(number < 1 || number > 12) return -1;
	return mMonthDay[--number];
}

3.场景三

  • 思路:利用条件取反,逻辑表达能更加的清晰。

代码如下(示例):

//待优化
if(status){
	//do something
}else{
	return "value";
}
//利用条件取反,逻辑表达能更加的清晰。
if(!status){
	return "value";
}
//do something

3.场景四

  • 需求:有时候需要通过boolean来确定状态。如果为真,变为false。如果为假变为true
  • 思路:取反

代码如下(示例):

//待优化
boolean bo = true;
if(!bo) {
	bo = true;
}else {
	bo = false;
}
//优化后
boolean bo = true;
bo = !bo;

总结

一般建议if最好不要超过三层,代码中存在过多的if…else会减低代码的可读性,后期的维护难度也会加大。

优化存在的误区

不要得了优化病。如果是为了单纯的减少if…else的层数去优化,没有任何的意义,还增加了代码的复杂程度。对自己有利的事情,才值得我们去动脑子去优化,不是吗!

你可能感兴趣的:(if...else优化,设计模式,java)