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();
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用的好也能发挥不错的作用

转载:如何避免代码中的if嵌套的更多相关文章

  1. 如何减少代码中的if-else嵌套

    实际项目中,往往有大量的if-else语句进行各种逻辑校验,参数校验等等,大量的if-else,语句使代码变得臃肿且不好维护,本篇文章结合我自己的经验,就减少if-else语句给出以下几种方案,分别适 ...

  2. 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同

    在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...

  3. 为什么java代码中要避免多层深度for循环嵌套

    在开发中,一直强调代码的整洁和可读性.之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响.可能对性能也有影响,但是一直不知道对性能影响在哪.最近在看虚拟机方面的书,感觉有一个点应 ...

  4. 代码中特殊的注释技术——TODO、FIXME和XXX的用处 (转载)

    转自:http://blog.csdn.net/reille/article/details/7161942 作者:reille 本博客网址:http://blog.csdn.net/reille/, ...

  5. 代码中特殊的注释技术——TODO、FIXME和XXX的用处 (转载)

    转自:http://blog.csdn.net/reille/article/details/7161942 作者:reille 本博客网址:http://blog.csdn.net/reille/, ...

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

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

  7. 去除C/C++程序代码中的注释

    最近搞软件著作权,去除代码空行和注释比较麻烦,想写个程序自动去除,去网上搜了下,发现有类似的程序,不过只有去除注释.鉴于word中可以去除空行(用^p^p替换^p),先用网上的代码,以后有时间写个完整 ...

  8. [转]如何在 JS 代码中消灭 for 循环

    一,用好 filter,map,和其它 ES6 新增的高阶遍历函数 二,理解和熟练使用 reduce 三,用递归代替循环(可以break!) 四,使用高阶函数遍历数组时可能遇到的陷阱 五,死磕到底,T ...

  9. [RN] React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示

    React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示 问题: 0.9.0 或 0.8.0 版本的 ...

随机推荐

  1. CSS Sprites的详细使用步骤

    一.把小图放在一张大图中,先排版好.上几张图看看,就比如这个: 谷歌: 淘宝: 土豆右下角悬浮框: 1.把用到的小图都放到了一张大图里,其中的小图之间的排版是有点规律的,比如说淘宝那张,类似的小图放置 ...

  2. 【转】Android Studio Essential Training

    http://ask.android-studio.org/?/explore/category-video Android Studio Essential Training内容包括:- Andro ...

  3. BA - 读书雷达10本必读书

    https://www.douban.com/doulist/43172796/ 用户故事与敏捷方法 入门篇之一: “是每个ThoughtWorks BA都读的经典入门书籍,详细介绍了用户故事及实用操 ...

  4. Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

    一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...

  5. Graphql graffiti

    https://github.com/RisingStack/graffiti-mongoose https://blog.risingstack.com/graffiti-mongoose-mong ...

  6. Android开发之显示进度对话框

    一般有两种对话框,一个是普通的简单的please wait对话框,另一种是创建显示操作进度(如下载状态)的对话框. 第一种普通的效果图如下: 第一种普通的实现代码: public void onCli ...

  7. 今天给大家分享一下Android中的资源与国际化的问题

    摘要:该文章将向大家分享Android中的资源与国际化的问题. 今天给大家分享一下Android中的资源与国际化的问题,通常我们新建一个Android工程,目录结构如下图所示: 我们主要看一下layo ...

  8. PHPStorm&PHPstudy环境配置

    因为实习要求,最近在学php,补下开发环境的配置,原博客链接:点击打开链接 1.创建新的项目(project),创建完成之后单击工具栏的应用运行/调试(Select Run/Debug Configu ...

  9. (转)JS获取当前对象大小以及屏幕分辨率等

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...

  10. phpstrtotime()对于31日求上个月有问题

    PHP自带的strtotime()对于31日求上个月有问题,如下: <?php $date = "2012-07-31"; $date_unix = strtotime($d ...