有人喜欢if-else,称之为程序结构化的灵魂。确实,就计算机逻辑来讲,if-else最符合计算机非0即1的逻辑。就连在工作时,项目经理在给我们描述业务逻辑时也会来两句if如何,else如何!但是,也有人对代码中出现过深的if-else嵌套感到深恶痛绝。因为不论是在Debug、功能扩展、后期维护还是项目代码开源共享、项目交接等情况下,若是遇到十几层深度成百上千行的if-else嵌套代码,任何人都会头疼不已。

总结一下if-else的优缺点:

优点:

1、最容易上手;

2、逻辑性强,在实现业务时比较实用;

缺点:

1、嵌套过深,测试困难;

2、维护困难,若要修改外层逻辑有可能会影响到深层次的逻辑;

3、功能扩展可能会出现困难,需要找到对应的分支,重新梳理逻辑;

4、代码臃肿,阅读性差;

总之,if-else在程序设计中是不可避免的,作为程序员能做的就是减少嵌套,提升代码的可阅读性和质量。但是,这些都需要一定的经验,对于新手来说实现功能已经就十分困难了,若还需在过程中考虑这些无疑是雪上加霜。所以,小编就个人经验分享一些小技巧,希望能帮助大家提升代码质量。

Switch case 替代,这个大家都知道,当判断条件是某个变量的值时,可以用switch case来代替代码中的if-else;

int a = b + c ;if(a == 1){/*doing something*/}else if(a == 2){/*doing something*/}//*****else{/*doing something*/}

