代码之家  ›  专栏  ›  技术社区  ›  Mike Roosa

写这个if.then逻辑最干净的方法是什么?

  •  8
  • Mike Roosa  · 技术社区  · 16 年前

    他们都做同样的事情。有一种方法更好吗?显然,如果我写代码,我会知道我做了什么,但其他人读它怎么样?

    if (!String.IsNullOrEmpty(returnUrl))
    {
        return Redirect(returnUrl);
    }
    return RedirectToAction("Open", "ServiceCall");
    

    if (!String.IsNullOrEmpty(returnUrl))
    {
       return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Open", "ServiceCall");
    }
    
    17 回复  |  直到 16 年前
        1
  •  30
  •   Andrew Rollings    16 年前
    return String.IsNullOrEmpty(returnUrl) ? 
                RedirectToAction("Open", "ServiceCall") : 
                Redirect(returnUrl);
    

    我更喜欢这样。

    或者另一种选择:

    return String.IsNullOrEmpty(returnUrl)  
                ? RedirectToAction("Open", "ServiceCall")  
                : Redirect(returnUrl);
    
        2
  •  24
  •   Gavin Miller    16 年前

    我认为最好去掉not(否定),先得到肯定的断言:

    if (String.IsNullOrEmpty(returnUrl))
    {
       return RedirectToAction("Open", "ServiceCall");
    }
    else
    {
        return Redirect(returnUrl);
    }
    

    -或-

    // Andrew Rollings solution
    return String.IsNullOrEmpty(returnUrl) ? 
                        RedirectToAction("Open", "ServiceCall") : 
                        Redirect(returnUrl);
    
        3
  •  21
  •   krosenvold    16 年前

    一个风格问题:

    if (String.IsNullOrEmpty(returnUrl))
    {
        return RedirectToAction("Open", "ServiceCall");
    }
    return Redirect(returnUrl);
    

    当你取消双重否定时,无论你选择哪种括号样式,它读起来都要好得多。读起来更好的代码总是最好的;)

        4
  •  9
  •   Scott Evernden    16 年前

    第二种方式更好,不要混淆你的意思。..

        5
  •  9
  •   Dana    16 年前

    我认为这是一个相当小的风格问题。我认为你的两个样本同样可读。

    我更喜欢前者,但其他人只喜欢函数的一个出口点,可能会建议如下:

    if (!String.IsNullOrEmpty(returnUrl))
    {
       result = Redirect(returnUrl);
    }
    else
    {
        result = RedirectToAction("Open", "ServiceCall");
    }
    
    return result;
    
        6
  •  5
  •   recursive    16 年前

    我喜欢第一个例子,因为这段摘录更明显 返回。如果两者都有 return s是缩进的方块,只需要多花一点心思就能分辨出来。

        7
  •  1
  •   user60400    16 年前

    消除“双重否定”,使用完全展开的风格。我相信现在大多数编译器都可以为您适当地优化代码,所以没有理由为了可读性而走捷径。

        8
  •  1
  •   Owen    16 年前

    如果这是整个方法,那么我会说第二个(使用else)更优雅。如果在else的情况下,在返回之前有前面的代码或(特别是)更多的代码,我会说最好不要放else。防止代码过于缩进。

    即:

    void myfunc()
    {
        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Open", "ServiceCall");
        }
    }
    

    void myfunc()
    {
        // ... maybe some code here ...
    
        if(!String.IsNullOrEmpty(returnUrl))
        {
           return Redirect(returnUrl);
        }
    
        // ... a bunch of other code ...
    
        return RedirectToAction("Open", "ServiceCall");
    }
    
        9
  •  1
  •   too much php    16 年前

    由于不可避免的双重否定逻辑,这段代码感觉很混乱(四处洗牌并不能解决问题)。无论你使用哪种安排,我认为你都应该添加一些评论,这样读者就不需要重复阅读:

    if (!String.IsNullOrEmpty(returnUrl))
    {
      // hooray, we have a URL
      return Redirect(returnUrl);
    }
    else
    {
      // no url, go to the default place
      return RedirectToAction("Open", "ServiceCall");
    }
    
        10
  •  0
  •   mbeckish    16 年前

    怎么样:

    if (!String.IsNullOrEmpty(returnUrl))
        return Redirect(returnUrl);
    else
        return RedirectToAction("Open", "ServiceCall");
    
        11
  •  0
  •   bcorriveau    16 年前

    别以为还有更好的办法。..这取决于每个开发人员。这就是为什么在开始一个项目之前,你应该决定什么是编码标准。..

        12
  •  0
  •   Community CDub    8 年前

    here ,但更易读:

    return
      string.isNullorEmpty(returnUrl) ? 
         RedirectToAction("Open", "ServiceCall") :
         Redirect(returnUrl);
    

    这种方法有效,可读且不冗余。

        13
  •  0
  •   OscarRyz    16 年前

    我更喜欢第一个。

    if ( ) 
    {
        return ... 
    }
    return 
    

    对我来说,它读起来像是一个“默认值”,你可以链接更多的条件,但最后有一个默认值。

    当然,这是一个风格问题。

    附加问题。

    将方括号放在一行中是C#风格吗?

    if ( ) 
    {
    }
    else
    {
    }
    

    我在SO中看到这种情况渗透到Java代码示例中,我想知道这是根本原因。

    编辑

    @欧文。 我的意思是,使用这种形式是C#风格吗?

    if ()  
    {
        code ... 
    }
    else
    {
        code...
    }
    

    而不是这个(这将是 Java preffered )

    if ( ) { 
        code ... 
    } else { 
       code ...
    }
    

    我过去对此有过一些争论,但大多数时候,只有来自C#背景的人。

        14
  •  0
  •   devstuff    16 年前

    从维护的角度来看,我更喜欢第一个版本。我看到了更少的错误与一贯的“尽早退出”风格。

    三元运算符(?:)是可以的,但前提是新代码不太可能在第二条return语句之前插入。否则,当需要在第二个代码路径中添加新内容时,三元语句无论如何都必须恢复为if/else块。

        15
  •  0
  •   Ray Hidayat    16 年前

    当我只有一行时,有时我会像这样压缩if语句:

    if(String.IsNullOrEmpty(returnUrl)) { 
      return RedirectToAction("Open", "ServiceCall"); 
    }
    else{ return Redirect(returnUrl); }
    

    虽然当我看到它时,Andrew Rollings可能有最好的解决方案,尽管直到今天我才想过使用它。

        16
  •  0
  •   Community CDub    8 年前

    LFSR "else" solution 是最易于维护和阅读的。

    使用单独 else 子句允许添加逻辑,而不会无意中改变流程。有多个出口点而不在一个三元运算符语句中隐藏其中两个出口点已经够糟糕的了!

        17
  •  -1
  •   igorgue    16 年前

    第一个。如果你在if语句中返回一个值,则不需要任何其他值。所以:

    if (!String.IsNullOrEmpty(returnUrl))
        return Redirect(returnUrl);
    return RedirectToAction("Open", "ServiceCall");