else的三种用法(else的用法与位置)

前言在产品快速迭代的中,由于追求开发速度,我们往往忽略代码的可读性与扩展性,不合理的使用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(\'请输入正确的姓名\')
}}

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

else的三种用法(else的用法与位置)

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

  • 单个if语句优化
  • if/else语句优化
  • 单个if多条件优化
  • 多个else if分支优化

else的三种用法(else的用法与位置)

单个if语句优化

优化前

if (flag) {
this.handleFn
}

优化后

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

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

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

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

else的三种用法(else的用法与位置)

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 =
if(age >= 18){
allow = \'通过\';
} else {
allow = \'拒绝\';
}// 优化后let allow = age >= 18 ? \'通过\' : \'拒绝\'

示例二

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

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

else的三种用法(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的三种用法(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的代码将变得越来越肿。

else的三种用法(else的用法与位置)

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

switch

switch(val){
case \'A\':
handleA
break
case \'B\':
handleB
break
case \'C\':
handleC
break
case \'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的三种用法(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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/29958.html

(0)
nan
上一篇 2021-09-26
下一篇 2021-09-26

相关推荐

  • 不吃晚饭跑步的危害(吃饭后多久可以跑步)

    很多跑者喜欢在饭后休息不久就去跑步,这样往往会导致肠胃不适甚至有碍身体健康。吃完饭,人体的血液等都会集中到消化系统全力进行消化,此时马上进行运动,就会使血液分流,影响消化。另外一方面,吃完饭食物尚在胃中,跑步会对身体带来一定的跳跃,会使刚刚摄入不久的食物在肠胃中震荡,摇晃。跑起来也会有不适感。小米…

    2021-10-10
    0
  • 女子嗜睡20余天醒后智商如低幼(女子昏睡20余天后智商变成幼童)

    在人达到一定的疲惫程度时会变得十分嗜睡,但一般睡一天便可以恢复精神。近日,有一名女子在嗜睡二十天醒来后发现竟然智商如低幼,这是怎么一回事?为什么这名女子在昏睡二十天后会像幼童一样?和久久派小编一起来看

    2022-02-24
    0
  • 深圳到昆明火车票多少钱(深圳车票多少钱)

    去过的人,都告诉我“大理,是一生一定要去一次的地方。”“上关花、下关风、苍山雪、洱海月”这就是大理的“风花雪月”你会不会偶尔对生活疲倦?不如一路向西去大理一起观苍山洱海,一起劈柴喂马达姐发现,从深圳坐火车一路向西从深圳到昆明206块,昆明转车到大理1…

    2022-01-15 随笔
    0
  • 阿里云企业邮箱收费标准(云企业邮箱是什么)

    现在比较热点的就是企业数字化转型,很多企业在使用“上云”服务的时候,都会有很多担心。例如,企业与客户之间很多是通过邮件来沟通的,那么将企业邮件放在云端安全吗?所以在‘上云’之前都会考虑很多。该选择什么样的邮箱服务呢?其实,将邮件服务放在云端,不仅可以

    2021-09-26
    0
  • 为什么脸上的湿疹总是反复(脸上为什么会长湿疹)

    【湿疹为什么会反复发作?】很多人患上湿疹后满不在乎,心想:湿疹嘛,小小皮肤病,该用药用药,过几天就好,没啥大不了的。直到湿疹反反复复发作,好了没几天又卷土重来,他们才意识到麻烦大了。那么,湿疹到底为什…

    2022-02-09
    0
  • 关于头字的成语分享(头字开头的成语)

    头□□□头头是道头角峥嵘头破血流头晕目眩头重脚轻头昏脑涨□头□□头头是道白头偕老抱头痛哭抱头鼠窜千头万绪垂头丧气回头是岸交头接耳迎头赶上肥头胖耳三头六臂当头棒喝评头品足獐头鼠目晕头转向源头活水焦头

    2021-12-13
    0

发表回复

登录后才能评论