18

哪个更好(通过return的隐式控制流或通过if的控制流)——见下文。请解释您认为对其中任何一个的优势/劣势。我喜欢选项 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;
    }
}
4

12 回答 12

28

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

于 2009-09-14T01:27:40.403 回答
10

我个人喜欢这种if/else方法。一方面,你的if陈述是积极的,而不是消极的,使它更容易阅读。对于两个,您将条件封装在大括号中,我是这种风格的粉丝。

无论如何,了解第二个中发生的事情比第一个要容易得多。这总是在我的书中获胜。

于 2009-09-14T01:09:55.603 回答
7

为了可读性和可维护性,我更喜欢第二种方法。可读性,因为它比第一种方法对我来说更“干净”,并且可维护性,因为如果我需要修改 if 或 else 子句,我不必担心添加花括号。此外,如果不包含新行,第一种方法仅比第二种方法少 7 个字符,这似乎很难成为选择第一种方法而不是第二种方法的理由。

也就是说,我实际上更喜欢这个:

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

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

于 2009-09-14T01:15:04.957 回答
3

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

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

...因此,在我的书中,第二种选择总是获胜。编写更易于阅读和维护的代码比尝试走捷径要好。

于 2009-09-14T01:12:08.983 回答
2

我更喜欢我认为是执行较少代码的那个。
如果 class.Editable 为 false 更常见,那么我会选择 A。

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

在任何给定情况下,开发人员都应该分析输入并调整代码以针对最常见的输入数据进行优化。

编辑:
澄清:
通过执行更少的代码,我实际上的意思是最有效的......

于 2009-09-14T01:12:40.983 回答
2

提前退出 - 我更喜欢查看所有会导致方法退出的条件,而无需预先做太多事情。如果我能避免的话,我会避免使用 else 语句。

这实际上是 Code Contracts 人群中相当突出的思想流派。

于 2009-09-14T01:28:29.653 回答
1

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

但是,我也会考虑引发异常而不是重新调整 null - 这是假设将不可编辑的对象传递给“编辑”函数不是正常情况。

于 2009-09-14T01:12:25.197 回答
1

它们都是有效的选择,并且一个不一定比另一个更好。您选择哪一个最终是个人喜好。是的,选项 A 产生的代码少,但总的来说它们几乎相等。

在这两种情况下,您都通过 if 和 return 来控制流程。这真的是一个问题,您更喜欢如何看待您的布尔逻辑 - 负数还是正数?

ActionResult枚举还是基类?如果它是一个枚举,nullEdit返回看起来是一个枚举的东西时,你为什么要返回?仅仅返回一个ActionResult表明没有采取任何行动的值,因为对象不是处于可编辑状态,难道不是更简洁吗?

于 2009-09-14T01:23:22.950 回答
1

我也喜欢if/else。对我来说,易读性、可读性和可维护性高于一切。

于 2009-09-14T02:03:00.270 回答
1

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

  1. 你有一个地方可以放置所有的警卫和先决条件,靠近你的断言和所有这些东西。
  2. 对我来说,更容易思考“让我们看看所有可能出错的地方,然后返回。从这一点开始,我拥有了我需要的一切,我走上了幸福的道路
  3. 如果您确实使用 if / else 方法,则该方法/函数中的所有代码都会缩进。添加其他 if 或 for,事情开始变得有趣

One proponent of this method (return) is Marcus Zarra, in the Cocoa is my Girlfriend coding style

于 2013-04-30T08:26:03.133 回答
0

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

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

于 2009-09-14T01:26:14.977 回答
-1

我也更喜欢选项 1。对我来说,它像书一样读起来更好。此外,我总是为选项 2 结束时没有返回而感到痛苦。

于 2009-09-14T01:12:42.417 回答