作者 | 星野丶      责编 | 欧阳姝黎

前言

在产品快速迭代的中,由于追求开发速度,我们往往忽略代码的可读性与扩展性,不合理的使用if-else条件判断会使我们的程序复杂度大大提升,同时也会使代码的可读性急速下降,后期维护难度也大大提高,真的让人脑壳疼。比如下方示例:

// 贷款申请操作的处理
function check() {// 是否输入正确用户名if (this.checkUsername(this.username)) {// 是否输入正确身份证号if (this.checkIdCard(this.idCard)) {// 请输入正确的电话号码if (this.checkTel(this.tel)) {// 担保人是本人if (this.dbr === '担保人是本人') {// 是否存在身份证正面if (document.querySelector('.sfzzm img')) {console.log('存在身份证正面')// 是否存在身份证反面if (document.querySelector('.sfzfm img')) {console.log('存在身份证反面')// 是否存在学历证书if (document.querySelector('.xlzs img')) {console.log('存在学历证书')if (this.ydxy) {this.tijiaoIsShow = false}} else {Toast('请上传学历证书')this.tijiaoIsShow = true}} else {Toast('请上传身份证反面') }} else {Toast('请上传身份证正面')}} else if (this.dbr == '担保人不是本人') {if (this.checkUsername(this.dbrname)) {if (this.checkIdCard(this.dbridCard)) {if (this.checkTel(this.dbrzyzh)) {if (document.querySelector('.sfzzm img')) {console.log('存在身份证正面')if (document.querySelector('.sfzfm img')) {console.log('存在身份证反面')if (document.querySelector('.xlzs img')) {console.log('存在学历证书')this.tijiaoIsShow = false} else {Toast('请上传学历证书')}} else {Toast('请上传身份证反面')}} else {Toast('请上传身份证正面')}} else {Toast('请输入担保人展业证号')}} else {Toast('请输入担保人身份证号')}} else {Toast('请输入担保人姓名')}} else {Toast('请选择担保人是否为本人')}} else {Toast('请输入正确的电话号码')}} else {Toast('请输入正确的身份证号')}} else {Toast('请输入正确的姓名')}
}

如果你接手这样一段代码,相信大家和我的心情是一样的:

本文归纳以下几种优化if-else场景,希望对大家有所帮助。

  • 单个if语句优化

  • if/else语句优化

  • 单个if多条件优化

  • 多个else if分支优化

单个if语句优化

优化前

if (flag) {this.handleFn()
}

优化后

flag && this.handleFn()
// handleFn是普通函数

这种写法就比较清晰,简洁,好读!

另外如果遇到有很多的if语句,但是执行的功能函数却是一致的情况,我们可以用”逻辑与“或者”逻辑或“来把他们合并成一个表达式。如果我们这些彼此独立的条件判断可以被视为同一次检查的场景时,一次检查的意图明显在可读性上优于多次的条件检查。我们来看一段代码片段:

if (!(staffInfo.patientName && staffInfo.phone)) {// doSomething
}
...
if (!(staffInfo.phone && staffInfo.idCardNum)) {// doSomething
}

我们可以通过合并逻辑,将上面代码修改为如下:

if(!(staffInfo.patientName && staffInfo.phone) || !(staffInfo.phone && staffInfo.idCardNum)){// doSomething
}

if/else语句优化

if/else可以说在项目中遇到频率是最高,通常可以这两种策略优化

  • 排非策略

  • 三元运算符

排非策略

比如用户登录场景,如果用户名和密码输入框为空,那么我们就提示用户”用户名和密码不能为空”;如果有值,就执行登录的操作。

