背景

由于目前工作岗位的原因,项目还是09年建立的,历史遗留问题也比较多,加上开发规范并不是很完善,项目中有的单个方法达到成百上千行,if-else更是连续写十几个也不累。

作为强迫症真的受不了,另一方面,代码的可读性以及可扩展性大大降低。在接下来的文章中,将结合不同的场景介绍几种优化if-else的常见方案。


一、巧用三目运算符

这种场景很常见,在开发过程中,碰到if-else的时候,可以想一下,是不是可以用三目运算符来替换?当然可以,不然我写文章干嘛,哈哈哈

  1. //优化前
  2. public static void before(boolean condition){
  3. int temp;
  4. if (condition) {
  5. temp = 1;![file](https://img2020.cnblogs.com/other/2120441/202011/2120441-20201124205042187-859391812.png)
  6. } else{
  7. temp = 2;
  8. }
  9. System.out.println(temp);
  10. }
  11. //优化后
  12. public static void after(boolean condition){
  13. int temp = condition ? 1 : 2;
  14. System.out.println(temp);
  15. }

二、把你学的枚举用起来

使用枚举类,完成对不同分支的逻辑判断,通过枚举便于集中管理逻辑条件,维护起来也更得心应手。代码如下:

  1. //优化前
  2. public static void before(String code) {
  3. String msg = null;
  4. if ("00001".equals(code)) {
  5. msg = "缓存数据不能为空";
  6. } else if ("00002".equals(code)) {
  7. msg = "数据格式异常";
  8. }
  9. System.out.println(msg);
  10. }
  11. //优化后
  12. public enum CacheEnums {
  13. CACHE_DATA_IS_NULL("00001", "缓存数据不能为空"),
  14. DATA_FORMATE_EXCEPTION("00002", "数据格式异常");
  15. private String code;
  16. private String msg;

  17. CacheEnums(String code, String msg) {
  18. this.code = code;
  19. this.msg = msg;
  20. }

  21. public String getCode() {
  22. return code;
  23. }

  24. public void setCode(String code) {
  25. this.code = code;
  26. }

  27. public String getMsg() {
  28. return msg;
  29. }

  30. public void setMsg(String msg) {
  31. this.msg = msg;
  32. }

  33. public static CacheEnums of(String code){
  34. for (CacheEnums temp : CacheEnums.values()) {
  35. if (temp.getCode().equals(code)) {
  36. return temp;
  37. }
  38. }
  39. return null;
  40. }
  41. }

优化后的代码,在想获取msg时,一句话搞定,再也不用写一堆if-else了

  1. //优化后
  2. public static void after(String code) {
  3. String msg = CacheEnums.of(code).getCode();
  4. System.out.println(msg);
  5. }

三、忘记你学的else(合理分析基础上)

在业务逻辑开发过程中,经常会写一些方法,会校验参数合法性,以及是否符合业务逻辑等检查,一旦不合条件,就会进行return或者是抛异常。有些同学的写法:

  1. //优化前
  2. public static int before(boolean condition1,boolean condition2) {
  3. if (!condition1){
  4. return 0;
  5. }else if (condition2){
  6. return 1;
  7. }else{
  8. return 99;
  9. }
  10. }
  11. //优化后
  12. public static int after(boolean condition1,boolean condition2) {
  13. if (condition1){
  14. return 0;
  15. }
  16. if (condition2){
  17. return 1;
  18. }
  19. return 99;
  20. }

四、策略模式

能够用的上策略模式的场景相对就更加特殊一些了,举个常见的例子,一个超市收银系统中的结算模块中会有很多种结算方式:双十一打折活动、满减活动、会员积分兑换消费券等等。他们都属于结算业务,那么就可以通过策略模式,设计不同的结算方式,达到解耦合和易扩展的目的。

接下来的代码以我项目中实际开发中用到的例子来说明,本次改造点是:在原有发送请求的的方法中增加将消息转发到其他平台的功能。考虑到以后可能会增加更多的平台,因此,这里采用策略模式,方便未来的功能扩展。以下为简版策略模式:

  1. /**
  2. * Description:顶层接口类
  3. */
  4. public interface Route {

  5. //定义处理方法
  6. void handler(Object object);
  7. }
  8. /**
  9. * Description:上下文信息
  10. */
  11. public class RouteContext {

  12. //策略模式的顶层接口
  13. private Route route;

  14. public RouteContext(Route route) {
  15. this.route = route;
  16. this.init();
  17. }

  18. //调用具体的策略中handler方法
  19. public void handler(Route route, Object object) {
  20. this.route = route;
  21. route.handler(object);
  22. }

  23. public void init() {
  24. //做一些数据的初始化
  25. }
  26. }
  27. /**
  28. * Description:策略一
  29. */
  30. public class MQType implements Route{
  31. @Override
  32. public void handler(Object object) {
  33. //这里是业务逻辑
  34. }
  35. }
  36. /**
  37. * Description:策略二
  38. */
  39. public class OtherType implements Route{
  40. @Override
  41. public void handler(Object object) {
  42. //这里是业务逻辑
  43. }
  44. }

搞定,这样就能够实现不同业务逻辑对应不同的实现类,再也不用一大坨代码揉在一块了,每一种路由方式都可以独立维护且易扩展,调用方也是无感知的。

更多文章请扫码关注或微信搜索Java栈点公众号!

更多文章请扫码关注或微信搜索Java栈点公众号!

消灭又臭又长的if-else的更多相关文章

  1. 怎么摆脱又臭又长的 Git 命令?

    在使用 Git 的时候,虽然大部分时候我们用的是图形客户端,但图形客户端不能解决所有的操作,所以,也少不了要需要使用命令行的时候. 但有些 Git 命令和参数确实又不好记,甚至有的命令每次要用的时候需 ...

  2. dp-史上最戳最长最臭代码-hdu-4733-G(x)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4733 题目大意: 定义G(x)=x⊕(x>>1).给两个由0.1.?组成的长度相同的字符 ...

  3. 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...

    37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...

  4. 浅入 dancing links x(舞蹈链算法)

    abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...

  5. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  6. 120项改进:开源超级爬虫Hawk 2.0 重磅发布!

    沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...

  7. Linux 桌面美化那点事儿

    各个 Linux 桌面发行版刚拿到手的时候,或多或少都有点儿不满意,对它们进行一些改造是必须的.网上不乏各种 Linux 桌面美化的教程和经验贴,对我们这些 Linux 爱好者来说都是很好的参考资料. ...

  8. 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知

    前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...

  9. 细说 Form (表单)

    细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...

随机推荐

  1. Linux的外部命令的执行

    查看外部命令的路径 whereis 不但能显示出外部命令的路径还能显示出帮助文档 which -a |--skip-alias whereis

  2. ORA-12609报错分析

    问题:监控不断告警ORA-12609 Wed 10/14/2020 10:40 AM 12CRAC1-ALERT中出现ORA错误,请检查 171- nt OS err code: 0 172- Cli ...

  3. 【Flutter 1-2】在 Windows 10下安装Flutter+Dart+Android Studio 配置Flutter开发环境

    在 Windows 10下安装Flutter+Dart+Android Studio 配置Flutter开发环境 文章首发地址 配置环境变量 由于部分网站被墙的原因,我们需要先配置Flutter国内镜 ...

  4. cao 啥时候能系统地复习一下数据结构 我光学数学去了

    最近有功夫的话再敲敲数据结构复习复习

  5. Spring Boot打包部署

    date: 2018-11-19 15:30:11 updated: 2018-11-21 08:28:37 Spring Boot打包部署 第一种方式 打包成jar包部署在服务器上 1.1 添加插件 ...

  6. STM32入门系列-STM32时钟系统,时钟初始化配置函数

    在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...

  7. 在充电桩联网部署方案中4G DTU的优势是什么

    充电桩作为电动汽车充电生态链的一环,具有非常重要的作用,成都远向电子为电动车充电桩.充电站提供专业的无线通信组网产品与技术解决方案,协助充电桩厂家.充电桩运营商.商业充电服务商实现:充电桩设备工作状态 ...

  8. Learn day6 模块pickle\json\random\os\zipfile\面对对象(类的封装 操作 __init__)

    1.模块 1.1 pickle模块 # ### pickle 序列化模块 import pickle """ 序列化: 把不能够直接存储的数据变得可存储 反序列化: 把数 ...

  9. 80386学习(一) 80386CPU介绍

    一.80386CPU介绍 Inter80386CPU是Inter公司于1985年推出的第一款32位80x86系列的微处理器.80386的数据总线是32位的,其地址总线也是32位,因而最大可寻址4GB的 ...

  10. iOS开发 objective C 代码布局

    代码布局抛弃storyboard,用代码生成界面,它的优劣不谈 首先在项目设置中,更改应用的"入口" 不选main,清空它 然后在AppDelegate.m中,更改(添加内容),别 ...