我的同事刚刚查看了我的代码并说,根据"某些标准"从for循环中返回函数值是不好的做法。
该功能如下所示:
bool CentralWidget::isBitFieldFree(const QString& define, int lsb, int msb)
{
QString defineWithoutIndex = getDefineWithoutIndex(define);
for (int i = lsb; i <= msb; i++)
{
if ((registerBitMap[defineWithoutIndex] >> i) & 1)
return false; //Returning here early...
else
registerBitMap[defineWithoutIndex] |= 1 << i;
}
return true;
}
问题:
答案 0 :(得分:2)
在c++的世界中没有这样的标准。但是,在更具体的环境(例如公司)中,可能会采用专门的标准。
据说,一般来说,这是不错的做法。
a)禁止此的标准?
没有
b)这是一种令人着迷的不良做法吗?
没有
c)问题已经得到解答。
除此之外,它属于个人偏好的范围,这是我的 - 但这显然不是真正答案的一部分:
你想在循环你的字符串后返回true
,那你怎么能在循环中优雅地做呢?使用if
语句说如果它是最后一次迭代,则在循环结束时返回true
?
我认为这会在您的文件中添加更多代码行,没有任何理由,严重损害了可读性。
答案 1 :(得分:2)
有一种思想流派认为一个功能应该只有一个入口和一个出口点。这使得对代码的一些静态分析更容易,但在C ++中很可能没有其他目的。
这种想法主要来自C,通过单点退出函数可以很有意义,以确保在退出时正确清理函数最终获取的资源。在多个出口处复制这种清理被认为是脆弱的并且难以维护 - 我同意。
在C ++中,控制资源的首选方法是通过RAII或使用RAII类,如共享指针,string
和vector
。因此,在退出时清理资源所需的代码量通常为null,因为它是在本地作用域中的对象的析构函数中隐式完成的。因此,除非你有充分的理由这样做,否则通常没有任何意义强制执行单一进入/单一退出。
答案 2 :(得分:0)
对此可以有不同的看法,人们可能会认为这会导致“不直观”的控制流程。但是这有没有标准。
就个人而言,我发现这比一个额外的变量和条件退出代码更好。您希望在此时离开范围,并通过从函数返回来执行此操作。我有时甚至将代码放在一个额外的函数中,只是为了能够使用从任何地方离开范围的功能返回。
这也具有创建更少代码行的优势。并且更少的代码行引入错误的机会较少。
答案 3 :(得分:0)
在某些编码标准中,您可以找到“函数应该只有一个退出点”之类的内容。这通常与清理程序有关,但在智能指针的时代,这不再适用了。
所以,正如其他答案和评论所说:不,没有这样的标准。 另外,我不认为这是不好的做法。
更多:我会说你不需要'else',因为如果退出循环/函数,处理只会在'else'情况下继续。在你的情况下并不重要,但如果你有多个ifs,它可以为你节省很多麻烦。