C# - 编写方法块

时间:2009-08-25 00:04:27

标签: c# methods

这是关于方法块结构的一般问题。鉴于以下两种替代方案,有没有人对什么是更好的设计方法有意见?

private void Method1()
{
    if (!A)
    {
        return;
    }

    if (!B)
    {
        return;
    }

    if (!C)
    {
        return;
    }

    // DO WORK.......

    return;
}

private void Method2()
{
    if (A)
    {
        if (B)
        {
            if (C)
            {
                // DO WORK.......

                return;
            }
        }
    }

    return;
}

10 个答案:

答案 0 :(得分:10)

我更喜欢方法1,即“提前退出”方法。在我看来,它更清楚。我真的试图避免许多嵌套的'if'语句。

另外,你不能在void方法中返回'null':)

答案 1 :(得分:4)

个人偏好。

我想我会更喜欢这样做:

if(A && B && C) {
   // Do Work...
   return;
}

答案 2 :(得分:2)

第一种方法值得商榷 - 个人偏好有多个条件或单个OR。

然而,第二种方法是坏的,坏的,。单个方法中的多个缩进级别只是要求错误 - 可维护性和可读性都会下降。众所周知,widely written about and documented

答案 3 :(得分:2)

在完成任何有用的工作之前,以三个if语句开头的方法具有明显的污垢代码气味。

如果你的方法以一串if语句开头,请暂停一下,重新计算,然后继续。

或许switch语句比if语句字符串更好。

答案 4 :(得分:1)

您正在交易返回语句的标签。你打电话。

我个人喜欢C ++的#2,你正在处理自动释放对象(例如CComPtr,AutoPtr等),但在C#中没有必要这样做。我倾向于使用C#的第一个例子,因为你有垃圾收集,你可以少担心确保你在早期退出时清理所有内容。

答案 5 :(得分:1)

我会走出一条腿,说这可能是代码味道。我不认为应该教条地遵循旧的“唯一退出”编码哲学,但方法中的许多退出点可能与深度嵌套的IF语句一样,都是维护噩梦。

当看到其中任何一个时,重构灯应该遍布整个地方。

答案 6 :(得分:1)

我倾向于尝试使用看起来相当容易阅读的东西:

private void Method1()
{
    if (!A ||
        !B ||
        !C)
    {
        return;
    }
    else if(D)
    {
        return y;
    }

    // DO WORK...

    return X;
}

但正如其他人提到的那样,除非你的工作场所指定了一个高于其他标准的标准,否则它完全是个人的首选。

答案 7 :(得分:1)

前置条件逻辑可以分解为单独的方法:

private Boolean CanContinue()
{
  return A && B && C;
}

private void Method1()
{
  if (CanContinue())
  {
    // Do work...
  }
}

这有几个好处:

  • 前置条件逻辑是单元测试的潜在候选者。
  • 逻辑可以重复使用。
  • 当逻辑复杂时,我认为如果将其封装在自己的方法中则更容易理解和维护。

答案 8 :(得分:0)

怎么样:

if(A && B && C)
{
     //Do work
}

return;

if(!A || !B || !C)
{
     return;
}

    //Do work

答案 9 :(得分:-1)

嗯,首先,void方法不能返回值,但假设你要返回一个int?。

private int? method3 ()
{
  int? retVal;
  if (A && B && C)
  {
    // do work
    retVal = x;
  }
  return retVal;
}