博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转载:如何避免代码中的if嵌套
阅读量:6939 次
发布时间:2019-06-27

本文共 1802 字,大约阅读时间需要 6 分钟。

 

在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

你可能感兴趣的文章
奔向新纪元,Vista安装经历
查看>>
Centos7无法使用ssh登陆及解决方案
查看>>
应用强制访问控制管理网络服务
查看>>
Exchange 2013多租户托管PART 2:Exchange基本配置
查看>>
Mellanox发布升级版RoCE软件 简化以太网RDMA部署
查看>>
《认知设计:提升学习体验的艺术》——学习者不希望觉得自己愚蠢
查看>>
大数据产业“跑”出“长春速度”
查看>>
YII2.0框架分页
查看>>
c#数据库编程
查看>>
我的友情链接
查看>>
MongoDB 更新文档
查看>>
javaweb Servlet开发
查看>>
websocket-bench压力测试
查看>>
http://91.213.30.151/
查看>>
Android ViewStub详解
查看>>
JavaScript中的prototype、__proto__和constructor
查看>>
mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
查看>>
java类初始化顺序-阿里笔试题
查看>>
ExecutorService线程池
查看>>
二十年后的回眸(9)——十年著书路
查看>>