你的代码中是否存在着大量的if/else,无从下手呢?在实际项目开发中,不是一成不变的,软件的更新,维护,修改需求,都需要代码有良好的可拓展性,所以软件系统的可拓展性是十分的重要的,然而过多的if…else,会大大的降低代码的可拓展性。
提示:该偏博文从多个案例讲解如何优化if/else,来提升可拓展性,降低耦合。
实际项目开发中,软件的需求不是一成不变的,软件的更新,维护,都需要代码有良好的可拓展性,所以软件系统的可拓展性是十分的重要的,然而过多的if…else,会大大的降低代码的可拓展性。
代码如下(示例):
//待优化
public void StrategyCase(String condition){
//判断空值
if(condition == null)
return;
if(condition.equals("FlightMode")){
//飞行模式
}else if(condition.equals("PowerSavingMode")){
//省电模式
}else if(condition.equals("SuperPowerSavingMode")){
//超级省电模式
}
/*.......{
等等模式
}*/
}
在设计模式中,有讲到,将会变化部分拿出来封装。降低代码的耦合和可拓展性。
//接口
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来添加对应的模式,根据键值来查找对应的模式。
//存储模式行为的类
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("该模式不存在");
}
}
}
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();
}
}
代码如下(示例):
/*
获取月份天数
待优化
*/
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];
}
代码如下(示例):
//待优化
if(status){
//do something
}else{
return "value";
}
//利用条件取反,逻辑表达能更加的清晰。
if(!status){
return "value";
}
//do something
代码如下(示例):
//待优化
boolean bo = true;
if(!bo) {
bo = true;
}else {
bo = false;
}
//优化后
boolean bo = true;
bo = !bo;
一般建议if最好不要超过三层,代码中存在过多的if…else会减低代码的可读性,后期的维护难度也会加大。
不要得了优化病。如果是为了单纯的减少if…else的层数去优化,没有任何的意义,还增加了代码的复杂程度。对自己有利的事情,才值得我们去动脑子去优化,不是吗!