范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

为什么很多程序员不用switch,而是大量的ifelseif?

  我个人觉得switch其实非常多余。
  1 大部分场景,都是2到3个可能分支,用个if else就可以了,除非有4 个以上分支,太多else显得不好看,才考虑用switch.
  2 switch限制多。switch必须是常量变量。if后面可以写任意表达式。
  3用法复杂,case后面要么break,要么return,要是不写,居然还会继续执行剩下的分支,对于新手来说分分钟掉坑。
  4 写法上其实也不比if else优雅简洁,switch xxx  case  xxxx ….
  所以,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语句更灵活的地方,根据业务进行逻辑条件编写,可维护性高。同时只要写的代码质量高,可读性也就会更高。
  建议
  现实的业务实际是很复杂的,我也不建议一定要用大量的if……else if,而是应该尽早返回来减少嵌套,这样增加了可读性以及降低维护的成本。
  从C/ C++来看,当分支较多且switch要比较的值是连续的话,执行速度远远远远快于if,因为switch是直接跳到目标代码执行的,而if则需要执行很多条语句,慢的不是一点点,一般编译器会根据分支数量和比较的值是否连续生成不同汇编代码,如果编译器判定不能提升速度的话,switch生成的汇编代码和if是一模一样的没有任何区别。
  至于很多人不用switch我觉得可能是:
  1.为了方便写代码,思维习惯随手就用if写了;
  2.可能根本就不懂为什么要用switch吧。
  作为程序员来说,我更喜欢switch的结构,更直观更容易找到相应的代码块。不过为什么很多程序员不用Switch,而是使用大量的if...else if的结构,甚至像Python已经不支持原生Switch语法了?
  这个原因很简单,因为switch语法结构最后编译还是通过if...else if来完成代码的,所以从效率角度来说和if...else if一样的。但是switch对比条件比较单一,绝大多数支持switch的编程语言都支持等于比较,也就是说变量只能等于case中的条件才会执行代码块。但是现实情况中,对比条件绝大多数比单一等于运算要复杂得多,因此很多程序员就直接使用if...else if。但是if...else if的结构,后期维护起来会比较不清晰,毕竟没有Case...Break那么直观。但是添加一些注解应该还是能解决这个问题的。
  所以,我现在能使用Switch的时候还是会使用switch,毕竟后期代码维护起来方便点。不过更多时候还是用if...else if。
  送大家以下java学习资料
  我曾经接手过一份代码,遇到过一个三十几个if else套if else的模块。
  心理骂骂咧咧谁他喵写的这玩意,然后开始review历史。
  大致情况是这样的:第一个程序员写下这段代码时,只有两个if else;后来开始逐渐加需求,先是一个、两个,随后量变引起质变,于是逻辑分支快速扩张。
  这个时候已经没有人愿意去重构成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的优点吧,它的优点也刚好是它的缺点。
  在很久很久以前,那时候的电脑性能还不如一台小霸学习机的时候,聪明的计算机科学家为了提高计算机的处理速度,将一些逻辑分支处理方法简化了一下,把一些需要做逻辑判断的操作给固定死,然后只要查表一样一个一个对一下就能做出相应的反应了。
  比如说a=0的判断,switch和if在cpu上面的处理方式是不一样的,switch是在编译阶段将子函数的地址和判断条件绑定了,只要直接将a的直接映射到子函数地址去执行就可以了,但是if处理起来就不一样了。
  它首先要把a的值放到CPU的寄存器中,然后要把比较的值放到CPU的另一个寄存器中,然后做减法,然后根据计算结果跳转到子函数去执行,这样一来就要多出3步的操作了,如果逻辑判断多的话,那么将会比switch多处许多倍的操作,尽管寄存器操作的速度很快,但是对于当时的学习机来说,这点速度根本不够用啊。
  那还有一个问题,为什么要使用break来做一个判断结束呢?这不是很容易造成语法错误了?那就要说到子函数的问题上了。
  在早起的电脑代码中是没有子函数的概念的,那时候都是用goto随意跳转的,你想去第10行代码,很简单goto 10就可以了。这种编程思维在C的早期阶段还是一直受到影响的,因此早期的C也没有子函数,都是一堆逻辑处理混乱在一起,goto满天飞,所以那时候你没有一个最强大脑是写不了程序的。那为了告诉程序我这里条件判断处理结束,就添加了break作为终止符号。后来慢慢的有了子程序,有了更好的编程规范,才一步一步的将写代码沦落到体力劳动。
  后来发展的新语言为了标榜自己的血统,多少都要参考下C,然后就把switch这种诡异的语法也继承下来了。但是也不是所有的语言都照搬,比如Google发明的新语言golang和kotlin就又把switch包装了一下,去掉了令人误会的语法,又让switch变得灵活起来了,对了,在代码重构的时候,还是用switch把,这样看起来的确代码更简洁哦![2]
  switch只能用于简单判断,不支持表达式。
  没有if else 使用方便。
  不是尽量别用,而是不合适没法用,合适得时候该用还是用。
  比如说,变量i要求大于10,小于20,一条if(i>10&&i<20)就解决了问题,如果用switch,那岂不是自找麻烦。
  又如变量i有5个固定返回值,10,20,30,40,50,那么用switch比较适合,用if也可以。
  对于多变量判断,多重判断,复杂判断,还是靠if,switch几乎无能为力。
  所以,switch多用在简单的枚举,对于很复杂的条件判断几乎无能无力,if则用在所有判断时候。简单的枚举又不很多,所以if最常见
  相比之下Switch可以让人更宏观的去分析代码。编写代码和阅读代码需要宏观和微观两种视角,宏观看架构和数据走向,微观看语法和功能的片段。
  有些朋友编码喜欢走一步看一步,越往后越发现前面留了好多坑需要后期再做进一步修正。有些朋友不把数据的分支想全面就会用很多if…else…来磊代码。
  不是不想用Switch,只是因为编码时,太随性。所以想做专职的开发人员,对代码的宏观视角是必不可少的,并且编码时还要为今后的修改留有余地。
  因为最开始情况少,几个else if没了,后面增加需求,情况复杂了,程序员一直加所以多了

