if-else代码优化的八种方案

前言

代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案。

优化方案一:提前return,去除不必要的else

如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。

优化前:

if(condition){
    //doSomething
}else{
    return ;
}

优化后:

if(!condition){
    return ;
}
//doSomething

优化方案二:使用条件三目运算符

使用条件三目运算符可以简化某些if-else,使代码更加简洁,更具有可读性。

优化前:

int  price ;
if(condition){
    price = 80;
}else{
    price = 100;
}

优化后:

int price = condition?80:100;

优化方案三:使用枚举

在某些时候,使用枚举也可以优化if-else逻辑分支,按个人理解,它也可以看做一种表驱动方法

优化前:

String OrderStatusDes;
if(orderStatus==0){
    OrderStatusDes ="订单未支付";
}else if(OrderStatus==1){
    OrderStatusDes ="订单已支付";
}else if(OrderStatus==2){
   OrderStatusDes ="已发货";
}
...

优化后:

先定义一个枚举

:
public enum OrderStatusEnum {
    UN_PAID(0,"订单未支付"),PAIDED(1,"订单已支付"),SENDED(2,"已发货"),;

    private int index;
    private String desc;

    public int getIndex() {
        return index;
    }

    public String getDesc() {
        return desc;
    }

    OrderStatusEnum(int index, String desc){
        this.index = index;
        this.desc =desc;
    }

    OrderStatusEnum of(int orderStatus) {
        for (OrderStatusEnum temp : OrderStatusEnum.values()) {
            if (temp.getIndex() == orderStatus) {
                return temp;
            }
        }
        return null;
    }
}

有了枚举之后,以上if-else逻辑分支,可以优化为一行代码

String OrderStatusDes = OrderStatusEnum.0f(orderStatus).getDesc();

优化方案四:合并条件表达式

如果有一系列条件返回一样的结果,可以将它们合并为一个条件表达式,让逻辑更加清晰。

优化前

 double getVipDiscount() {
        if(age<18){
            return 0.8;
        }
        if("深圳".equals(city)){
            return 0.8;
        }
        if(isStudent){
            return 0.8;
        }
        //do somethig
    }

优化后

 double getVipDiscount(){
        if(age<18|| "深圳".equals(city)||isStudent){
            return 0.8;
        }
        //doSomthing
    }

优化方案五:使用 Optional

有时候if-else比较多,是因为非空判断导致的,这时候你可以使用java8的Optional进行优化。

优化前:

String str = "[email protected]";
if (str != null) {
    System.out.println(str);
} else {
    System.out.println("Null");
}

优化后:

Optional<String> strOptional = Optional.of("[email protected]");
strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));

优化方案六:表驱动法

表驱动法,又称之为表驱动、表驱动方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。以下的demo,把map抽象成表,在map中查找信息,而省去不必要的逻辑语句。

优化前:

if (param.equals(value1)) {
    doAction1(someParams);
} else if (param.equals(value2)) {
    doAction2(someParams);
} else if (param.equals(value3)) {
    doAction3(someParams);
}
// ...

优化后:

Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型

// 初始化
actionMappings.put(value1, (someParams) -> { doAction1(someParams)});
actionMappings.put(value2, (someParams) -> { doAction2(someParams)});
actionMappings.put(value3, (someParams) -> { doAction3(someParams)});

// 省略多余逻辑语句
actionMappings.get(param).apply(someParams);

优化方案七:优化逻辑结构,让正常流程走主干

优化前:

public double getAdjustedCapital(){
    if(_capital <= 0.0 ){
        return 0.0;
    }
    if(_intRate > 0 && _duration >0){
        return (_income / _duration) *ADJ_FACTOR;
    }
    return 0.0;
}

优化后:

public double getAdjustedCapital(){
    if(_capital <= 0.0 ){
        return 0.0;
    }
    if(_intRate <= 0 || _duration <= 0){
        return 0.0;
    }

    return (_income / _duration) *ADJ_FACTOR;
}

将条件反转使异常情况先退出,让正常流程维持在主干流程,可以让代码结构更加清晰。

优化方案八:策略模式+工厂方法消除if else

假设需求为,根据不同勋章类型,处理相对应的勋章服务,优化前有以下代码:

    String medalType = "guest";
    if ("guest".equals(medalType)) {
        System.out.println("嘉宾勋章");
     } else if ("vip".equals(medalType)) {
        System.out.println("会员勋章");
    } else if ("guard".equals(medalType)) {
        System.out.println("展示守护勋章");
    }
    ...

