【问题标题】:How would I simplify this code?我将如何简化此代码?
【发布时间】:2011-11-24 20:01:29
【问题描述】:
boolean f(boolean A, boolean B, boolean C, boolean D, boolean E)
{
  if (A)
  {
    k();
    if (B)
    {
      m();
      if (C)
      {
        n();
        if (D)
        {
          p();
          if (E)
          {
            q();
            return true;
          }
          else
          {
            r();
            return false;
          }
        }
        else
        {
          s();
          return false;
        }
      }
      else
      {
        t();
        return false;
      }
    }
    else
    {
      v();
      return false;
    }
  }
  else
  {
    w();
    return false;
  }
}

【问题讨论】:

标签: readability optimization


【解决方案1】:

可能只能通过多次评估条件来展平ifs:

if (A) k(); else w();
if (A && B) m(); else if(A && !B) v();
if (A && B && C) n(); else if (A && B && !C) t();
if (A && B && C && D) p(); else if (A && B && C && !D) s();
if (A && B && C && D && E) q(); else if (A && B && C && D && !E) r();

return (A && B && C && D && E);

【讨论】:

    【解决方案2】:

    在不了解您正在解决的问题的情况下,我会将其重写为

    boolean f(boolean A, boolean B, boolean C, boolean D, boolean E)
    {
      if (A) k();
      if (A && B) m();
      if (A && B && C) n();
      if (A && B && C && D) p();
      if (A && B && C && D && E) { q(); return true; }
      if (A && B && C && D && !E) { r(); return false; }
      if (A && B && C && !D) { s(); return false; }
      if (A && B && !C) { t(); return false; }
      if (A && !B) { v(); return false; }
      if (!A) { w(); return false; }
    }
    

    在我看来,这让我们更容易理解这些场景。
    然而,这仍然是绝对可怕的。 您最可能想要的是某种算法模式,其中不同的行为被实现为实现相同接口的不同类,您可以根据多态性选择行为,或者在对象创建期间注入算法。
    基本上,每个采用多个布尔参数的方法都是代码异味。

    【讨论】:

      【解决方案3】:

      如果调用方法的顺序不重要,那么:

      failedOnce = false
      for ar as Array in [
          (A, K, W)
          (B, M, V)
          (C, N, T)
          (D, P, S)
          (E, Q, R)
          ]:
          if ar[0]:
              ar[1].Invoke()
          else:
              ar[2].Invoke()
              break
              failedOnce = false
      
      return not failedOnce
      

      【讨论】:

      • 这优化了长度,是的,但并不特别容易阅读。
      • 即使Afalse 也会调用B 的方法,不是吗?
      • @MK,我想说这更容易阅读,也更容易维护,因为逻辑在一个地方,并且条件与函数的链接非常简单地排列在数组列表中,并且后者你很可能想要改变。
      • @GSerg:是的,你是对的,经过编辑,现在应该是正确的。
      【解决方案4】:

      在最近的一次工作面试中,我被要求优化此代码。

      这是我想出的代码版本:

      boolean f(boolean A, boolean B, boolean C, boolean D, boolean E )
      {
          boolean success = false;
      
          // I use "==false" because it's more readable than "if !A"
          if(A == false)
          {
              w();
          } else {
              if(B == false)
              {
                  v();
              } else {
                  m();
                  if(C == false)
                  {
                      n();
                      if(D == false)
                      {
                          s();
                      } else {
                          if(E == false)
                          {
                              r();
                          } else {
                              q();
                              success = true;
                          }
                      }
                  }
              }
          }
      
          // this will be "false" in all cases except one
          return (success);
      }
      

      我的答案背后的逻辑是尝试保持可读性,同时减少“返回”的数量。

      这是招聘人员真正想要的答案:

      boolean f(Boolean A, Boolean B, Boolean C, Boolean D, Boolean E)
      {
          boolean result = false;
      
          do
          {
              if (!A)
              {
                  w();
                  break;
              }
      
              k();
              if (!B)
              {
                  v();
                  break;
              }
      
              m();
              if (!C)
              {
                  t();
                  break;
              }
      
              n();
              if (!D)
              {
                  s();
                  break;
              }
      
              p();
              if (!E)
              {
                  r();
                  break;
              }
      
              // All conditions satisfied
              result = true;
      
          } while (false);
      
          return result;
      }
      

      这使用了狡猾的 do-once-and-only-once 循环,当某些条件失败时,“break”会退出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多