防御性编程失败,我开始优化我写的多重 if-else 代码

2024-01-06 04:20

本文主要是介绍防御性编程失败,我开始优化我写的多重 if-else 代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 版本
  • 几种常用的优化方式
    • 提前使用 return 返回去除不必要的 else
    • 使用三目运算符
    • 使用枚举
    • 抽取条件判断作为单独的方法
    • 有时候 switch 比 if-else 更加合适
    • 策略模式 + 简单工厂模式
  • 如何优化开头的代码
  • 个人简介

前言

  • 最近防御性编程比较火,不信邪的我在开发中我进行了尝试,然后我写下了如下的代码:
    public static void main(String[] args) {// do somethingif ("满足条件A") {// 查询权限if ("是否具备权限A" && "是否具备权限B") {// 查询配置if ("配置是否开启"){// do something}}}// do something}
  • 不出意外我被逮捕了,组内另外一位同事对我的代码进行了 CodeReview,我的防御性编程编程没有幸运逃脱,被标记上了“多重 if-else ”需要进行优化,至此我的第一次防御性编程失败,开始了优化多重 if-else 之路,下面是我总结出的常用几种优化方式。

版本

  • Java8

几种常用的优化方式

提前使用 return 返回去除不必要的 else

  • 如果我们的代码块中需要使用 return 返回,我们应该尽可能早的使用 return 返回而不是使用 else
  • 优化前
    private static boolean extracted(boolean condition) {if (condition) {// do somethingreturn false;}else {// do somethingreturn true;}}
  • 优化后
    private static boolean extracted(boolean condition) {if (condition) {// do somethingreturn false;}// do somethingreturn true;}

使用三目运算符

  • 一些简单的逻辑我们可以使用三目运算符替代 if-else ,这样可以让我们的代码更加简洁

  • 优化前

        int num = 0;if (condition) {num = 1;} else {num = 2;}
  • 优化后
int num = condition ? 1 : 2;

使用枚举

  • 在某一些场景我们也可以使用枚举来优化多重 if-else 代码,使我们的代码更加简洁、具备更多的可读性和可维护性。

  • 优化前

        String OrderStatusDes;if (orderStatus == 0) {OrderStatusDes = "订单未支付";} else if (orderStatus == 1) {OrderStatusDes = "订单已支付";} else if (orderStatus == 2) {OrderStatusDes = "已发货";} else {throw new Exception("Invalid order status");}
  • 优化后
public enum OrderStatusEnum {UN_PAID(0, "订单未支付"),PAIDED(1, "订单已支付"),SENDED(2, "已发货"),;private final int code;private final String desc;public int getCode() {return code;}public String getDesc() {return desc;}OrderStatusEnum(int index, String desc) {this.code = index;this.desc = desc;}public static OrderStatusEnum getOrderStatusEnum(int orderStatusCode) {for (OrderStatusEnum statusEnum : OrderStatusEnum.values()) {if (statusEnum.getCode() == orderStatusCode) {return statusEnum;}}return null;}
}// 当然你需要根据业务场景对异常值做出合适的处理
OrderStatusEnum.getOrderStatusEnum(2)

抽取条件判断作为单独的方法

  • 当我们某个逻辑条件判断比较复杂时,可以考虑将判断条件抽离为单独的方法,这样可以使我们主流程逻辑更加清晰
  • 优化前
        // do somethingif ("满足条件A" && "满足条件B") {// 查询权限if ("是否具备权限A" && "是否具备权限B") {// do something}}// do something
  • 优化后
    public static void main(String[] args) {// do somethingif (hasSomePermission()) {// do something}// do something}private static boolean hasSomePermission() {if (!"满足条件A" || !"满足条件B") {return false;}// 查询权限return "是否具备权限A" && "是否具备权限B";}

有时候 switch 比 if-else 更加合适

  • 当条件为清晰的变量和枚举、或者单值匹配时,switch 比 if-else 更加合适,可以我们带好更好的可读性以及更好的性能 O(1)
  • 优化前
if (day == Day.MONDAY) {// 处理星期一的逻辑
} else if (day == Day.TUESDAY) {// 处理星期二的逻辑
} else if (day == Day.WEDNESDAY) {// 处理星期三的逻辑
} else if (day == Day.THURSDAY) {// 处理星期四的逻辑
} else if (day == Day.FRIDAY) {// 处理星期五的逻辑
} else if (day == Day.SATURDAY) {// 处理星期六的逻辑
} else if (day == Day.SUNDAY) {// 处理星期日的逻辑
} else {// 处理其他情况
}
  • 优化后
// 使用 switch 处理枚举类型
switch (day) {case MONDAY:// 处理星期一的逻辑break;case TUESDAY:// 处理星期二的逻辑break;// ...default:// 处理其他情况break;
}

策略模式 + 简单工厂模式

  • 前面我们介绍一些常规、比较简单的优化方法,但是在一些更加复杂的场景(比如多渠道对接、多方案实现等)我们可以结合一些场景的设计模式来实现让我们的代码更加优雅和可维护性,比如策略模式 + 简单工厂模式。

  • 优化前

    public static void main(String[] args) {// 比如我们商场有多个通知渠道// 我们需要根据不同的条件使用不同的通知渠道if ("满足条件A") {// 构建渠道A// 通知} else if ("满足条件B") {// 构建渠道B// 通知} else {// 构建渠道C// 通知}}
// 上面的代码不仅维护起来麻烦同时可读性也比较差,我们可以使用策略模式 + 简单工厂模式
  • 优化后
import java.util.HashMap;
import java.util.Map;// 定义通知渠道接口
interface NotificationChannel {void notifyUser(String message);
}// 实现具体的通知渠道A
class ChannelA implements NotificationChannel {@Overridepublic void notifyUser(String message) {System.out.println("通过渠道A发送通知:" + message);}
}// 实现具体的通知渠道B
class ChannelB implements NotificationChannel {@Overridepublic void notifyUser(String message) {System.out.println("通过渠道B发送通知:" + message);}
}// 实现具体的通知渠道C
class ChannelC implements NotificationChannel {@Overridepublic void notifyUser(String message) {System.out.println("通过渠道C发送通知:" + message);}
}// 通知渠道工厂
class NotificationChannelFactory {private static final Map<String, Class<? extends NotificationChannel>> channelMap = new HashMap<>();static {channelMap.put("A", ChannelA.class);channelMap.put("B", ChannelB.class);channelMap.put("C", ChannelC.class);}public static NotificationChannel createChannel(String channelType) {try {Class<? extends NotificationChannel> channelClass = channelMap.get(channelType);if (channelClass == null) {throw new IllegalArgumentException("不支持的通知渠道类型");}return channelClass.getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException("无法创建通知渠道", e);}}
}// 客户端代码
public class NotificationClient {public static void main(String[] args) {// 根据条件选择通知渠道类型String channelType = "A";// 使用简单工厂创建通知渠道NotificationChannel channel = NotificationChannelFactory.createChannel(channelType);// 执行通知channel.notifyUser("这是一条通知消息");}
}
  • 有时候我们还可以借助 Spring IOC 能力的自动实现策略类的导入,然后使用 getBean() 方法获取对应的策略类实例,可以根据我们的实际情况灵活选择。

如何优化开头的代码

  • 好了现在回到开头,如果是你会进行怎么优化,下面是我交出的答卷,大家也可以在评论区发表自己的看法,欢迎一起交流:
   public static void main(String[] args) {// do somethingif (isMeetCondition()) {// 查询配置// 此处查询配置的值需要在具体的任务中使用,所有并没抽离if ("配置是否开启") {// do something}}// do something}/*** 判断是否满足执行条件*/private static boolean isMeetCondition() {if (!"满足条件A") {return false;}// 查询权限return "是否具备权限A" && "是否具备权限B";}

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

这篇关于防御性编程失败,我开始优化我写的多重 if-else 代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/575194

相关文章

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum