http://top.jobbole.com/4960/

http://stackoverflow.com/questions/24430504/how-to-avoid-if-chains

在Stack Overflow上的一个挺有趣的问题,详细整理问题和部分巧妙的回答如下。

假设我刻意写了一段代码:

bool conditionA = executeStepA();
if (conditionA){bool conditionB = executeStepB();if (conditionB){bool conditionC = executeStepC();if (conditionC){...}}
}executeThisFunctionInAnyCase();

从代码可以看出,executeStepX 函数只有在前面的条件为真时才执行。executeThisFunctionInAnyCase 无论如何(异常除外)都会在最后执行。现在我有一个很基础的问题: 在C/C++当中,有没有什么方法可以避免这种冗长的 if 条件语句嵌套?

我知道如果不要求最后执行 executeThisFunctionInAnyCase 的话,代码可以重构成这样:

bool conditionA = executeStepA();
if (!conditionA) return;
bool conditionB = executeStepB();
if (!conditionB) return;
bool conditionC = executeStepC();
if (!conditionC) return;

但是,如果最后调用executeThisFunctionInAnyCase是必须的,我该如何重构if条件嵌套呢?


感觉最好的方案:

if (executeStepA() && executeStepB() && executeStepC()){...
}
executeThisFunctionInAnyCase();

猪头点评:

粗粗看来这是最好的方案,因为他简洁明白,极大的减少了代码,不过个人认为表达式不宜太复杂,如果子表达式超过3个,或者executeStep需要提供复杂的函数参数,那么就合适再写一个函数,把executeStepA() && executeStepB() && executeStepC()包装起来。

其他方案:

do {if (!executeStepA()) break;if (!executeStepB()) break;if (!executeStepC()) break;  doSomething();
}while(0);
executeThisFunctionInAnyCase();

猪头点评:

这个方案也是不错的,如果不希望对代码做大的调整,这个方案可以增加一个层次,用来控制是否执行doSomething(),同时代码也被极大的简化了

void Execute()
{if (!executeStepA()) return;if (!executeStepB()) return;if (!executeStepC()) return;doSometing();
}Execute();
ExecuteThisFunctionInAnyCase();

猪头点评:

这个方案实际上是猪头一开始也想到的方案,一样达到效果,不过对比之前的方案,显然还是复杂了,因为他搞出一个函数来,虽然第一个方案也可能需要包装一个函数,但明显还是比这个方案简单,因为那个方案是复杂度到了才需要加函数,这个方案是一开始就要搞出一个函数,而不看内部复杂度

goto版本:

void execute()
{if(!executeStepA()) goto error;if(!executeStepB()) goto error;if(!executeStepC()) goto error;doSomething();error:executeThisFunctionInAnyCase();
}

猪头点评:

这个方案看起来也不错,看起来goto用的好也能发挥不错的作用

转载于:https://www.cnblogs.com/code-style/p/3833068.html

转载:如何避免代码中的if嵌套相关推荐

  1. php中嵌套html代码和html代码中嵌套php方式

    php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...

  2. 将不确定变为确定~Razor视图中是否可以嵌套JS代码

    这个问题有点意思,Razor的自动闭合性,导致JS代码不能直接与Razor代码混排,原来ASPX页面中,我们到处可见这种代码 <%if(Model!=null){foreach (var ite ...

  3. Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程

    Android的WiFi 我们通常看到WiFi的守护进程wpa_supplicant在我们的ps的进程列表中,这个就是我们的wifi守护进程.wpa_supplicant在external/wpa_s ...

  4. 2020-11-13 什么是代码中的魔鬼数字,如何解决?【转载】

    解决方法:用常量定义魔鬼数字. 个人理解-->魔鬼数字:即难以被理解的且没有注释的常量(0.1这种)表示某个有意义的参数来使用. 在代码中使用魔鬼数字(没有具体含义的数字.字符串等)将会导致代码 ...

  5. 如何解决代码中if…else 过多的问题

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  6. 【转载】SharpDevelop代码分析

    [原文地址]http://www.cnblogs.com/passos/archive/2004/10/04/48950.html 序 最近开始学习.Net,遇到了一个比较不错的开源的IDE Shar ...

  7. Java代码中的注释详解

    2019独角兽企业重金招聘Python工程师标准>>> java注释详解 声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责 ...

  8. java多态优化多个if_脑壳疼!代码中那么多“烦人”的if else

    if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼. 图片来自 Pexels 例如下面这个伪代码: 是不是很崩溃?虽然他是伪代码,并且看起来也 ...

  9. [转载] python skimage在图像处理中的用法

    参考链接: 在Python中打印单变量和多变量 基于python脚本语言开发的数字图片处理包,比如PIL,Pillow, opencv, scikit-image等. PIL和Pillow只提供最基础 ...

最新文章

  1. Jquery的Split二次分割
  2. 关于 spring 使用 mongodb 的 mongotemplate 对象操作数据库,对象注入问题(即该对象能否正常的调用相应的CRUD方法来处理数据)...
  3. 转载:javascript中定义兑现改的5种方式
  4. 韩顺平HTML5教程www.gis520.com
  5. QQ文件上传不了:什么年代了,还使用简单的关键词过滤,智能一点可好
  6. Java学习笔记——多线程
  7. 大麦盒子DM1004线刷降级填坑记录
  8. 计算机cmd管理员,cmd获取管理员权限的命令是什么
  9. 联想z5 android8,联想Z5
  10. 95后阿里P7晒出工资单:真的是狠狠扎心了...
  11. 奇虎360 replugin 插件化框架集成
  12. python gui 之库tkinter笔记
  13. 【Unity项目实战】手把手教学:飞翔的小鸟(2)脚本编写
  14. bzoj5442: [Ceoi2018]Global warming
  15. 阿里技术风险与效能部负责人张瓅玶:阿里集团深度用云实践
  16. 计算机处理器哪个最好,电脑处理器,哪个比较好
  17. 刷步数作弊成了朋友圈必备技能
  18. AForge.net 使用之录像拍照功能实现
  19. java添加坚挺_Java连载136-两种方式插入数据
  20. 人类智擒超高能中微子探秘宇宙黑洞

热门文章

  1. python扫雷代码文件_基于Python实现的扫雷游戏实例代码
  2. ceph-deploy mod add_我的世界基座(Pedestals)Mod
  3. 使用contour自定义等高线值
  4. 初识Tcl(三):Tcl 变量及运算符
  5. 【 Notes 】INS Preliminary Introduction
  6. SQL数据库学习之路(九)
  7. 负载均衡(Load Balancing)学习笔记(二)
  8. 使用VC连接Access数据库的两种方法
  9. 重温Delphi之:如何定义一个类
  10. Git安装教程(Windows安装)