关于C#:函数中从1点返回


return from 1 point in function

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Should a function have only one return statement?

你好,

GCC 4.4.4C89

在函数中从1点返回是否是良好的编程实践?

我在下面写了一个函数。但是,我将从两个可能的点返回。

这款式好吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static int init_data(struct timeout_data_t *timeout_data)
{
    if(timeout_data == NULL) {
        fprintf(stderr," [ %s ] [ %d ]
"
,
            __func__, __LINE__);
        return FALSE;
    }

    /* Assign data */
    timeout_data->seconds = 3;
    timeout_data->func_ptr = timeout_cb;

    return TRUE;
}


如果它有助于可读性,那么就没有什么问题。

就我个人而言,我一直在写这种代码。


这是一个正在进行的宗教式辩论,没有一个公认的答案。争论的双方都有很多人对此有强烈的感觉。

我个人并不认为这有什么问题,但是最好的方法是遵循你团队的风格指导方针,如果他们有(如果没有的话,问一下)。如果有人在恐惧中退缩,坚持单一的返回点会更好)。


为了"可读性",我曾经有过一些经理为了"1返回"政策而生死攸关,尽管在某些情况下,没有它的情况下,它的可读性要高得多。

底线是…如果在你的工资单上签字的人说你只打算用1个退换货,那就用1个退换货。最好的方法是

1
2
3
4
5
6
7
type myfunc(params) {
    type result = defaultValue;
    // actual function here, word for word
    // replace"return $1" with"result = $1"

    return result;
}

这是一个有效的方法来做他们书中的事情,并会微笑你的1回报政策的坚持。当然,您知道使用它增加了零可读性,因为您所做的只是将"return"(语法突出显示)替换为"result="而不是。但是你已经让你的老板高兴了,当你把一切都搞砸的时候,这就是发展的意义所在,对吧?-)


你已经将你的问题标记为"C",这会有所不同。

在C语言中,您可以编写代码,例如

1
2
3
open file
process data
close file

如果您将一个返回放在流程数据部分的中间,那么您可能会跳过基本的清理,因此拥有多个返回点可能被视为不好的做法,因为这很容易弄乱。

如果是C++,那么它最好的做法是让析构函数处理清理,因此它几乎不是一个潜在的问题,所以这个建议在C++中有些过时了。


拥有一个以上的退出点并没有什么本质上的错误,尤其是当你在错误中返回时。立即返回通常比将整个内容包装在if/else语句中并在结尾处设置一些返回的结果标志更清晰。(当您看到"return result;"时,您必须查看所有早期的代码,以了解如何以及何时设置结果。运动部件越多==清晰度越低。)


在直C语言中,我认为在函数顶部使用返回(甚至可能是参数验证中的多个返回点)进行错误检查/参数验证会导致代码相当干净。不过,在这之后,我的观点是在函数的底部有一个单独的返回是一个好主意。这有助于避免可能在函数工作中分配的清理(例如释放内存)问题。


及早失败(并因此返回)是一个非常好的做法。检查后的所有代码都没有很多潜在的错误。


通常情况下,在开始真正的工作之前,您必须检查几个条件等,然后像在您的代码中一样,尝试提前返回。我认为对于短方法来说这是可以的,但是当它变得更复杂时,我建议将代码分解为"设置和检查"方法和"实际工作"方法,两者都只有一个出口。当然,只要它是可读的,就可以有多个返回(例如在long switch语句中)。


如果您的函数足够小(10-15行),应该是:),那么使用一个返回点或多个返回点并不重要。两者可读性相同。

设计不当的大型功能开始出现问题。在这种情况下,从单个点返回和从多个点返回这两种样式都会进一步使函数复杂化,尽管在这种情况下,我更喜欢提前返回和在多个点返回。


正如奥德和安德泽多伊尔指出的那样,这没有什么问题。

说到这一点,他们可不是什么金科玉律。

在编写代码时,首先要记住的一件最重要的事情是,其他人必须阅读代码并从中获得意义。也许几个月后你就要开始了,如果你把事情搞得一团糟,你会后悔的。

我个人总是:

  • 如果代码是新使用的,那么项目中其他所有人都使用的编码样式。
  • 如果编辑其他代码,则使用已经在那里实现的编码样式。
  • 首先要避免所有代码优化(编译器是最好的)。
  • 保持清洁和苗条。