zoukankan      html  css  js  c++  java
  • 转载:如何避免代码中的if嵌套

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

  • 相关阅读:
    变分自编码器(Variational Autoencoder, VAE)通俗教程
    神经网络图灵机(Neural Turing Machines, NTM)
    【Java设计模式】单例模式
    SupportV7包中 SwipeRefreshLayout 修改下拉控件的距离
    eclipse项目导入androidstudio
    LiveWriter Test
    【Android学习】XML文本的三种解析方式(通过搭建本地的Web项目提供XML文件)
    【百度地图学习-一】初始化以及TextOverlay
    【Android学习】四种布局方式
    【Android学习】数据传递三种方式
  • 原文地址:https://www.cnblogs.com/code-style/p/3833068.html
Copyright © 2011-2022 走看看