首先,我们把每个条件逻辑代码块,抽象成一个公共的接口,可以得出以下代码:

//勋章接口
public interface IMedalService {
    void showMedal();
}

我们根据每个逻辑条件,定义相对应的策略实现类,可得以下代码:

//守护勋章策略实现类
public class GuardMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("展示守护勋章");
    }
}
//嘉宾勋章策略实现类
public class GuestMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("嘉宾勋章");
    }
}
//VIP勋章策略实现类
public class VipMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("会员勋章");
    }
}

接下来,我们再定义策略工厂类,用来管理这些勋章实现策略类,如下:

//勋章服务工产类
public class MedalServicesFactory {

    private static final Map<String, IMedalService> map = new HashMap<>();
    static {
        map.put("guard", new GuardMedalServiceImpl());
        map.put("vip", new VipMedalServiceImpl());
        map.put("guest", new GuestMedalServiceImpl());
    }
    public static IMedalService getMedalService(String medalType) {
        return map.get(medalType);
    }
}

使用了策略+工厂模式之后,代码变得简洁多了,如下:

public class Test {
    public static void main(String[] args) {
        String medalType = "guest";
        IMedalService medalService = MedalServicesFactory.getMedalService(medalType);
        medalService.showMedal();
    }
}

参考与感谢

个人公众号

  • 觉得写得好的小伙伴给个点赞+关注啦,谢谢~
  • 同时非常期待小伙伴们能够关注我公众号,后面慢慢推出更好的干货~嘻嘻

原文地址:https://www.cnblogs.com/jay-huaxiao/p/12586598.html

时间: 2025-01-17 12:39:50

if-else代码优化的八种方案的相关文章

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 对于IOC的原理,我们曾经写过一篇博文,[SSH进阶之路

八.背包问题方案总数

八.背包问题方案总数 对于一个给定了背包容量.物品费用.物品间相互关系(分组.依赖等)的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得到装满背包或将背包装至某一指定容量的方案总数. 对于这类改变问法的问题,一般只需将状态转移方程中的max改成sum即可.例如若每件物品均是01背包中的物品,转移方程即为f[i][v]=sum{f[i-1][v],f[i-1][v-w[i]]+c[i]},初始条件f[0][0]=1. 事实上,这样做可行的原因在于状态转移方程已经考察了所有可能的背

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time:

Selenium Webdriver元素定位的八种常用方式

在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方式共八种,现分别介绍如下. 1. By.name() 假设我们要测试的页面源码如下: <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><

八种主流NoSQL数据库对比

摘要:虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举.详见我的IT-Homer博客: 八种主流NoSQL数据库对比 简介 NoSQL,是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储.现今的计算机体系结构在数据存储方面要求具备庞大的水平扩展性,而NoSQL致力于改变这一现状.目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型数

【Selenium 3+Java自动化(4)】-八种元素定位

1 package com.mypro.jase; 2 3 import org.openqa.selenium.By; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.WebElement; 6 7 public class FindElement { 8 WebDriver driver; 9 String url = "http://www.baidu.com"; 10 11 /** 12

敏捷教练的八种失败角色

踏入敏捷圈很久了,参加了很多活动,和众多一线的敏捷教练进行交流,对敏捷教练的八种失败角色有了一些新的感悟,这里再次把这八种失败角色拉出来晒一晒,各位教练请对号入座: 1.   侦探型: 适当观察团队,带着观察的信息,消失在黑暗之中,团队断断续续能感觉到教练的存在,但是似乎看得见摸不着.教练偶尔发出一些观察的信息和建议,但是当团队想找教练沟通时,侦探教练总是神神秘秘. 2.   海鸥型:猛然扎进站立会中,用善意的观察和建议冲击整个团队,然后便飞走了,留下团队在身后,满脸迷茫,不知所措.海鸥教练得到

java基本数据类型四类八种

第1类:整型:byte.short.int.long 第2类:浮点型:float.double 第3类:逻辑型:boolean 第4类:字符型:char 字节长度从小到大: boolean型: 1/8 byte字节类型:1 char字符型:2 一个字符能存储一个中文汉字 short短整型:2 int整数类型:4 float浮点类型(单精度):4 long长整型:8 double双精度类型(双精度)8 注:java中默认的整数类型是int类型,若要定义为float型,加上l或L; 默认的浮点型也是

生成html的几种方案

方案1: ///   <summary > ///   传入URL返回网页的html代码 ///   </summary > ///   <param   name="Url" >URL </param > ///   <returns > </returns > public   static     string   getUrltoHtml(string   Url) { errorMsg   =   &qu