xml中else if写法_面试官:优化代码中大量的if/else,你有什么方案?
一个快速迭代的项目,时间久了之后,代码中可能会充斥着大量的if/else,嵌套6、7层,一个函数几百行,简!直!看!死!人!
![](/assets/blank.gif)
这个无限循环嵌套,只是总循环的一部分。。。我已经绕晕在黄桷湾立交
仔细数了数,一共有 11 层的嵌套!!!接手这种项目的同学,内心应该是绝望的。
![](/assets/blank.gif)
出现这种情况的原因很多
- 设计不够完善
- 需求考虑不完全
- 开发人员变动
但最为致命的是“懒”
![](/assets/blank.gif)
你懒,我也懒,前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。
![](/assets/blank.gif)
当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅的优化掉这些多余的if/else?
1. 提前return
这是判断条件取反的做法,代码在逻辑表达上会更清晰,看下面代码:
![](/assets/blank.gif)
其实,每次看到上面这种代码,我都心里抓痒,完全可以先判断 !condition,干掉else。
![](/assets/blank.gif)
2. 策略模式
有这么一种场景,根据不同的参数走不同的逻辑,其实这种场景很常见。
最一般的实现:
![](/assets/blank.gif)
看上面代码,有4种策略,有两种优化方案。
2.1 多态
![](/assets/blank.gif)
具体策略对象存放在一个Map中,优化后的实现
![](/assets/blank.gif)
上面这种优化方案有一个弊端,为了能够快速拿到对应的策略实现,需要map对象来保存策略,当添加一个新策略的时候,还需要手动添加到map中,容易被忽略。
2.2 枚举
发现很多同学不知道在枚举中可以定义方法,这里定义一个表示状态的枚举,另外可以实现一个run方法。
![](/assets/blank.gif)
重新定义策略枚举
![](/assets/blank.gif)
通过枚举优化之后的代码如下
![](/assets/blank.gif)
3. 学会使用 Optional
Optional主要用于非空判断,由于是jdk8新特性,所以使用的不是特别多,但是用起来真的爽。
使用之前:
![](/assets/blank.gif)
如果登录用户为空,执行action1,否则执行action 2,使用Optional优化之后,让非空校验更加优雅,间接的减少if操作
![](/assets/blank.gif)
4. 数组小技巧
来自google解释,这是一种编程模式,叫做表驱动法,本质是从表里查询信息来代替逻辑语句,比如有这么一个场景,通过月份来获取当月的天数,仅作为案例演示,数据并不严谨。
一般的实现:
![](/assets/blank.gif)
优化后的代码
![](/assets/blank.gif)
结束
if else作为每种编程语言都不可或缺的条件语句,在编程时会大量的用到。一般建议嵌套不要超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。
我目前是在职Java开发,如果你现在正在了解Java技术,想要学好Java,渴望成为一名Java开发工程师,在入门学习Java的过程当中缺乏基础的入门视频教程,你可以关注并私信我:01。我这里有一套最新的Java基础JavaSE的精讲视频教程,这套视频教程是我在年初的时候,根据市场技术栈需求录制的,非常的系统完整。
xml中else if写法_面试官:优化代码中大量的if/else,你有什么方案?相关推荐
- informix中if else使用_面试官:代码中出现大量的if/else,需要优化,你有什么好方案?...
每晚10点,捕获技术思考和创业资源洞察.分享职场生活.职场攻略.领导同事相处技巧和创业资源 文|洪生鹏 本文旨在抛砖引玉,具体实施方案需要自己在实践中动手去尝试,不断尝试,不断改进调优. if els ...
- java中二进制怎么说_面试:说说Java中的 volatile 关键词?
volatile 这个关键字可能很多朋友都听说过,或许也都用过.在 Java 5 之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 Java 5之后,volatile 关 ...
- python快速排序最简单写法_面试官:来,这位精神小伙,简简单单写个快速排序吧...
当你的才华还撑不起你的野心时,你应该静下心去学习 . 面试现场,终于到了紧张刺激的手撕代码环节,你忐忑的心情随着考官的一句话归于平静. 你简直不敢相信眼前这个穿着格子衬衫,牛仔裤角有些发白,头发在风中 ...
- 如何在代码中让按钮高亮_如何在C代码中插入移位寄存器
上期内容:AI Engine到底是什么? 众所周知,标准C或C++代码是没有HDL代码的并行性和时序性的,那么如何在C代码中插入寄存器呢?Vivado HLS提供了IP库,这些IP库使得HLS可直接从 ...
- mybatis的简单查询用语句吗_面试官:Mybatis中的TypeHandler你用过吗?
前言 相信大家用Mybatis这个框架至少一年以上了吧,有没有思考过这样一个问题:数据库有自己的数据类型,Java有自己的数据类型,那么Mybatis是如何把数据库中的类型和Java的数据类型对应的呢 ...
- 线程池拒绝策略 开发中常用什么策略_面试官:说说你知道多少种线程池拒绝策略...
往期文章 为什么阿里Java规约要求谨慎使用SimpleDateFormathttps://www.toutiao.com/i6696127929048367629/ 为什么我强烈推荐你用枚举来实现单 ...
- mysql读数据为什么快_面试官:Mysql 中主库跑太快,从库追不上怎么整?
图注:思维导图 主从常见架构 随着日益增长的访问量,单台数据库的应接能力已经捉襟见肘.因此采用主库写数据,从库读数据这种将读写分离开的主从架构便随之衍生了出来. 在生产环境中,常见的主从架构有很多种, ...
- 面试官:说说Innodb中LRU怎么做的?
引言 某日,小编去面试(纯属瞎编),有了如下对话 面试官:"懂mysql吧,知道CPU在读硬盘上数据的时候,是怎么解决CPU和硬盘速度不一致问题么?"我:"懂啊,mysq ...
- 【Redis系列】面试官:Redis中的数据已经过期,为什么还占用这内存?
如果有面试官问Redis中的数据已经过期为什么还占用这内存? 它是因为Redis本身的过期策略和缓存淘汰机制所导致的. 说说Redis的过期策略和缓存淘汰机制 先来说说Redis的过期策略,Redis ...
最新文章
- 好久没有处理过故障了
- 【php内核与扩展开发系列】PHP生命周期---启动、终止与模式
- python token 访问控制_python 产生token及token验证
- [转载MSDN]IIS 7.0中的Live Smooth Streaming -入门
- 深度学习(08)-- Residual Network (ResNet)
- 大数据之Spark教程
- python tab补全
- Git--生成公钥和私钥并添加gitlab访问权限
- matlab 计算图像的基本参数
- 【内外网映射】通过外网ip来访问虚拟机服务器【转载】
- 批量删除2012年9月份以前的表
- 华为云HCIE认证有多难?考试内容是什么?
- (白光LED显色性)计算白光LED的显色指数(CRI)数据异常,色质指数CQS来替代
- android中menu重写哪些方法,在Android中Menu的使用
- 什么是Windows驱动程序?
- 【程序员的自我修养】[动态图文] 超详解函数栈帧
- const T vs. T const ——Dan Saks 【翻译】
- 30分钟java桌球小游戏,30分钟完成桌球小游戏项目
- Labview2018视频教程(共51节)
- 零信任时代,企业如何提升自身安全?
热门文章
- java long short_Java Long类shortValue()方法与示例
- mysql replication health is not ok_mysql配置mha高可用防火墙未关闭报错
- excel取整函数_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
- 如何用matlab分析代谢,代谢流分析工具-CellNetAnalyzer
- 二级缓存使用步骤_Mybatis的一级缓存和二级缓存的理解以及用法
- Java 设计模式之 Composite 组合模式
- html5 人脸,HTML5 可拖拉的人*皮(人脸)面具
- c语言二维数组总成绩,c语言5个人3科成绩总分和平均分,用二维数组
- new file会创建文件吗_Python处理文件—os模块
- 使用no-gui 模式执行分布式测试