3

我继承了一些代码,并且在那里看到了一些奇怪的东西:

if (true == someFuncThatReturnsBool())
{
   // Do somthing
}

bool someFuncThatReturnsBool()
{
    bool retVal = false;
    // .... do some stuff

    return retVal;
}

在“if”语句中,它们用作true == someFuncThatReturnsBool()布尔表达式,对于布尔值,我通常会这样做:

if (someFuncThatReturnsBool())
{
   // Do somthing
}

如果有的话,与生成的代码有什么区别?使用“true ==”表示法有什么好处,除此之外,也许为了清楚起见,函数返回一个布尔值?...类型检查??,我个人看不出任何优势...

谢谢 :)

4

5 回答 5

5

如果有的话,与生成的代码有什么区别?

没有任何。

使用“true ==”表示法有什么好处,或者为了清楚起见,函数返回布尔值?

如果该函数命名不佳,那么也许我会编写显式版本。否则,如果从函数中可以看出它是布尔检查(即is_XXX时尚),则没有理由使用它。

于 2013-08-29T10:50:34.370 回答
2

someFuncThatReturnsBool在我看来,如果函数名称读起来只是一些值,而不是特别是布尔值,则可能会有一点可读性优势。成千上万的人(也许是大多数人)会因此而称我为白痴。

通常,布尔变量和函数将被命名为is_whateveror has_whatever。所以通常情况下,一个if语句读作if (is_whatever)or if (has_whatever)。如果我没有看到,或者当然是亲戚运营商,我觉得它有点臭。

但有时布尔变量和函数不使用该名称公式,特别是如果布尔类型是通过模板参数指定的。在这种情况下,我可能会使用if (whatever == true). 或者,使用尤达条件,即if (true == whatever).

可能的例子...

std::map<int,bool> items;

...

if (items.at (key) == true)
{
  ...
}

既不at也不items表示该值是布尔值。if (item)不正确 - 如果有的话,它暗示“如果这是一个项目”,这不是这里的意图。if (item == true)没有这种气味。

每次您重新访问该代码时,即使臭味代码是正确的,气味也会分散您的注意力,因此 IMO 值得使用一些额外的标记来清除这种气味。

这就是为什么我通常更喜欢命名某些东西is_whatever而不是whatever_flag. 虽然whatever_flag显然打算成为一个布尔值,但它仍然不是很正确。这是缩写英语的“语法”-“if flag”表示“如果这是一个标志”而不是“如果设置了这个标志”。

显然,一些新手写作if (whatever == true)是因为他们有这个心理模板,每个人都if需要一个相对的操作员。这个模板是错误的,所以这是那些白痴新手的刻板印象之一。还有一些其他类似的情况,大多是显而易见的,比如写作value + 0value * 1value && true。来自 Haskell 的一个稍微令人惊讶的...

main = do putStrLn "Hello World"

在此,“心理模板”是任何一元动作序列都需要一个do. 但是,在这种情况下,只有一个单子动作,因此无需将一系列动作组合成一个动作。所需要的只是...

main = putStrLn "Hello World"

在这种情况下,我将保留判断是否偶尔值得保留do以提高可读性 - 我没有经验。

无论如何,就个人而言,我认为嘲笑人们做某事,很难接受有时有一个有效的理由这样做。毕竟,心理模板是if (whatever == true)自动可笑的。

当然,如果你想要平静的生活,最好不要那样做。

于 2013-08-29T11:53:05.487 回答
1

除了显式比较的代码更长且更难阅读之外,没有什么区别。

于 2013-08-29T11:59:48.607 回答
1

这样做没有任何好处。如果从函数名称中看不出它应该返回一个布尔值,它可能会使其更具可读性,但在这种情况下,最好重命名函数

于 2013-08-29T10:48:42.180 回答
1

没有任何优势,编译器可能会丢弃“true ==”-part。如果函数名清楚地表明它返回一个布尔值(例如以“is”或“has”开头),那么您可以立即看到它返回一个布尔值。

也许用于将错误代码作为返回值返回的代码被重构为布尔值,但没有删除返回值检查?

于 2013-08-29T10:52:17.727 回答