千亿级无人机市场将迎新标准自动驾驶实施分级管理本报记者裴昱北京报道在民用无人驾驶飞行器这一新兴领域,中美之间的竞争不仅体现在技术研发方面,监管政策和产业政策也同等重要。当美国联邦航空管理局(FAA)坚持以现有框架对该领域进行适总结一下搭载骁龙778G的手机,说句内心话,没有一款我特别喜欢的骁龙778G这款处理器对于大家来说应该不陌生了吧,凭借超低的功耗,最为代表的就是iqooz5,这款手机的续航很强悍,但是纵观这么多骁龙778G的手机,没有一款我特别喜欢的,但是如果现阶段出租车司机出路在哪里?谢邀请。现阶段出租车司机的出路就是能保住饭碗,别谈什么出路不出路,能对付养家糊口就行,要求别太高。没出现疫情之前,出租车司机的收入还是蛮好的,勤快一点,哪个月都有78千块钱入帐。疫对ASML出手了,新消息从俄传来!外媒华为将成赢家芯片是全球高端技术的集合体,因为一颗完整的芯片要经过研发设计生产制造以及封装测试等多道工序。这个过程中,需要用到工业软件EUV光刻机等,但这些先进的技术却偏偏掌握在少数企业手中。芯多国出手,紧急下架支付宝微信?马云给出正面回应引言微信和支付宝这两个app给居民的生活方式带来了较大的改变,并且在国外市场也得到了发展,但随着支付宝以及微信的影响力越来越高,支付宝微信在国外发展逐渐受阻?马云对此表明态度,你怎那些年你经历过最经典的谣言是啥?今年是寡妇年或者是光棍年。结果是寡妇没多少,该找不到对象的十几年几十年永远是光棍年!因为一句经典的谣言,一个高中生大半夜的跳入水中,将整个学校都惊动了,差点没给他送到精神病院去,这中美学者克隆出提高籽粒产量关键基因来源科技日报科技日报南京4月10日电(记者金凤)小麦是全球分布最为广泛的粮食作物,世界上有超过40的人口以小麦为主食。提高小麦产量,事关粮食安全。4月10日,科技日报记者从南京农业CentOS6。5安装Nginx1。7。8教程Nginx是一款轻量级的Web服务器反向代理服务器及电子邮件(IMAPPOP3)代理服务器,由俄罗斯的程序设计师IgorSysoev所开发,其特点是占有内存少,并发能力强,第一个公刘强东,再见了4月7日,刘强东宣布卸任京东集团CEO,由京东集团总裁徐雷接任。简短认识刘强东1992年高考,他考了680分,成了宿迁市的高考状元。大学还没毕业,他就存了20万,相当于今天的200python包之Pillow图像处理教程一安装被认为是python官方图像处理库PIL非常适合于图像归档以及图像的批处理任务。可以使用PIL创建缩略图,转换图像格式,打印图像等等PIL支持众多的GUI框架接口,可以用于图淘宝新规可改账号名300万人连夜改淘宝名你对改淘宝名怎么看?近日,淘宝官宣支持用户账号名修改功能。这一功能的更新获得极高的群众呼声,该话题迅速登上微博热搜榜单首位。图片来源微博不少用户发出感慨终于可以和非主流的自己说再见了告别前任,我要重新
阿里怎么了?刚被罚100多亿,领导就侵犯女员工前脚阿里巴巴刚因为反垄断被市场监管总局直接罚了182。28亿,事件刚才平复下来,这又出事了!目前在电商领域呢,阿里巴巴已经有着绝对的市场支配权!之前,阿里因为一直要求平台的玩家二选TIOBE8月编程语言排行C语言保持第一,Python反超Java2021年8月的TIOBE指数已经出来了,通过这个排行榜也从侧面反映出来编程语言的欢迎程度。地址httpswww。tiobe。comtiobeindex排行情况C语言依然排名第一,iPhone13发布前入手iPhone12,使用一个月的真实感,大家不要买iPhone13快就要发布了,我却买了一款iPhone12,到现在已经用了一个多月了,主要原因是上一个iPhone11摔了一下,只要提前买一部iPhone12来用。今天说说这一个多阿里虚假交易在严查,天猫卖家要特别注意一hr最近老白有很多顾客都被排查到了虚假交易的违规,其中特别集中在天猫平台,包括但不限于淘礼金淘宝客补丹等情况和行为,所以争对这个问题和情况,老白和大家来聊聊,到底什么是虚假交易?阿里侵犯门将会成为压死骆驼的最后一根稻草?事件概述8月8日,有认证阿里巴巴员工的网友声称,公司某领导要求女性员工陪客户,随后其被灌醉后遭到猥亵。而后,该领导为女员工开了房间,先后其进出房间4次,并实施侵犯。受害员工在内网发拜登在白宫试驾电动车,特斯拉为何未被邀请?马斯克发推吐槽汽车向电动化转型,已经成为了全球车企的大趋势。拥有特斯拉这样的全球第一电动车品牌,美国也显然更理解这一趋势。据报道,上周五,拜登与通用福特和菲亚特母公司Stellantis等美国主露一手,用Python写了一个疫苗管理系统大家好,我是Jack。不少小伙伴问我,Python怎么学,我的统一回答实战,多练。其实就是从自己的兴趣出发,做一些实战小项目。正好,周末在家摸鱼的时候,在网上看到了一个不错的小项目阿里公布员工遭侵害事件处理决定!划重点遇性骚扰应该如何维权?近日阿里一女员工被侵害事件在网上闹得沸沸扬扬8月7日,有被认为是阿里巴巴员工的网友在社交平台发帖称,在7月27日的一次出差过程中,被其领导要求在KTV陪客户喝酒,被灌酒后遭到客户猥濒临退市连年亏损,新能源汽车风口会是开心汽车的突破点吗经历了上半年雨后春笋般出现的跨界造车者,市场对跟风选择造车局的新晋选手已经见怪不怪,但当二手车领域的开心汽车选择新能源汽车之时,还是在业内激起了一层涟漪。日前,开心汽车宣布,当下中小米MIX4抢先看整体配置毫无亮点,雷军的高端之路还很漫长现在的小米混的可谓是风生水起,不仅在高端市场稳稳地站住了脚跟,而且出货量也是大幅提升,目前,在全球出货量上小米已经超过了苹果,成为了全球第二在欧洲市场也是首次超越三星拿到了出货量第关于区块链领域的3个建议包括区块链等新兴产业,在发展的早期,存在着一个运行和欺诈的市场,规模确实很大另一方面,我们可以看到,在信息工具中,特别是在新兴的defi协议中,defi协议的攻击者准备充分,不仅针