为什么很多程序员不用switch,而是大量的ifelseif
我个人觉得switch其实非常多余。
1大部分场景,都是2到3个可能分支,用个ifelse就可以了,除非有4个以上分支,太多else显得不好看,才考虑用switch。
2switch限制多。switch必须是常量变量。if后面可以写任意表达式。
3用法复杂,case后面要么break,要么return,要是不写,居然还会继续执行剩下的分支,对于新手来说分分钟掉坑。
4写法上其实也不比ifelse优雅简洁,switchxxxcasexxxx。
所以,switch徒增复杂性,真的不怎么实用。
如果有10000种switch的可能性,有1000000个值需要被处理,怕是你们说的这些个switch的好处就完全消失了,预期平均每次要比较5000次,1000000个值,总计要比较50亿次,不知道你们的CPU是啥主频能扛得住这个计算量,针对这种情况的终极武器还是hash,根据不同的语言,hash的value可以是匿名函数,可以是接口的不同实现,用hash来快速确定处理算法,而不是switch
答案:主要因为switch不适合业务系统的实际复杂需求,业务不断的变更迭代,一更改需求,条件的复杂度高了,switch无力处理。
switch优点
那么什么时候适合switch,它的场景是:基于单一变量的值(如枚举),这样的可读性比if条件更清晰。
switch缺点
从上面的场景来看,实在太局限,我来简单说一下它的一些缺点吧:
1。现实的业务场景很复杂,条件不单一,一旦需求变更,维护代码相当崩溃。
2。switch经常忘记写break,估计很多人一不小心就忘记写了。如果你看过google的代码规范,你会发现,Google对switch的要求非常多。
switch的封装才更灵活
其实switch有人还在用也有一部分是历史原因,但是随着科技的发展,原有的设计以及落后了。
有些编程语言,如Python都没有switch这种语法。当然也有部分新语言Golang和Kotlin还是继承下来,但是又把switch包装了一下,去掉了令人误会的语法,这才让switch变得灵活起来了。如果不封装,很难用。
IF语句的好处
通过上面描述的缺点也就是if语句更灵活的地方,根据业务进行逻辑条件编写,可维护性高。同时只要写的代码质量高,可读性也就会更高。
建议
现实的业务实际是很复杂的,我也不建议一定要用大量的ifelseif,而是应该尽早返回来减少嵌套,这样增加了可读性以及降低维护的成本。
从CC来看,当分支较多且switch要比较的值是连续的话,执行速度远远远远快于if,因为switch是直接跳到目标代码执行的,而if则需要执行很多条语句,慢的不是一点点,一般编译器会根据分支数量和比较的值是否连续生成不同汇编代码,如果编译器判定不能提升速度的话,switch生成的汇编代码和if是一模一样的没有任何区别。
至于很多人不用switch我觉得可能是:
1。为了方便写代码,思维习惯随手就用if写了;
2。可能根本就不懂为什么要用switch吧。
作为程序员来说,我更喜欢switch的结构,更直观更容易找到相应的代码块。不过为什么很多程序员不用Switch,而是使用大量的if。。。elseif的结构,甚至像Python已经不支持原生Switch语法了?
这个原因很简单,因为switch语法结构最后编译还是通过if。。。elseif来完成代码的,所以从效率角度来说和if。。。elseif一样的。但是switch对比条件比较单一,绝大多数支持switch的编程语言都支持等于比较,也就是说变量只能等于case中的条件才会执行代码块。但是现实情况中,对比条件绝大多数比单一等于运算要复杂得多,因此很多程序员就直接使用if。。。elseif。但是if。。。elseif的结构,后期维护起来会比较不清晰,毕竟没有Case。。。Break那么直观。但是添加一些注解应该还是能解决这个问题的。
所以,我现在能使用Switch的时候还是会使用switch,毕竟后期代码维护起来方便点。不过更多时候还是用if。。。elseif。
送大家以下java学习资料
我曾经接手过一份代码,遇到过一个三十几个ifelse套ifelse的模块。
心理骂骂咧咧谁他喵写的这玩意,然后开始review历史。
大致情况是这样的:第一个程序员写下这段代码时,只有两个ifelse;后来开始逐渐加需求,先是一个、两个,随后量变引起质变,于是逻辑分支快速扩张。
这个时候已经没有人愿意去重构成switch或是其他什么设计模式了,毕竟复杂度摆在那里,万一崩了还得背锅。
三四个程序员接手这段代码之后,就变成我现在这种局面了。
第一个程序员绝对没有料到这么简单的逻辑在之后会变成这么复杂的模块,甚至在增添第一第二条else时,也只是很随意的加上。
所以我觉得,这个锅绝对是是甲方的,让他娘的随便改需求。
这么一想心里就好受多了,编程嘛,最重要的是要看的开。
于是我又增加了两条else,测试,提交,下班。
有时候真的不是我们不想写好代码,是不能写好代码。写着写着需求砍了、需求变了,什么设计模式都不顶用,最终还是怎样快怎样方便怎样来,因为根本没人知道这段代码还能不能活的过下一段需求变动。
有的人肯定要说怎么不订合同。合同肯定是有的,但是明明白纸黑字写的合同,该改还是得改,毕竟你要是不同意甲方那些微小的变动,以后还做不做了?!金主真能去得罪?
还是要学会得过且过,跟什么过不去也不能跟自己过不去,糟糕的代码忍一忍就完了:代码能跑、头发不少,对我们这些打工的人而言比什么都重要。
现实工作绝不是课本中的理想状态,会有无数的突发情况在等着你。你定义了半天观察者、备忘录,第二天这部分需求被砍了;写了半天接口,抽象类,忽然下午告诉你要加个十万八千里打不着边的啥东西,于是又开始加适配器,等你加完了告诉你又砍了。甚至有次半夜被喊起来改代码,等改完了发现需求被撤回了,气的我直接请了两天假调整心情。
设计模式和大的框架绝对是一个项目中非常重要的东西,但不是绝对重要的;一个好的PM团队,在某种意义上,才真正决定了这个项目的代码质量。〔1〕
请用5秒钟的时间查看下面的代码是否存在bug。
OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break;这就导致这段代码的行为逻辑与我的设计初衷不符了。
缺点一。语法正确,逻辑错误
这就是第一个理由为什么程序猿很少使用switch来做条件判断,对于新手来说忘记写break实在是再普通不过了,就算是老猿忘记写也是时有发生的事情,而这个语法错误在诸多的语法检查器上没有办法检查出来的,因为从语法角度来说是正确的!可是代码的处理逻辑却是错误的!用if来重写这段代码的话,就不会发生这种错误。
上面的代码为了保证正确我添加了else做一个逻辑上的保证,其实如果不写else,这段代码也不会发生逻辑错误,而且一旦我忘记写花括号的时候,语法编译器是会提示我添加的,甚至可以使用eslint这种的工具强制我使用花括号,这样就不会犯语法错误了,一旦出现bug,那么肯定是我逻辑上的问题了。
缺点二。死板的语法
switch尽管对于break很宽容,但是对判断条件很严苛,case后面只能跟常量,如果你用C编写的话,甚至只能用int类型作为判断条件。对于我们这么潇洒自如的程序猿来说,这种限制实在是太麻烦了,用if的话,别说是常量了,我用函数都可以,真正做到方便快捷。
缺点三。需要子函数来处理分支
这个缺点跟缺点一有关,为了防止漏写break,因此建议把分支处理方法独立成一个子函数来处理,这样在阅读代码的时候就会减少忘记写break带来的bug,那么用if来写的话,我想怎么写就怎么写,非常随意自由,但是这也导致了代码的可读性大大降低。
switch的优点
既然switch有这么严重的缺点,那怎么在所有语言中依然会存在呢?那就说下switch的优点吧,它的优点也刚好是它的缺点。
在很久很久以前,那时候的电脑性能还不如一台小霸学习机的时候,聪明的计算机科学家为了提高计算机的处理速度,将一些逻辑分支处理方法简化了一下,把一些需要做逻辑判断的操作给固定死,然后只要查表一样一个一个对一下就能做出相应的反应了。
比如说a0的判断,switch和if在cpu上面的处理方式是不一样的,switch是在编译阶段将子函数的地址和判断条件绑定了,只要直接将a的直接映射到子函数地址去执行就可以了,但是if处理起来就不一样了。
它首先要把a的值放到CPU的寄存器中,然后要把比较的值放到CPU的另一个寄存器中,然后做减法,然后根据计算结果跳转到子函数去执行,这样一来就要多出3步的操作了,如果逻辑判断多的话,那么将会比switch多处许多倍的操作,尽管寄存器操作的速度很快,但是对于当时的学习机来说,这点速度根本不够用啊。
那还有一个问题,为什么要使用break来做一个判断结束呢?这不是很容易造成语法错误了?那就要说到子函数的问题上了。
在早起的电脑代码中是没有子函数的概念的,那时候都是用goto随意跳转的,你想去第10行代码,很简单goto10就可以了。这种编程思维在C的早期阶段还是一直受到影响的,因此早期的C也没有子函数,都是一堆逻辑处理混乱在一起,goto满天飞,所以那时候你没有一个最强大脑是写不了程序的。那为了告诉程序我这里条件判断处理结束,就添加了break作为终止符号。后来慢慢的有了子程序,有了更好的编程规范,才一步一步的将写代码沦落到体力劳动。
后来发展的新语言为了标榜自己的血统,多少都要参考下C,然后就把switch这种诡异的语法也继承下来了。但是也不是所有的语言都照搬,比如Google发明的新语言golang和kotlin就又把switch包装了一下,去掉了令人误会的语法,又让switch变得灵活起来了,对了,在代码重构的时候,还是用switch把,这样看起来的确代码更简洁哦!〔2〕
switch只能用于简单判断,不支持表达式。
没有ifelse使用方便。
不是尽量别用,而是不合适没法用,合适得时候该用还是用。
比如说,变量i要求大于10,小于20,一条if(i10i20)就解决了问题,如果用switch,那岂不是自找麻烦。
又如变量i有5个固定返回值,10,20,30,40,50,那么用switch比较适合,用if也可以。
对于多变量判断,多重判断,复杂判断,还是靠if,switch几乎无能为力。
所以,switch多用在简单的枚举,对于很复杂的条件判断几乎无能无力,if则用在所有判断时候。简单的枚举又不很多,所以if最常见
相比之下Switch可以让人更宏观的去分析代码。编写代码和阅读代码需要宏观和微观两种视角,宏观看架构和数据走向,微观看语法和功能的片段。
有些朋友编码喜欢走一步看一步,越往后越发现前面留了好多坑需要后期再做进一步修正。有些朋友不把数据的分支想全面就会用很多ifelse来磊代码。
不是不想用Switch,只是因为编码时,太随性。所以想做专职的开发人员,对代码的宏观视角是必不可少的,并且编码时还要为今后的修改留有余地。
因为最开始情况少,几个elseif没了,后面增加需求,情况复杂了,程序员一直加所以多了
千万不要让父母给自己配电脑,看到这里电脑城装机的哭了!导读:小编今天闲来无事,在我们这的电脑城晃悠了一下午,在小编快要从电脑城撤离的时候看到了这样的一幕,三个家长拿着一台电脑来到二手电脑组装摊位,然后要给孩子换配置。当时我的心情是……
实体店小程序运营技巧,打通线上线下提高店铺营收实体店单纯做线下已经不再是未来发展趋势,想要与时俱进,就要将实体店与小程序进行结合,打通线上线下销售渠道,才能提到店铺整体营收。一、搭建适合自己行业的小程序商家想要……
专访致远互联董事长徐石因协同而致远内容来源:《企业家》杂志19年,6935天。19年前,一支三五人的小团队在北京友谊宾馆扎根,从无产品、无技术、无资金白手起家,怀揣满腔热情的产品梦,凭借一股千磨万击……
魅族16s和小米9怎么选择魅族4月23日在珠海举办了魅族16s的新品发布会,这是一款定位旗舰的手机拥有4800W的超高像素也是很吸睛,搭配了一块6。2英寸的三星AMOLED显示屏,后置摄像头是4800W……
不只你,还有3亿中国人睡不着你知道吗?3亿中国人有睡眠障碍其实很多时候并不是我们不想好好睡觉只是,总会发生一些不可控的事情【有的人,刷着刷着,就睡不着了】说好只刷一下朋友圈……
新大陆NLSER嵌入式条码扫描模块扫描头远距离新大陆NLSN1ER嵌入式条码扫描模块扫描头是NLSN1扫描模组的升级款。NLSN1ER扫描头采用一体化超小体积设计、激光对焦,引擎内置硬件解码功能,可适配有高读码性能需求的轻……
长城汽车3。0T9AT9HAT超级动力总成将由坦克600首搭这是填补中国汽车品牌高阶AT变速器技术空白的一笔,这一笔来自长城。2021年7月2122日,超级动力巅峰品鉴长城汽车3。0T9AT9HAT超级动力总成品鉴会在长城汽车品牌……
小程序怎样才能少走弯路,实现高效运营?随着小程序的广泛应用,在各行业都发挥着它的作用,但是对于上线初期的商家来说,没有经验,想运营好小程序是需要大量精力和时间的,这时候,我们应该如何做才能高效运营小程序呢?一……
双11李佳琦薇娅直播间爆满!刚注册直播商标的平台还来得及?一年一度的双十一购物狂欢节(吃土节)在10月21日凌晨就已经开始了!!!要不是今天的微博热搜被李佳琦薇娅打工人尾款人等热词占领本打工人是万万没有想到的双……
中兴通讯要做最懂行业的网,助力5G工业互联网数智化发展数字化时代,5G技术突飞猛进,更与各行各业实现了深度共融发展。作为全球领先的通信设备商,中兴通讯一直致力于5G赋能行业数字化升级转型的时代重任,并不断在该领域实现突破创新。……
未来生物收编传销团队,旗下新零售就能做大做强?近日,直销企业辽宁未来生物科技有限公司以未来生物新零售大规模收编传销被查企业,市场发展异常火爆,而谁能想到一年以前未来生物为了新零售董事长亏损几千万。2020年年初刚刚走……
快手渴望卖书一姐?当王芳成为了抖音卖书一姐,快手也急需讲一个能吸引传统出版行业的漂亮故事。撰文蓝洞商业赵卫卫我们还没有正式决定,得听集团领导统一安排集体进驻,在快手图书教育行业招商大……
售价2499起!小米平板5pro速览这是一块11的大屏幕,却拥有2。5K超清晰显示,支持HDR1O,每一处细节都细腻养眼,多达1O亿色的真彩显示,为你真实还原天地间的缤纷多彩。轻盈机身,纤薄设计骁龙8……
互联网灵活就业最近听到越来越多灵活就业的信息,根据国家最新统计的结果已经有2亿人属于灵活就业的范畴。灵活就业具体的形式划分不去细究,只是针对这种现象的大规模出现,确实是在近几年趁着互联……
科技进步法明年起实施国家实验室首次落实入法科学技术进步法(下称科技进步法)的修订近日正式审议通过,并将于明年1月1日起实施。第一财经记者注意到,包括国家实验室在内的新体系首次正式写入法律。业内人士向第一财经记者表……
张红雷中兴通讯?白刃战?NO。这只是王者归来,再展雄风张红雷:中兴通讯?2C白刃战?NO,NO,NO。这是王者归来,再展雄风。近期中兴手机官方微博公布了中兴Axon30屏下版首销战报。斩获了京东安卓手机单品销量第一、天猫安卓……
元宇宙大概率元宇宙大概率是下一轮经济发展主线,10年后人类社会可能会全面进入万物互联、智能化、虚拟现实,进入曾经的科幻世界,到时候已经进入6G,星链互联网,为万物互联提供基础设施,因此芯片……
小米世界第二还不舒服?雷军这是高级凡尔赛,苹果不想要给我最近,小米试制了一档节目叫《雷军请你超大杯》,在节目中雷军请到了戏剧导演孟京辉一起喝咖啡,一起谈天说地。从当前小米发布的预告来看,双方谈论的尺度可以说是非常大了,雷总也是……
京东无货源开店,找对选品思路很重要互联网的发展带动了电商行业的进步,大量的电商平台在这几年都得到了较好的发展。网赚成为了现在人们热门的创业项目,而无货源的运营模式也逐渐成为了一种网赚特色,从而吸引到了很多创业者……
互联网公司大比例裁员有你家的没有年底裁员潮来临,靠烧钱狂涨业务的一个也少不了。互联网的裁员首当其冲,互联网企业的本质是广告公司,广告主日子都不好过了,广告公司能好吗?1、百度无人驾驶部门大面积裁员,比例……
人口老龄化加速,运营商5G建设助力智慧养老来源:通信信息报社(记者唐刚)备受关注的第七次全国人口普查数据近日出炉,统计数据表明,我国目前已进入中度老龄化阶段,老龄化成为今后一段时期我国的基本国情。面对不断增……
三星联合iFixit支持Galaxy用户自行维修手机品玩4月1日讯,据网易科技报道,三星宣布,将与iFixit建立新的合作伙伴关系,允许部分Galaxy旗舰设备由用户自行维修。据悉,三星将会提供正品零件、维修工具和维修指南……
Edge新特性新增迷你右键菜单内置在线词典优化密码监控基于Chromium的新版Edge浏览器在近日的更新中,终于迁移了经典版Edge浏览器中的在线字典功能。此外在最新版本中,微软似乎正在开发迷你版右键菜单,并对密码监控工具进行改……
液晶电视挑选关于液晶电视挑选不吐不快。早年间的大屁股crt电视,十年前的ccfl液晶电视,到现在的led液晶电视,都用过拥有过,这些年通过使用和反思,总结的结果就是,画面效果是第一位首选。……