通过Return与If / Else控制流量

时间:2009-09-14 01:07:06

标签: c# coding-style control-flow

哪一个更好(通过返回隐藏控制流或通过返回控制流) - 见下文。请解释一下你认为哪个是优点/缺点。我喜欢选项A,因为它的代码更少。

通过返回流程:

public ActionResult Edit(MyClass class)
{
    if (!class.Editable)
       return null;

    class.Update();
    return View();
}

通过If / Else流程:

public ActionResult Edit(MyClass class)
{
    if (class.Editable)
    {
       class.Update();
       return View();
    }
    else
    {
       return null;
    }
}

12 个答案:

答案 0 :(得分:26)

这个具体的例子没什么区别,但总的来说我喜欢第一种方法,因为它使用guard clause提前返回。如果您开始向第二种方法添加嵌套条件,您将看到您的代码可读性会受到影响。 Guard子句可以大大减少嵌套深度,并且真正提高代码的可读性。

答案 1 :(得分:10)

我个人喜欢if/else方法。例如,您的if陈述是积极的,而不是消极的,使其更容易阅读。对于两个人,你已经用大括号括起条件,而且我是那种风格的粉丝。

无论如何,跟在第二场比第一场比赛更容易。这总是在我的书中获胜。

答案 2 :(得分:6)

为了可读性和可维护性,我更喜欢第二种方法。可读性,因为它比第一种方法对我来说更“清洁”,并且可维护性,因为如果我需要修改if或else子句,我不必担心添加花括号。此外,如果不包括新行,第一种方法只比第二种方法少7个字符,这似乎不太适合选择第一种方法。

那就是说,我其实更喜欢这个:

public ActionResult Edit(MyClass class)
{
    ActionResult rv = null;
    if (class.Editable)
    {
        class.Update();
        rv = View();
    }
    return rv;
}

这是更多的代码,但我现在可以在return语句上设置一个断点来检查返回的值,而不是必须设置两个断点来在你提供的两个选项中执行相同的操作。

答案 3 :(得分:3)

这两个语句都通过if语句来控制流量。这只是你如何处理这种情况的问题。

在编写像这样的逻辑语句时,我总是处于困境之中。我的一部分喜欢第一个选项,因为它的代码少了一点。我的另一部分喜欢第二种选择,因为它更容易遵循逻辑流程。使用第一个选项时,很容易错过返回语句,这可能导致将来出现可管理性问题。

...因此,第二个选项总是在我的书中获胜。编写比尝试使用快捷方式更容易阅读和维护的代码更好。

答案 4 :(得分:2)

我更希望我认为是那个执行较少代码的人 如果它更常见于class.Editable是假的那么我会去A.

但是这个例子在任何一种情况下都没有太大的优势。

在任何给定的情况下,开发人员应分析输入并调整要在最常见的输入数据上优化的代码。

修改
澄清:
通过执行更少的代码我实际意味着最有效...

答案 5 :(得分:2)

提前退出 - 我更愿意看到导致该方法退出的所有条件,而不需要预先做很多事情。如果我完全可以避免,我会避免其他陈述。

这实际上是代码合约人群中一个相当突出的思想流派。

答案 6 :(得分:1)

在这种情况下,我会使用选项A.在这种情况下,您正在进行输入验证,然后在输入无效(不可编辑)时阻止执行其余代码。这使得函数的整个主体不受大if / else语句的影响,并使其更具可读性。

但是,我也会考虑提出异常而不是重新调整null - 假设将不可编辑的对象传入“编辑”函数并不是正常现象。

答案 7 :(得分:1)

它们都是有效的选择,一个不一定比另一个好。你选择哪一个最终是个人偏好。是的,选项A导致略微更少的代码,但总体来说它们非常相等。

在这两种情况下,您都通过if和return来控制流量。这真的是一个问题,你更喜欢看你的布尔逻辑 - 消极还是积极?

ActionResult是枚举还是基类?如果它是枚举,当null返回看似枚举的内容时,为什么要返回Edit?仅仅返回一个ActionResult值表示没有采取任何操作,因为该对象不处于可编辑状态会不会更清晰?

答案 8 :(得分:1)

使用return的第一个选项更好,因为:

  1. 你有一个地方可以放置所有警卫和先决条件,靠近你的断言和所有这些东西。
  2. 对我来说,更容易想到“让我们看看所有可能出错的东西,然后回来。从这一点来说,我有我需要的一切,我在Happy Path
  3. 如果您使用if / else方法,则该方法/函数中的所有代码都会缩进。添加其他if,或for和thing开始搞笑
  4. 此方法的一个支持者(返回)是Marcus Zarra

    中的Cocoa is my Girlfriend coding style

答案 9 :(得分:0)

我更喜欢第一个选项,前提是您检查的情况是方法调用有效时需要满足的保护/前提条件。虽然您可以争辩是否应该返回null,或者抛出(Argument)异常。当一个类不可编辑时,它真的应该是这个方法的参数吗?

也许更好的选择是创建一个IEditable接口,并在你正在传递一个实例的类上实现它。

答案 10 :(得分:0)

我也喜欢if/else。对我来说,易读性,可读性和可维护性是最重要的。

答案 11 :(得分:-1)

我也更喜欢选项1.对我而言,它更像是一本书。此外,我总是对选项2结尾没有回报感到痛心。