有一个终止条款时的最佳做法是什么...见解释:)

时间:2008-09-28 10:22:47

标签: c#

案例如下: 您有一个名为FullScreenEnabled的布尔属性。输入一些方法,如果FullScreenEnabled为true,则执行此方法中的代码。您在日常编程中使用以下两种方法中的哪一种:

    private bool FullScreenEnabled { get; set; }
    // Check if FullScreenEnabled is false and return;
    private void Case1()
    {
        if (FullScreenEnabled == false)
        {
            return;
        }

        // code to be executed goes here!
    }

    // Surround the code by an if statement.
    private void Case2()
    {
        if (FullScreenEnabled)
        {
            // code to be executed goes here!
        }
    }

10 个答案:

答案 0 :(得分:11)

private void MyMethod(bool arg){
   if(arg)
       return;
   //do stuff
};

(投票)

答案 1 :(得分:3)

我通常更喜欢第一个版本(在方法开始时退出)。它导致较少的嵌套,这略微提高了可读性。如果您决定将来不需要检查条件,那么在第一个版本中删除if条件也会更容易,特别是如果您有几个这样的检查。另外,它可以很容易地写成一行:if(!FullScreenEnabled)return;

答案 2 :(得分:1)

这取决于方法的长度和复杂性。如果方法很短,那么嵌套在if中是没有问题的(并且可能更清楚)。如果该方法有很多嵌套语句,那么立即返回将减少必要的缩进量,并可能略微提高可读性。

答案 3 :(得分:1)

第一种方法(使用保护条款)可以更好地扩展,如果添加更多。第二种方法的问题是,添加更多 if 语句会导致代码显示arrow anti-pattern,其中代码开始被设置为箭头。

有一篇非常好的文章在下面详细解释了这一点:

Coding Horror: Flattening Arrow Code

答案 4 :(得分:0)

这两种方法都没有发布。您应该阅读editing help以确保代码实际显示。

答案 5 :(得分:0)

是否应测试正数或负数,即如果条件不满足则返回方法,或仅在条件满足时执行代码。在一个简短的方法中,我会选择后一种情况,用很长的方法,我会选择前者。当有几个条件需要测试时,我总是会提前退出。但它确实没有什么区别。

但是请注意,您的示例中是与false的比较。你应该写!FullScreenEnabled。使代码更具可读性。

答案 6 :(得分:0)

if (!FullScreenEnabled)
    throw new InvalidOperationException("Must be in fullscreen mode to do foo.");

我的两分钱,因为它的价值。

答案 7 :(得分:0)

无论哪种方式都一样。

但是,如果您为单元测试运行代码覆盖率指标,则if (!FullScreenEnabled) return;将计为单独的块,您必须创建一个单元测试以覆盖它以达到100%。

当然,即使使用其他方法,您也可能希望进行单元测试,以验证在FullScreenEnabled为false时您没有执行代码。但如果你作弊但不写,你仍然得到100%。 : - )

答案 8 :(得分:0)

我会采用第一种方法,我发现它比第二种方法更具可读性。 基本上我认为:

  1. if (FullScreenEnabled == false)if (FullScreenEnabled)更具可读性。
  2. 如果你继续在方法的开头进行“理智”检查,那么该方法会得到一个很容易理解的漂亮结构。
  3. 然而,我认为这里有一个不需要交叉的细线,将return语句放在方法中间的太多地方确实会使它更复杂

答案 9 :(得分:-1)

private void MyMethod(bool arg){
    if(!arg){
        //do stuff
    }
}

(投票)