优化前

    if (user && password) {// 逻辑处理} else {throw('用户名和密码不能为空!')}

优化后

if (!user || !password) return throw('用户名和密码不能为空!')
// 逻辑处理

表单提交时,需要提前排除那些提交不规范的内容,通常情况下,表单提交遇到不符合我们要求大于我们提交成功的情形,排非策略是个很不错的选择。

三元运算符

示例一

let allow = null
if(age >= 18){ allow = '通过';
} else { allow = '拒绝';
}// 优化后
let allow = age >= 18 ? '通过' : '拒绝'

示例二

if (flag) {success();
} else {fail();
}//优化后
flag ? success() : fail();

三元运算符相比if/else来说,只需一行语句,代码简练精炼。

单个if多条件优化

优化前

function test(type) {if (type === 'jpg' || type === 'png' || type === 'gif' || type === 'svg') {console.log("该文件为图片");}
}

优化后

function test(type) {const imgArr = ['jpg', 'png', 'gif', 'svg']if (imgArr.includes(type)) {console.log("该文件为图片")}
}

多个else if分支优化

多个else if通常是一个糟糕的选择,它导致设计复杂,代码可读性差,并且可能导致重构困难。

if (this.type === 'A') {this.handleA();
} else if (this.type === 'B') {this.handleB();
} else if (this.type === 'C') {this.handleC();
} else if (this.type === 'D') {this.handleD();
} else {this.handleE();
}

我们经常遇到多个else if条件判断代码,随着逻辑复杂性的增加,else if的代码将变得越来越肿。

看一下逻辑绘制为流程图从上面的流程图可以看出,不同条件分支的代码具有很高的耦合度。先前的条件判断将影响后续的代码流,并且此类代码在后续开发中难以维护。我们可以通过switch、key-value和Map来优化代码。

switch

  switch(val){case 'A':handleA()breakcase 'B':handleB()breakcase 'C':handleC()breakcase 'D':handleD()break}

看一下逻辑绘制为流程图

switch

流程图显然更简单。而且,不同的条件分支之间没有嵌套,并且它们彼此独立。逻辑很清楚。

key-value

虽然switch语句在逻辑上确实比else if语句简单,但是代码本身也有点多。

其实我们对象枚举,将条件与特定操作相关联的键值。

let enums = {'A': handleA,'B': handleB,'C': handleC,'D': handleD,'E': handleE
}
function action(val){let handleType = enums[val]handleType()
}

流程图:

这种方式消除了所有条件语句,并使用键值对象存储条件和操作之间的关系。当我们需要根据条件执行代码时,我们不再需要使用else if或switch语句来处理相应的动作,我们只需从中提取相应的函数handleType并执行它即可。

Map

实际上我们还可以通过Map来进一步的优化我们的代码。

对比Object的话,Map具有许多优点

  • 对象的键只能是字符串或符号,而Map的键可以是任何类型的值。

  • 我们可以使用Map size属性轻松获取Map的键/值对的数量,而对象的键/值对的数量只能手动确定。

  • 具有极快的查找速度。

上面的例子可以优化如下:

let enums = new Map([['A', handleA],['B', handleB],['C', handleC],['D', handleD],['E', handleE]
])function action(val){let handleType = enums(val)handleType()
}

如果我们遇到多层复杂条件,Map语句优势就更明显了!

if (mode == 'kline') {if (this.type === 'A') {this.handleA()} else if (this.type === 'B') {this.handleB()} else if (this.type === 'C') {this.handleC()} else if (this.type === 'D') {this.handleD()}
} else if ((mode = 'depth')) {if (this.type === 'A') {this.handleA()} else if (this.type === 'B') {this.handleB()} else if (this.type === 'C') {this.handleC()} else if (this.type === 'D') {this.handleD()}
}

对于上述如此复杂的场景,是否可以通过Map来进行优化?

其实我们只需要将不同的判断语句连接成一个字符串,以便我们可以将条件和操作以键值格式关联在一起。

let enums = new Map([['kline_A', handleKlineA],['kline_B', handleKlineB],['kline_C', handleKlineC],['kline_D', handleKlineD],['kline_E', handleKlineE],['depth_A', handleDepthA],['depth_B', handleDepthB],['depth_C', handleDepthC],
])function action(mode, type){let key = `${mode}_${type}`let handleType = enums(key)handleType()
}

瞬间简单明了很多,有木有~~~

参考文章

  • if-else重构优化

  • if-else逻辑判断优化

  • How to Use if-else

  • Javascript条件语句优化策略

  • 深入浅出代码优化﹣if/else

生于2001年的《程序员》曾陪伴了无数开发者成长,影响了一代又一代的中国技术人。时隔20年,《新程序员》带着全球技术大师深邃思考、优秀开发者技术创造等深度内容回来了!同时将全方位为所有开发者呈现国内外核心技术生态体系全景图。扫描下方小程序码即可立即订阅!

代码中大量的if/else,你有什么优化方案?相关推荐

  1. xml中else if写法_面试官:优化代码中大量的if/else,你有什么方案?

    一个快速迭代的项目,时间久了之后,代码中可能会充斥着大量的if/else,嵌套6.7层,一个函数几百行,简!直!看!死!人! 这个无限循环嵌套,只是总循环的一部分...我已经绕晕在黄桷湾立交 仔细数了 ...

  2. informix中if else使用_面试官:代码中出现大量的if/else,需要优化,你有什么好方案?...

    每晚10点,捕获技术思考和创业资源洞察.分享职场生活.职场攻略.领导同事相处技巧和创业资源 文|洪生鹏 本文旨在抛砖引玉,具体实施方案需要自己在实践中动手去尝试,不断尝试,不断改进调优. if els ...

  3. 轨迹系列8——记某真实项目中轨迹展示查询效率优化方案一(初步设计)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.    背景 准确说,该项目的迹展示涉及到两个方面,一个是轨迹查询展 ...

  4. CUDA中并行规约(Parallel Reduction)的优化

    Parallel Reduction是NVIDIA-CUDA自带的例子,也几乎是所有CUDA学习者的的必看算法.在这个算法的优化中,Mark Harris为我们实现了7种不同的优化版本,将Bandwi ...

  5. js获取html代码中所有图片地址

    /** * JS获取html代码中所有的图片地址 * @param htmlstr * @returns imgsrcArr 数组 */ function getimgsrc(htmlstr) { v ...

  6. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  7. 如何解决代码中if…else 过多的问题

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  8. 不要依赖代码中的异常

    因为异常大大地降低性能,所以您不应该将它们用作控制正常程序流程的方式.如果有可能检测到代码中可能导致异常的状态,请执行这种操作.不要在处理该状态之前捕获异常本身.常见的方案包括:检查 null,分配给 ...

  9. 在后台代码中引入XAML的方法

    本文将介绍三种方法用于在后台代码中动态加载XAML,其中有两种方法是加载已存在的XAML文件,一种方法是将包含XAML代码的字符串转换为WPF的对象. 这些是我在编写RegeX时获得的经验,它们将会给 ...

  10. php代码中使用换行及(\n或\r\n和br)的应用

    浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;假设须要将结果输出到浏览器或打印到显示器,代码中使用br;假设仅仅是在源码中换行.则使用\n或\r\n,感兴趣的朋友能够了解下,也 ...

最新文章

  1. 通俗篇:一文搞定矩阵相关概念及意义
  2. hive 创建/删除/截断 表(翻译自Hive wiki)
  3. 如何用模型分析中国经济?
  4. .Net Core下通过Proxy 模式 使用 WCF
  5. linux 重定向 不换行,Ada:重定向到stdout时省略换行符(测试Put)
  6. MusicXML 3.0 (20) - 钢琴踏板
  7. java并发AtomicReference
  8. tuxedo 强制重启
  9. rs232接口_USB转RS232接口9针串口线,工控数据转接线驱动安装方法
  10. RabbitMQ基础知识
  11. CAN总线控制器配置说明
  12. mysql查询名字叫小明的_MySQL(命令和查询语句)
  13. English - therefore,so,hence,then,accordingly,thus用法解析
  14. 多读书,更要多多悦读
  15. PLC控制技术与组态技术实训装置
  16. typora脚注的快捷键
  17. python网络编程 赵宏_2018年Python爱好者社区历史文章合集(作者篇)
  18. 产品经理知识体系学习与实践指南
  19. 进销存到底是什么意思?进销存软件有什么作用?
  20. 基于51单片机驱动A4988实现步进电机逆时针转动

热门文章

  1. ROS学习笔记一:安装配置ROS环境
  2. VMware中linux访问共享文件夹设置流程
  3. 敏捷开发中提高软件生产率的方法
  4. 【lucene】高级搜索篇
  5. 尝试笔记 01 之 CSS 边角上的标签
  6. layui 日期插件onchange事件失效的方法
  7. imToken 测评通关攻略
  8. Spring配置 context:component-scan/ mvc:annotation-driven /
  9. codeforce474D_组合
  10. Usaco_1_3_Calf Flac