您好,
gcc 4.4.4 c89
从函数中的1点返回是否是良好的编程习惯。
我在下面写了一个函数。但是,我从2个可能的点返回。
这是好风格吗?
static int init_data(struct timeout_data_t *timeout_data)
{
if(timeout_data == NULL) {
fprintf(stderr, " [ %s ] [ %d ]\n",
__func__, __LINE__);
return FALSE;
}
/* Assign data */
timeout_data->seconds = 3;
timeout_data->func_ptr = timeout_cb;
return TRUE;
}
答案 0 :(得分:11)
如果它有助于提高可读性,那么它就没有任何问题。
就个人而言,我一直在写这种代码。
答案 1 :(得分:7)
这是一场持续的宗教式辩论,没有得到公认答案。在争论的双方都有很多的人,他们对此有强烈的感受。
我个人并不认为这有任何问题,但最好的办法是遵循你团队的风格指导方针,如果他们有一些(如果没有的话,只是问一下。如果有人反感恐怖,坚持单回归会更好。
答案 2 :(得分:4)
为了“可读性”,我已经让1位回归政策的管理者生活和死亡,即使在某些情况下没有它也更具可读性。
最重要的是...如果签署薪水的人说你只打算使用1回报,那么使用1回报。最好的方法是
type myfunc(params) {
type result = defaultValue;
// actual function here, word for word
// replace "return $1" with "result = $1"
return result;
}
这是在他们的书中做事的有效方式,并会对你的1回报政策坚持微笑。当然,你知道使用它会增加ZERO可读性,因为你所做的就是用“result =”代替“return”(这是语法高亮显示),而不是。但是你让你的老板感到高兴,当你把它全部打破时,无论如何都要发展,对吧? : - )
答案 3 :(得分:2)
在C语言中,我认为函数顶部的错误检查/参数验证带有返回(或者参数验证中甚至可能有多个返回点)会导致代码相当干净。不过,在那之后,我的观点是,在函数的底部有一个单一的返回是个好主意。这有助于避免可能在函数的工作中分配的清理问题(例如,释放内存)。
答案 4 :(得分:2)
拥有多个退出点并没有任何内在错误,尤其是当您返回错误时。立即返回通常会使代码更清晰,而不是将整个事件包装在if / else语句中并设置一些结果标志以在结尾处返回。 (当您看到“返回结果;”时,您必须查看所有早期代码,以查看结果的设置方式和时间。更多移动部件==清晰度更低。)
答案 5 :(得分:2)
您已将问题标记为“C”,这会产生影响。
在C语言中,您可以编写诸如
之类的代码open file
process data
close file
如果您在流程数据部分的中间放置一个返回,那么您可能会跳过必要的清理工作,因此有多个返回点可能被认为是不好的做法,因为它很容易搞砸。
如果它是C ++,那么让析构函数处理清理的最佳做法就是它几乎不是一个潜在的问题所以这个建议在c ++中有点过时了
答案 6 :(得分:1)
正如Oded和Andrzej Doyle所指出的那样,没有任何问题。
在谈到这一点时,他们不是一个黄金法则。
在编写代码时,您必须牢记的第一个最重要的事情是,其他人必须阅读它并从中理解。也许你将在几个月内完成它,如果你弄得一团糟,你会后悔的。
我个人总是这样:
答案 7 :(得分:1)
如果你的功能足够小(10-15行),应该是:),那么使用单个返回点或多个返回点真的无关紧要。两者都同样可读。
使用设计糟糕的大型功能开始出现问题。在这种情况下,从单个点返回并从多个点返回的样式都会使函数复杂化,尽管在这种情况下我更喜欢早期返回并在多个点返回。
答案 8 :(得分:1)
通常情况下,在开始实际工作之前,您必须检查几个条件等,然后您很想提前返回,就像在代码中一样。我认为这对于简短的方法来说很好,但是当它变得更复杂时,我建议在“设置和检查”方法和“实际工作”方法中破坏你的代码,两者都只有一个退出。当然,只要它是可重新编辑的,就可以有多个返回(例如在一个长的switch语句中)。
答案 9 :(得分:1)
早期失败(并因此返回)是一种非常非常好的做法。检查后的所有代码都没有很多潜在的错误。