3

我的同事刚刚看了我的代码并说,根据“某些标准”从 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;
}

问题

  1. 有没有禁止这个的标准?
  2. 这是被认为是不好的做法吗?
  3. 如果是这样:为什么?
4

4 回答 4

2

的世界中没有这样的标准。但是,在更具体的环境(例如公司)中,可能会应用专门的标准。

话虽如此,总的来说,这不是坏习惯。


a) 一个禁止这个的标准?

不。

b) 这是被认为是不好的做法吗?

不。

c) 问题已经回答。


除此之外,它属于个人喜好的范围,这是我的 - 但这显然不是真正答案的一部分:

你想 return true,在你循环了你的字符串之后,那么你怎么能在循环中优雅地做到这一点呢?有一个if语句说如果它是最后一次迭代,true在循环结束时返回?

我认为这会毫无理由地在您的文件中添加更多代码行,并严重损害可读性。

于 2016-09-29T09:32:10.550 回答
2

有一种观点认为,一个函数应该有一个入口和一个出口点。这使得对代码的一些静态分析更容易,但在 C++ 中很可能没有其他用途。

这种想法主要来自 C 语言,在 C 语言中,通过单点退出函数以确保函数最终占用的资源在退出时得到正确清理是很有意义的。跨多个出口复制这种清理被认为是脆弱且难以维护的——我同意。

然而,在 C++ 中,控制资源的首选方式是通过 RAII 或使用 RAII 类(如共享指针stringvector. 因此,在退出时清理资源所需的代码量通常为空,因为它是在本地范围内对象的析构函数中隐式完成的。因此,除非您有充分的理由这样做,否则强制执行单进单出通常没有任何意义。

于 2016-09-29T09:36:52.070 回答
1

在某些编码标准中,您可能会发现诸如“一个函数应该只有一个出口点”之类的东西。这通常与清理过程有关,但在智能指针时代,这不再适用。

因此,正如其他答案和评论所说:不,没有这样的标准。另外,我不认为这是不好的做法。

甚至更多:我会说你不需要'else',因为如果你退出循环/函数,处理只会在'else'的情况下继续。在您的情况下并不重要,但如果您有多个 if,它可以为您节省大量嵌套。

于 2016-09-29T09:36:56.373 回答
0

对此可能有不同的看法,人们可能会争辩说它会产生“不直观”的控制流。但这没有标准

就我个人而言,我发现这比有一个额外的变量和条件来退出代码更好。此时您想离开作用域,并通过从函数返回来做到这一点。有时我什至将代码放在一个额外的函数中,以便能够使用从任何地方离开范围并返回的功能。

这还具有创建更少代码行的优点。更少的代码行是更少的引入错误的机会。

于 2016-09-29T09:36:39.023 回答