【问题标题】:if-else structureif-else结构
【发布时间】:2010-04-07 07:12:47
【问题描述】:

我有这些长语句,在这里我将它们称为 x、y 等。 我的条件语句的结构是这样的:

if(x || y || z || q){
    if(x)
       do someth
    else if (y)
       do something

    if(z)
       do something
    else if(q)
       do something
}
else
    do smthing

有没有更好、更短的方法来写这个东西?谢谢

【问题讨论】:

    标签: java readability if-statement


    【解决方案1】:

    我认为你现在的写作方式没有什么大问题。 我建议即使对于单语句 if 块也使用花括号。这将帮助您避免错误,以防您以后必须添加更多代码行(并且可能忘记添加花括号)。我也觉得它更具可读性。 代码将如下所示:

    if (x || y || z || q) {
        if (x) {
           do something
        } else if (y) {
           do something
        }
    
        if (z) {
           do something
        } else if (q) {
           do something
        }
    } else {
        do something
    }
    

    【讨论】:

    • +1 用于使用花括号。我希望 Java、C++ 和其他语言能像“Go”那样做,并使这些大括号成为强制性的……它肯定会使代码变得更加可读。
    • 是的,实际上我总是使用花括号,上面的只是一个原型或其他东西。
    【解决方案2】:

    另一个避免多重检查和容易出错的复杂逻辑表达式的变体可能是:

    boolean conditionhandled = false;
    if (x) {
       do something
       conditionhandled = true;
    } else if (y) {
       do something
       conditionhandled = true;
    }
    
    if (z) {
       do something
       conditionhandled = true;
    } else if (q) {
       do something
       conditionhandled = true;
    }
    
    if (!conditionhandled) {
       do something
    }
    

    【讨论】:

    • 谢谢,我认为我们需要将条件处理初始化为 false
    • 糟糕!谢谢,我解决了这个问题。
    【解决方案3】:

    这对我来说似乎很清楚(清晰很好)。

    您可以做的是首先评估 x、y、z 和 q 并将它们存储为变量,这样您就不必这样做两次。

    【讨论】:

    • @Thirler 嗯,这将破坏短路评估的目的。我认为平均而言,假设 x、y、z 和 q 的概率和时间复杂度相等,这将是性能提升。但是,如果 z 的概率是 50% 并且需要很少的处理,而 q 的概率是 1% 并且需要 95% 的处理能力呢?看看如果没有适当的指标,微优化会如何给您带来麻烦?
    • 是的,我们最多需要使用一个变量来进行检查
    • @Tim 您需要极长的条件(或执行数百万次的代码)才能消耗性能。我当然没有优化(问题没有谈论它),我建议提高可维护性。如果性能很重要,您将需要透明地缓冲计算结果(将其隐藏在存储结果的函数后面)。请注意,给定的示例两次执行某些条件。但一个好的规则是在您发现执行需要大量时间之前根本不进行优化。
    【解决方案4】:

    也许这更容易阅读。但现在您将执行一项额外检查。如果它不是关键任务代码,那么也许您可以使用以下代码:

    if (x)
      do something;
    else if (y)
      do something;
    
    if (z)
      do something;
    else if(q)
      do something;
    
    if !(x || y || z || q)
      do something completely different.
    

    【讨论】:

    • 您最后的陈述与问题中的不一样,我认为您需要if !(x || y || z || q)
    • 我想使用 else 更好,用于阅读。你知道,确保我们没有留下漏洞
    • 我看不出这是如何“执行额外检查”的。毕竟你有相同数量的 if 语句:)
    • @Tim,这是一个额外的检查,因为在原始文件中,如果它是 x、y、z,它会跳到那个家伙的最后一部分。在我的情况下,它会转到 if z 部分。因此需要额外检查。
    【解决方案5】:

    我不推荐以下,事实上,我认为你得到的很好,但是:

    s = true;
    if (x) {
        do something;
        s = false;
    } else if (y) {
        do something;
        s = false;
    }
    if (z) {
        do something;
        s = false;
    } else if (q) {
        do something;
        s = false;
    }
    
    if (s) {
        so something;
    }
    

    【讨论】:

      【解决方案6】:

      你能对 x,y,z,q 做一些假设吗? 例如。只有其中之一可能是真的。比你能把它看作一个国家

      enum State {
      X{
        void doSomething(){
          doItTheXWay();
        }  
      },
      Y{
        void doSomething(){
          doItTheYWay();
        }  
      },
      Z{
        void doSomething(){
          doItTheZWay();
        }  
      },
      Q{
        void doSomething(){
          doItTheQWay();
        }  
      };
        void doSomething(){
      
        }
      }
      

      以及在您使用 if 语句的代码中

      你可以指定一个状态,然后做正确的事

      State state = getAState();
      state.doSomething();
      

      如果您不喜欢枚举,State 可以是一个接口,而 X 到 Q 可以是实现类。 这种情况下的好处是多次使用相同的 if else 构造。稍后再说一些代码行,您将从

      开始
      if(x)
        do_the_next_thing_with_X();
      ...
      

      或者你可以用另一个函数扩展你的枚举并进行一次调用

      state.doTheNextThing();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2021-09-22
        • 1970-01-01
        • 2012-05-11
        • 2016-05-05
        • 2013-08-17
        • 1970-01-01
        相关资源
        最近更新 更多