someFuncThatReturnsBool
在我看来,如果函数名称读起来只是一些值,而不是特别是布尔值,则可能会有一点可读性优势。成千上万的人(也许是大多数人)会因此而称我为白痴。
通常,布尔变量和函数将被命名为is_whatever
or 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 + 0
,value * 1
或value && true
。来自 Haskell 的一个稍微令人惊讶的...
main = do putStrLn "Hello World"
在此,“心理模板”是任何一元动作序列都需要一个do
. 但是,在这种情况下,只有一个单子动作,因此无需将一系列动作组合成一个动作。所需要的只是...
main = putStrLn "Hello World"
在这种情况下,我将保留判断是否偶尔值得保留do
以提高可读性 - 我没有经验。
无论如何,就个人而言,我认为嘲笑人们做某事,很难接受有时有一个有效的理由这样做。毕竟,心理模板是if (whatever == true)
自动可笑的。
当然,如果你想要平静的生活,最好不要那样做。