如何优化代码中大量的if/else

日常我们在写代码或者读代码时,有时会发现代码中存在大量的if/else。甚至会嵌套多层,这样会大大降低代码的可读性,使得代码维护起来费时费力。那么有什么方案可以优化代码中大量的if/else呢,下面就给大家简单的介绍几种方法。

1. 提前return

在写判断条件时,选择取反判断,这样的话代码在逻辑表达上会更清晰,看下面代码:

if (condition) {
 // do something
} else {
  return xxx;
}

其实像上面这种代码,我们可以选择先判断!condition,这样就不用再写else了。

if (!condition) {
  return xxx;
} 
// do something

2. 使用策略模式

有时我们会遇到,同一件事分多种情况,每种情况需要不同的处理方法的场景。

我们可以根据参数不同,来选择相应的处理方式。例如在计算器中的加减乘除。

 一般的实现:

if (strategy.equals("add")) {
  // 加法
} else if (strategy.equals("subtraction")) {
  // 减法
} else if (strategy.equals("multiplication")) {
  // 乘法
} else if (strategy.equals("division")) {
  // 除法
}

看上面代码,有4种策略,有两种优化方案。

2.1 多态

1.策略接口

interface Strategy {
    void run() throws Exception;
}

2. 接口实现

class AddStrategy implements Strategy {
    @Override
    public void run() throws Exception {
        // 加法执行逻辑 打印代码供测试使用
        System.out.println("加法执行逻辑");
    }
}

class SubtractionStrategy implements Strategy {
    @Override
    public void run() throws Exception {
        // 减法执行逻辑
    }
}

class MultiplicationStrategy implements Strategy {
    @Override
    public void run() throws Exception {
        // 除法执行逻辑
    }
}

class DivisionStrategy implements Strategy {
    @Override
    public void run() throws Exception {
        // 乘法执行逻辑
    }
}

3.具体策略对象存可以放在一个Map中。

import java.util.HashMap;
import java.util.Map;

public class StrategyMap {
    private static Map<String, Strategy> strategyMap = new HashMap<>();

    static {
        strategyMap.put("add", new AddStrategy());
        strategyMap.put("subtraction", new SubtractionStrategy());
        strategyMap.put("multiplication", new MultiplicationStrategy());
        strategyMap.put("division", new DivisionStrategy());    
    }

    public Strategy get(String param) {
        return strategyMap.get(param);
    }
}

4.进行优化后实现,这样通过传递的参数就可以采用具体的策略了

public class testStrategy {
    public static void main(String[] args) throws Exception {
        //传递参数获取指定策略实现
        Strategy strategy=StrategyMap.get("add");
        strategy.run();
    }
}

注:但是采用上面这种优化方案有一个弊端,为了能够快速拿到对应的策略实现,需要map对象来保存策略,当添加一个新策略的时候,还需要手动添加到map中,容易遗漏。

2.2 枚举

发现很多同学不知道在枚举中可以定义方法,这里定义一个表示状态的枚举,另外可以实现一个run方法。

public enum Status {
    NEW(0) {
      @Override
      void run() {
        //do something
      }
    },
    RUNNABLE(1) {
      @Override
       void run() {
         //do something  
      }
    };

    public int statusCode;

    abstract void run();

    Status(int statusCode){
        this.statusCode = statusCode;
    }
}

重新定义策略枚举。

public enum Strategy {
    ADD {
      @Override
      void run() {
        // 加法执行逻辑 打印代码供测试使用
        System.out.println("加法执行逻辑");
      }
    },
    SUBTRACTION {
      @Override
       void run() {
         //do something  
      }
    },

    MULTIPLICATION {
      @Override
       void run() {
         //do something  
      }
    },

    DIVISION {
      @Override
       void run() {
         //do something  
      }
    };
    abstract void run();
}

通过枚举优化之后的代码如下:

public class testStrategy {
    public static void main(String[] args) throws Exception {
        //传递参数获取指定策略实现
        Strategy strategy = Strategy.valueOf("ADD");
        strategy.run();
    }
}


3. 学会使用 Optional

Optional主要用于非空判断,是jdk8新特性,用起来真的非常方便,尤其是对于非空校验。

使用之前:

if (user == null) {
    //do action 1
} else {
    //do action2
}

如果登录用户为空,执行action1,否则执行action 2,使用Optional优化之后,让非空校验更加优雅,间接的减少if操作。

Optional<User> userOptional = Optional.ofNullable(user);
userOptional.map(action1).orElse(action2);

4. 利用数组

来自google解释,这是一种编程模式,叫做表驱动法,本质是从表里查询信息来代替逻辑语句,比如有这么一个场景,通过月份来获取当月的天数,仅作为案例演示,数据并不严谨。

一般的实现:

int getDays(int month){
    if (month == 1)  return 31;
    if (month == 2)  return 29;
    if (month == 3)  return 31;
    if (month == 4)  return 30;
    if (month == 5)  return 31;
    if (month == 6)  return 30;
    if (month == 7)  return 31;
    if (month == 8)  return 31;
    if (month == 9)  return 30;
    if (month == 10)  return 31;
    if (month == 11)  return 30;
    if (month == 12)  return 31;
}

优化后的代码:

int monthDays[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int getDays(int month){
    return monthDays[--month];
}

结束总结:

if else作为每种编程语言都不可或缺的条件语句,在编程时会大量的用到。一般建议嵌套不要超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化大量的if-else代码有多种方法。其一种方法是使用枚举来替代if-else逻辑分支。通过定义一个枚举类型,将不同的条件与对应的处理逻辑关联起来,可以将if-else语句优化为一行代码。例如,可以使用枚举类型来获取订单状态的描述信息,而不需要使用大量的if-else语句来判断订单状态并返回相应的描述信息\[1\]。 另一种优化方法是合并条件表达式。通过将多个条件合并为一个复合条件,可以减少if-else语句的数量。这样可以提高代码的可读性和可维护性\[2\]。 还有一种优化方法是使用Optional。Optional是Java 8引入的一个类,用于处理可能为空的值。通过使用Optional,可以简化对空值的判断和处理,减少if-else语句的使用\[3\]。 总之,优化大量的if-else代码可以通过使用枚举、合并条件表达式和使用Optional等方法来实现。这些方法可以提高代码的可读性、可维护性和性能。 #### 引用[.reference_title] - *1* *3* [if-else代码优化的八种方案](https://blog.csdn.net/weixin_36755535/article/details/123377660)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [if-else优化](https://blog.csdn.net/weixin_43238030/article/details/127536083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值