优化if-else的11种方案

简介: 优雅编码不仅提升程序效率,也增进代码可读性与维护性。通过早返回减少嵌套逻辑、运用三元运算符简化条件判断、采用`switch-case`优化多分支结构、实施策略模式灵活应对不同情境、利用查找表快速定位处理方式、封装函数明确职责划分、应用命令模式解耦操作与调用、引入状态模式管理复杂状态变化、重构条件表达式以增强清晰度、运用断言确保前提条件、及合理异常处理等十大技巧,使代码更加精炼与优雅。

优雅永不过时!

image-20240805201630837

1. 使用早返回(Early Return):尽可能早地返回,避免嵌套的if-else。

优化前:

public class NoEarlyReturnExample {
   
   
    public boolean hasPositiveNumber(int[] numbers) {
   
   
        boolean foundPositive = false;
        for (int number : numbers) {
   
   
            if (number > 0) {
   
   
                foundPositive = true;
                // 没有早返回,而是继续循环
            }
        }
        return foundPositive; // 循环结束后返回结果
    }
}

优化后:

public class EarlyReturnExample {
   
   
    public boolean hasPositiveNumber(int[] numbers) {
   
   
        for (int number : numbers) {
   
   
            if (number > 0) {
   
   
                return true; // 找到正数立即返回
            }
        }
        return false; // 没有找到正数
    }
}

减少了多次循环

2. 使用三元运算符:在条件简单的情况下,可以使用三元运算符来简化代码。

优化前:

public class NoTernaryOperatorExample {
   
   
    public String getGender(int number) {
   
   
        if (number > 0) {
   
   
            return "girl";
        } else if (number < 0) {
   
   
            return "boy";
        } else {
   
   
            return "other";
        }
    }
}

优化后:

public class TernaryOperatorExample {
   
   
    public String getGender(int number) {
   
   
        return (number > 0) ? "girl" : (number < 0) ? "boy" : "other";
    }
}

3. 使用switch-case语句:如果你的条件是基于不同的情况或值,更好的选择是switch-case。

优化前:

public class NoSwitchCaseExample {
   
   
    public void performAction(String action) {
   
   
        if ("start".equals(action)) {
   
   
            System.out.println("Starting...");
        } else if ("stop".equals(action)) {
   
   
            System.out.println("Stopping...");
        } else {
   
   
            System.out.println("Unknown action");
        }
    }
}

优化后:

public class SwitchCaseExample {
   
   
    public void performAction(String action) {
   
   
        switch (action) {
   
   
            case "start":
                System.out.println("Starting...");
                break;
            case "stop":
                System.out.println("Stopping...");
                break;
            default:
                System.out.println("Unknown action");
        }
    }
}

4. 使用策略模式:将每个条件分支封装成一个策略对象,然后根据条件选择使用哪个策略。

优化前:

public class NoStrategyExample {
   
   
    public void context() {
   
   
        // 没有使用策略模式,而是直接执行代码
        System.out.println("Direct execution");
        // do something...
    }
}

优化后:

public class StrategyExample {
   
   
    interface Strategy {
   
   
        void execute();
    }

    public class ConcreteStrategyA implements Strategy {
   
   
        public void execute() {
   
   
            System.out.println("Strategy A executed");
        }
    }

    public void context(Strategy strategy) {
   
   
        strategy.execute();
    }
}

5. 使用查找表:对于固定数量的条件分支,可以使用查找表(例如字典或哈希表)来映射条件和对应的行为。

优化前:

public class NoLookupTableExample {
   
   
    public void performAction(String action) {
   
   
        // 没有使用查找表,而是使用if-else
        if ("start".equals(action)) {
   
   
            System.out.println("Starting...");
        } else if ("stop".equals(action)) {
   
   
            System.out.println("Stopping...");
        } else {
   
   
            System.out.println("No action found");
        }
    }
}

优化后:

public class LookupTableExample {
   
   
    public void performAction(Map<String, Runnable> actions, String key) {
   
   
        actions.getOrDefault(key, () -> System.out.println("No action found")).run();
    }
}