替代为:

       switch (a)       {       case 1 :{/*doing something*/}break ;       case 2 :{/*doing something*/}break ;       //***       default:{/*doing something*/}              break;       }

案例

针对后文所提及的方法,有一个很经典的演示案例--输入一个年份,判断是否为闰年。其逻辑是:首先需要判断年份是否能被4整除,能被4整除还需要分整百年和非整百年,整百年还必须被400整除才是闰年。用代码实现如下:

减少没必要的if-else,有时候if只是拿来判断某些变量是否异常,那么主程序那一块没必要加if-else,只需要在异常处加if判断;

如案例可以用这种方法重构如下:

       leap=0;       if(year%4==0)        {               leap=1;              if(year%100==0)               {                     if(year%400 !=0) leap=0;              }        } 

优化完,明显清爽很多。像上述案例只是赋值用这种重复赋值的方式可以避免掉一部分的else出现,但是如果分支是运行不同的函数呢?此时,就需要换一种方式,那就是提前return,例如:

if(condition){   dosomething(); }else{   dootherthing(); }//采用提前return法则,去掉一个elseif(condition){   dosomething();      return ; }dootherthing();

三目运算符替代,三目运算符可以很好的替代简单的if-else逻辑,还是用案例来演示,用三目运算符重构后:

year%4==0?(year%100 ==0?(year%400==0?1:0):1):0 ;

但是这仅仅只是减少了代码量,在阅读友好性上反而降低了。三目运算符只适合替代简单的if-else;

合并嵌套,通过将判断条件用逻辑运算符&&和||合并,从而减少嵌套。案例代码可以重构为:

leap=0; if(year%4==0 && year%100==0 && year%400==0)leap=1; else if(year%4==0 &&year%100!=0)leap = 1 ;//甚至可以更狠,但是并不建议这么做if(year%4==0 && year%100==0 && year%400==0 || year%4==0 &&year%100!=0)leap=1; 

拆分嵌套,通过梳理if-else的嵌套逻辑,将需要深层嵌套的if-else拆分成多个独立的if-else代码块,或者平衡if-else中嵌套深度。案例代码可以重构为:

       leap = 0 ;       if(year%100==0)       {              if(year%400 ==0) leap = 1 ;       }else       {              if(year%4 == 0)leap = 1 ;       }

封装,如果遇到嵌套实在过深没有办法优化的话,可以将上下层尽量剥离并将部分嵌套封装为函数,以传参的方式将条件变量传递给函数。

//将部分嵌套封装为函数int JudgeLeap(int year){              int leap = 0 ;                    if(year%100==0)                     {                            if(year%400==0) leap=1;                            else leap=0;                    }                     else leap=1;  return leap ;}//主代码即重构为:if(year%4==0) leap = JudgeLeap(year)else leap = 0 ;

总结上这个方法并不是独立的,在实际使用过程中可以择优选择一种,也可以组合起来使用;另外还可采用设计模式和类的多态来重构,不过小编个人认为(仅代表个人想法),那已经是属于类的设计层面了。

如果你想要更好的学习C语言、C++、Windows以及QT的知识! 私信回复 资料 二字领取更多学习资料。还有编程学习文件(源码,项目实战教学视频以及给小白的零基础教程),欢迎初学者和正在进阶中的小伙伴们!

C/C++入门学习视频请点击下方了解更多:

else if mybatis 嵌套_新手如何书写C++代码,远离深度嵌套的if-else相关推荐

  1. 选择嵌套_如何优雅地在JavaScript中访问嵌套对象

    在JavaScript中访问嵌套对象 以超酷的方式安全地访问JavaScript中的嵌套对象 JavaScript是惊人的,我们都知道.但是JavaScript中的一些东西真的很奇怪,它们让我们大开眼 ...

  2. css 样式三元运算_20条书写CSS代码的建议

    在这篇文章中,我想跟你分享 20 条由 CSS 社区推荐的约定和最佳实践.有些建议可能比较适合新手,而有些则更高级一些,但我希望每个人都可以在本篇文章中收获自己不知道的知识.01.谨慎使用外边距属性与 ...

  3. formdata 嵌套_角度7 FormData+文件+嵌套对象

    我有一个django后端和angular 7 frontend,在发送带有参数和文件的formdata时一切正常,但是当我尝试发送嵌套的json时,它是空的.嵌套的json用于我的对象中的嵌套序列化程 ...

  4. mybatis 时间_开发工具:Mybatis.Plus.插件三种方式的逆向工程

    一.逆向工程简介 在Java开发中,持久层最常用的框架就是mybatis,该框架需要编写sql语句,mybatis官方提供逆向工程,可以把数据表自动生成执行所需要的基础代码,例如:mapper接口,s ...

  5. java mybatis 教程_(整理)MyBatis入门教程(一)

    本文转载: 本人文笔不行,根据上面博客内容引导,自己整理了一些东西 首先给大家推荐几个网页: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache softw ...

  6. finally 嵌套_学习 Rust【2】减少代码嵌套

    结论先行:减少代码嵌套就是降低复杂度. 资源管理一向是编程中的重要任务.当一个函数要管理多个资源时,很容易出现代码嵌套层级太深的问题,尤其是调用系统或第三方 API 时. 以 C 语言代码为例,这里简 ...

  7. python代码书写_如何优雅的书写Python代码, python使用小技巧

    博客链接 文章目录 Python使用技巧 变量命名技巧 用有意义易读的命名 同类型使用相同词汇 可搜索的名字 自我描述的变量 不要取隐晦的名字 精简不重复 默认参数代替运算和条件 实用小窍门 变量值交 ...

  8. 表示python代码块的是_编写高质量Python代码的59个有效方法,你用过几个

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...

  9. python中如何编写代码输入多个数据并把它们放在一个列表中去_编写高质量Python代码的59个有效方法,你用过几个...

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...

最新文章

  1. FairyGUI和NGUI对比
  2. 反思一次线上bug的修改:没法看数据表的一次线上问题处理
  3. Windows下Qt5搭建Android开发环境笔记
  4. php gearmanclient addoptions,gearman PHP7扩展安装
  5. leetcode-search-in-rotated-sorted-array
  6. 设计模式 适配器模式
  7. 工作两年多的一个菜鸟感想
  8. 3. 机器学习中为什么需要梯度下降_梯度提升(Gradient Boosting)算法
  9. [OGG] [INS-75012] GoldenGate重装报错
  10. 数据库操作update,和insert为什么会有int的返回值
  11. POCO c++ 使用例子
  12. 【BZOJ2460】元素(线性基---(id,value)绑定,求id异或非0对应的最大value 和)
  13. Java拦截器实现拦截controller方法
  14. cad快看_对于CAD看图软件,你到底了解多少?
  15. JAVA 实现AES加密解密
  16. 管理计算机找不到应用程序,电脑打开IE浏览器显示找不到应用程序如何解决
  17. python实现multi函数参数个数不限、返回所有参数乘积_实现multi()函数,参数个数不限,返回所有参数的乘积。_学小易找答案...
  18. git gc error: failed to run repack message
  19. 玩PyTorch?你不得不看的PyTorch资源大列表
  20. 对IPv6的理解以及其与IPv4的区别

热门文章

  1. 反思代码优化点:trycatch 验证类 封装用户变量
  2. PHP的composer报错 failed loading cafile stream: `C:\Users\Administrator\Ap pData\Local\Temp\opeB1C9.t
  3. 本机显示服务器文本信息,打开文档显示云服务器
  4. 计算机地址永无符号数表示,计算机如何区分 有符号 无符号数的区别???
  5. php模块下载,douphp下载中心模块修改版
  6. 4个变量取最大值 c++_DNF:安徒恩上线服务器爆满,甲板上全是火山C,通关翻出4个金牌...
  7. php 扩展 mysql_PHP链接MySQL的常用扩展函数
  8. 计算机专业软件技术专业导论,计算机科学与技术专业导论.docx
  9. eclipse中插件修改svn用户名密码
  10. 审批流程展示html,Web企业在线审批流程系统