您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2021-08-26 10:28:30  来源:CSDN  作者:星野

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

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

 

前言

在产品快速迭代的中,由于追求开发速度,我们往往忽略代码的可读性与扩展性,不合理的使用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-else场景,希望对大家有所帮助。

  • 单个if语句优化

  • if/else语句优化

  • 单个if多条件优化

  • 多个else if分支优化

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

 

单个if语句优化

优化前

if (flag) {
this.handleFn
}

优化后

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

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

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

if (!(staffInfo.patientName && staffInfo.phone)) {
// doSomething
}
...
if (!(staffInfo.phone && staffInfo.idCardNum)) {
// doSomething
}
代码中大量的if/else,你有什么优化方案?
if(!(staffInfo.patientName && staffInfo.phone) || !(staffInfo.phone && staffInfo.idCardNum)){
// doSomething
}
代码中大量的if/else,你有什么优化方案?

 

if/else语句优化

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

  • 排非策略

  • 三元运算符

 

排非策略

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

优化前

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

优化后

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

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

 

三元运算符

示例一

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

示例二

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

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

代码中大量的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("该文件为图片")
}}
代码中大量的if/else,你有什么优化方案?

 

多个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的代码将变得越来越肿。

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

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

 

switch

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

看一下逻辑绘制为流程图

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

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}

流程图:

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

这种方式消除了所有条件语句,并使用键值对象存储条件和操作之间的关系。当我们需要根据条件执行代码时,我们不再需要使用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



Tags:优化方案   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
说起 WordPress 优化加速来可以说是个经久不衰的话题了,包括明月自己都撰写发表了不少相关的文章。基本上到现在为止明月的 WordPress 优化方案已经固定成型了,那就是 WP Supe...【详细内容】
2021-11-02  Tags: 优化方案  点击:(49)  评论:(0)  加入收藏
在产品快速迭代的中,由于追求开发速度,我们往往忽略代码的可读性与扩展性,不合理的使用if-else条件判断会使我们的程序复杂度大大提升,同时也会使代码的可读性急速下降,后期维护难度也大大提高,真的让人脑壳疼。比如下方示...【详细内容】
2021-08-26  Tags: 优化方案  点击:(64)  评论:(0)  加入收藏
网站关键词优化方案如何写?主要是看平台(网站),像淘宝、新浪、搜狐、凤凰网等这类大型平台(这种大型综合性的网站,我们一般称平台),网站关键词优化方案写起来不简单,不但要对SEO知识...【详细内容】
2020-12-25  Tags: 优化方案  点击:(163)  评论:(0)  加入收藏
我们都知道,配置相同的笔记本,其性能可以发挥几何,主要受制于其散热模块的设计,以及厂商在BIOS层面设定的功耗墙和温度墙阈值。但想让一款笔记本“满血”运行,想办法提升散热效率...【详细内容】
2020-10-27  Tags: 优化方案  点击:(136)  评论:(0)  加入收藏
在MySQL中经常会去优化查询,其目的是找到一种更快,效率更高的一种方式去获取查询结果。一般情况下是通过优化SQL语句来提高效率,例如增加索引,使用需要的字段代替”*“号等。还...【详细内容】
2020-06-28  Tags: 优化方案  点击:(51)  评论:(0)  加入收藏
单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是...【详细内容】
2020-04-17  Tags: 优化方案  点击:(73)  评论:(0)  加入收藏
​转载本文需注明出处:微信公众号EAWorld,违者必究。引言:在企业级应用实施和运营过程中,为了解决企业中部分业务场景访问量大、并发量高的问题,就需要对系统架构及应用参数做出...【详细内容】
2020-01-02  Tags: 优化方案  点击:(69)  评论:(0)  加入收藏
个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发、运维的复杂度会直线上升,而大多数公司是欠缺这种能力的。所以MySQL中几百万甚至小几千万的表,先考虑...【详细内容】
2019-08-26  Tags: 优化方案  点击:(907)  评论:(0)  加入收藏
案例由于业务的需要,需求方需要实现一个大量图片同时加载的需求。在实现这个需求的过程中,可能会遇到很多的坑,这里小编也总结了一些优化方案,我们可以一起来看看。具体场景在...【详细内容】
2019-07-01  Tags: 优化方案  点击:(515)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条