6. 使用函数或方法:将每个条件分支的逻辑封装到不同的函数或方法中,然后在if-else中调用这些函数。

优化前:

public class NoFunctionExample {
   
   
    public void handleUserType(String userType) {
   
   
        // 没有使用函数封装,而是直接在if-else中编写逻辑
        if ("admin".equals(userType)) {
   
   
            System.out.println("Admin logic here");
        } else if ("user".equals(userType)) {
   
   
            System.out.println("User logic here");
        } else {
   
   
            System.out.println("Guest logic here");
        }
    }
}

优化后:

public class FunctionExample {
   
   
    public void handleUserType(String userType) {
   
   
        if ("admin".equals(userType)) {
   
   
            handleAdmin();
        } else if ("user".equals(userType)) {
   
   
            handleUser();
        } else {
   
   
            handleGuest();
        }
    }

    private void handleAdmin() {
   
   
        System.out.println("Handling admin");
    }

    private void handleUser() {
   
   
        System.out.println("Handling user");
    }

    private void handleGuest() {
   
   
        System.out.println("Handling guest");
    }
}

这个是大家比较常用的,通过不同的功能拆分成不同的函数。

7. 使用命令模式:将每个条件分支封装成一个命令对象,然后根据条件执行相应的命令。

优化前:

public class NoCommandExample {
   
   
    public void performAction(String action) {
   
   
        // 直接执行动作,没有使用命令模式
        if ("start".equals(action)) {
   
   
            System.out.println("Starting...");
        } else if ("stop".equals(action)) {
   
   
            System.out.println("Stopping...");
        }
    }
}

优化后:

public class CommandExample {
   
   
    interface Command {
   
   
        void execute();
    }

    public class StartCommand implements Command {
   
   
        public void execute() {
   
   
            System.out.println("Starting...");
        }
    }

    public class StopCommand implements Command {
   
   
        public void execute() {
   
   
            System.out.println("Stopping...");
        }
    }

    public void executeCommand(Command command) {
   
   
        command.execute();
    }
}

8. 使用状态模式:如果逻辑分支与状态有关,可以使用状态模式来管理状态转换。

优化前:

public class NoStateExample {
   
   
    public void handleAction(String state) {
   
   
        // 没有使用状态模式,直接在代码中处理逻辑
        if ("start".equals(state)) {
   
   
            System.out.println("Handling start");
        } else if ("stop".equals(state)) {
   
   
            System.out.println("Handling stop");
        }
    }
}

优化后:

public class StateExample {
   
   
    interface State {
   
   
        void handle();
    }

    public class StartState implements State {
   
   
        public void handle() {
   
   
            System.out.println("Handling start state");
        }
    }

    public class StopState implements State {
   
   
        public void handle() {
   
   
            System.out.println("Handling stop state");
        }
    }

    public class Context {
   
   
        private State state;

        public void setState(State state) {
   
   
            this.state = state;
        }

        public void request() {
   
   
            state.handle();
        }
    }
}

状态转换类似于我们在做一个简单的工单流转,每一步都是确定且可复用的场景。

9. 重构条件表达式:检查是否可以将复杂的条件表达式分解为更简单的部分。

优化前:

public class UnrefactoredConditionExample {
   
   
    public boolean isWeekend(int day) {
   
   
        // 没有重构的条件表达式,切套多、不好阅读
        if (day == 6 || (day == 7 && !isHoliday(day))) {
   
   
            return true;
        }
        return false;
    }

    private boolean isHoliday(int day) {
   
   
        // 法定的假日检查逻辑(法定节假日每年都在变)
        return false;
    }
}

优化后:

public class RefactoredConditionExample {
   
   
    public boolean isWeekend(int day) {
   
   
        return day == 6 || day == 7;
    }
}

简洁了很多

10. 使用断言:在某些情况下,使用断言来确保代码的预设条件被满足,避免复杂的条件判断。

优化前:

public class NoAssertExample {
   
   
    public void process(int value) {
   
   
        if (value <= 0) {
   
   
            throw new IllegalArgumentException("Value must be positive");
        }
        // 处理逻辑
        System.out.println("Processing value: " + value);
    }
}

优化后:

