转载:如何避免代码中的if嵌套
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嵌套的更多相关文章
- 如何减少代码中的if-else嵌套
实际项目中,往往有大量的if-else语句进行各种逻辑校验,参数校验等等,大量的if-else,语句使代码变得臃肿且不好维护,本篇文章结合我自己的经验,就减少if-else语句给出以下几种方案,分别适 ...
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
- 为什么java代码中要避免多层深度for循环嵌套
在开发中,一直强调代码的整洁和可读性.之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响.可能对性能也有影响,但是一直不知道对性能影响在哪.最近在看虚拟机方面的书,感觉有一个点应 ...
- 代码中特殊的注释技术——TODO、FIXME和XXX的用处 (转载)
转自:http://blog.csdn.net/reille/article/details/7161942 作者:reille 本博客网址:http://blog.csdn.net/reille/, ...
- 代码中特殊的注释技术——TODO、FIXME和XXX的用处 (转载)
转自:http://blog.csdn.net/reille/article/details/7161942 作者:reille 本博客网址:http://blog.csdn.net/reille/, ...
- php中嵌套html代码和html代码中嵌套php方式
php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...
- 去除C/C++程序代码中的注释
最近搞软件著作权,去除代码空行和注释比较麻烦,想写个程序自动去除,去网上搜了下,发现有类似的程序,不过只有去除注释.鉴于word中可以去除空行(用^p^p替换^p),先用网上的代码,以后有时间写个完整 ...
- [转]如何在 JS 代码中消灭 for 循环
一,用好 filter,map,和其它 ES6 新增的高阶遍历函数 二,理解和熟练使用 reduce 三,用递归代替循环(可以break!) 四,使用高阶函数遍历数组时可能遇到的陷阱 五,死磕到底,T ...
- [RN] React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示
React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示 问题: 0.9.0 或 0.8.0 版本的 ...
随机推荐
- 简约的返回顶部效果(jQuery)
博客建好也快一个月了,主题是在原有主题的基础上做的修改,喜欢这样的清新简约风格,为了更好的体验,以后也会经常做修改. 一般博客的文章都比较长,看到下面不能快速返回到顶部还真是不方便,今天自己动手写了一 ...
- HTML里面Textarea换行总结
近期碰到一个数据转来转去转到Textrea里面能否真正按行存放的问题,在这里总结一下: 问题描写叙述: 比方get数据到一个TextArea里面,如“AAA BBB”,想把这段文字在TextAre ...
- [rxjs] Creating An Observable with RxJS
Create an observable var Observable = Rx.Observable; var source = Observable.create(function(observe ...
- Java数据库连接代码集合(转)
Java数据库连接接口(JDBC)是Java里定义的一套用于数据库连接和操作的API的集合.有不同的数据库厂商提供这套接口的实现类,对于 Java程序员来说,程序员不需要关心数据库的底层的实现,统一的 ...
- android 72 确定取消对话框,单选对话框,多选对话框
package com.itheima.dialog; import android.os.Bundle; import android.app.Activity; import android.ap ...
- BTrace: DTrace for Java2
BTrace: DTrace for Java… ish 时间 2012-04-24 16:17:55 dtrace.org 原文 http://dtrace.org/blogs/ahl/2012 ...
- MYSQL 学习笔记1 -----mysqladmin -uroot -p status|extended-status
root@server1 ~]# mysqladmin -uroot -p status -i -r extended-status|grep Handler_commit Enter passwor ...
- mysql 导入excel 或 .csv
第一步 导出excel 去掉列头,设置文本里面格式
- 怎样通过ajax提交数据
ajax的出现彻底改变了javascript命运,通过ajax可以直接向服务器提交数据,有两种方式: get方式,数据直接拼接在地址中 post方式,数据由data字段携带 post方式,data中是 ...
- majikan