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行),应该是:),那么使用一个返回点或多个返回点并不重要。两者可读性相同。
设计不当的大型功能开始出现问题。在这种情况下,从单个点返回和从多个点返回这两种样式都会进一步使函数复杂化,尽管在这种情况下,我更喜欢提前返回和在多个点返回。
正如奥德和安德泽多伊尔指出的那样,这没有什么问题。
说到这一点,他们可不是什么金科玉律。
在编写代码时,首先要记住的一件最重要的事情是,其他人必须阅读代码并从中获得意义。也许几个月后你就要开始了,如果你把事情搞得一团糟,你会后悔的。
我个人总是:
- 如果代码是新使用的,那么项目中其他所有人都使用的编码样式。
- 如果编辑其他代码,则使用已经在那里实现的编码样式。
- 首先要避免所有代码优化(编译器是最好的)。
- 保持清洁和苗条。