public class AssertExample {
   
   
    public void process(int value) {
   
   
        assert value > 0 : "Value must be positive";
        // 处理逻辑
        System.out.println("Processing value: " + value);
    }
}

多数编程中,断言被用在自动化测试用例。不过预设条件判断用起来也非常丝滑。

11. 使用异常处理:在某些情况下,使用异常处理来简化错误条件的处理。

优化前:

public class NoExceptionHandlingExample {
   
   
    public int divide(int dividend, int divisor) {
   
   
        if (divisor == 0) {
   
   
            // 没有使用异常处理,而是直接返回错误代码
            System.out.println("Cannot divide by zero");
            return -1;
        }
        return dividend / divisor;
    }
}

优化后:

public class ExceptionHandlingExample {
   
   
    public int divide(int dividend, int divisor) {
   
   
        try {
   
   
            return dividend / divisor;
        } catch (ArithmeticException e) {
   
   
            System.out.println("Cannot divide by zero");
            return -1;
        }
    }
}

当遇到异常,尽可能在合适的地方捕获并处理,不要直接把所有异常都抛到最外层。

目录
相关文章
|
数据中心 Anolis
性能优化特性之:LSE指令集编译优化
本文介绍了倚天实例上的编译优化特性:LSE,并从优化原理、使用方法进行了详细阐述。
|
4月前
|
存储 安全 Java
解密电商平台 SSO 单点跨域
本文深入解析电商平台SSO单点登录与跨域问题,涵盖核心概念、流程拆解及实战方案。通过统一认证中心与JWT令牌实现多系统无缝访问,结合CORS解决跨域难题,提升用户体验与系统安全性。
254 1
|
8月前
|
消息中间件 前端开发 JavaScript
如何开发工程项目部管理系统中的WBS分解板块(附架构图+流程图+代码参考)
本文详细解析了如何将工程项目中的WBS(工作分解结构)系统化,通过拆解“大工程”为可执行的小单元,实现责任明确、变更可控、联动管理与风险降低。内容涵盖系统架构、业务流程、数据模型、前后端实现、关键路径算法及最小可跑代码(MVP),并提供数据库设计、接口定义与React前端示例,助力快速落地工程项目管理系统。
|
12月前
|
Web App开发 安全 iOS开发
macOS Sequoia 15.4.1 (24E263) 正式版 ISO、IPSW、PKG 下载
macOS Sequoia 15.4.1,2025 年 4 月 17 日,仅问题修复和安全更新。
943 6
macOS Sequoia 15.4.1 (24E263) 正式版 ISO、IPSW、PKG 下载
|
JSON 自然语言处理 数据处理
数据标注工具 Label-Studio
数据标注工具 Label-Studio
6957 0
|
移动开发 HTML5
详解 HTML5 服务器发送事件(Server-Sent Events)
详解 HTML5 服务器发送事件(Server-Sent Events)
667 0
|
人工智能 JSON 自然语言处理
智谱AI GLM4开源!支持多模态&长序列,魔搭推理、微调最佳实践来啦!
GLM-4-9B是智谱AI推出的新一代预训练模型GLM-4系列的开源版本,它在多个数据集上的测试中表现出高绩效,包括语义理解、数学问题解决、推理和代码理解等方面。GLM-4-9B模型有四个变体:基础版GLM-4-9B(8K)、对话版GLM-4-9B-Chat(128K)、超长上下文版GLM-4-9B-Chat-1M(1M)和多模态版GLM-4V-9B-Chat(8K)。用户可以通过魔搭社区提供的链接体验这些模型,包括在CPU上运行的版本和支持vLLM推理的版本。
智谱AI GLM4开源!支持多模态&长序列,魔搭推理、微调最佳实践来啦!
|
安全 算法 网络安全
国家信息安全水平考试NISP一级理论真题答案2
国家信息安全水平考试NISP一级理论真题答案2
|
数据安全/隐私保护
matlab 曲线光滑,去毛刺,去离群值,数据滤波,高通滤波,低通滤波,带通滤波,带阻滤波
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
Devops 开发工具 数据安全/隐私保护
Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/5)
Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/5)
594 0

热门文章

最新文章