为什么Objective-C使用YES/NO宏约定而不是true/false?

18

大多数编程语言使用true/false关键字表示布尔值。我发现即使Smalltalk也使用true/false。我知道Objective-C只是从Smalltalk借鉴了一些概念,而不是整个语言,但我很好奇它为什么使用YES/NO而不是更广泛使用的true/false。是否有历史原因?


这是一个有趣的问题,而且不是我会想到去问的。好主意。 - user457812
"Instead of?"的意思是:两组宏都可以正常工作——根据上下文选择适当的宏即可。 - Sherm Pendley
5个回答

35

Objective-C被设计成(并仍然是)C的严格超集。创建者非常努力地确保他们在任何方面都不会破坏与C的兼容性。他们还试图使自己的修改有些明显,以便易于区分哪些代码部分使用Objective-C,哪些部分使用普通C语言。例如,@用于表示NSString而不仅仅使用引号。这样可以使普通C字符串与新字符串共存。

C已经有了一个TRUE/FALSE宏的非正式系统。我怀疑Objective-C的设计者选择了YES/NO宏以避免冲突,并使其明显表明代码实际上是Objective-C。 还要注意使用nil来表示“空”对象,而不仅仅是修改了老旧的NULL的行为。


对于这个问题,大多数其他回答只是说“因为YES比TRUE更易于理解/阅读”,但是我认为这个解释并不充分。 - noamtm

4

Objective-C是一种非常冗长的语言,所有方法都非常描述性,使用YES/NO代替true/false作为布尔值使其更易于阅读。

如果以下对话在现实生活中发生,你可能会觉得很奇怪: A:“你看过那部电影吗?” B:“True”

如果B回答了“yes”(或“no”),那么听起来就很正常,通过使用YES/NO而不是true/false,代码看起来更像是普通英语。


2
嗯...我对“普通英语”解释并不太确定。如果他们的意图是提供清晰度,那么遵循几十年的惯例不是更有意义吗? - FreeAsInBeer
但是 Objective-C 已经使用了这个约定几十年了?哦,你指的是其他语言... ;) 大多数并不总是正确的。如果你设计一种语言,你会不会更希望这种语言尽可能地变得更好,而不是尽可能地与其他语言兼容呢?根据 Objective-C 的可读性与其他语言相比较的结果,我的猜测是设计者们更加看重普通英语,而不是与其他语言的句法相似。 - Morten Fast
我理解你的观点,即大多数并不总是正确的,但作为反例,我提供世界语,这是一种创造出来的语言,可以使几乎任何人进行对话,但尽管已经有一个多世纪的历史,它仍未真正流行起来。 - FreeAsInBeer

3

苹果一直试图让事情更容易使用。如果您阅读一些系统布尔方法并思考如何用更合理的方式回答布尔问题,使用 YES|NOTRUE|FALSE,您会发现在我看来,答案是 YES|NO

否则,您可以在您的代码中始终使用 TRUE|FALSE


2
很奇怪,但是我发现使用YES/NO宏定义代码更易读(也可以使用TRUE/FALSE)。然而,Objective-C现在是C99的超集,所以应该尽可能使用C99的boolean类型和true/false。我曾经考虑过将yesno定义为truefalse,但到目前为止我还是抵制了这个想法。

2
最好的理解方式是这是一种并行进化。
Objective-C中的BOOL和YES/NO可以追溯到20世纪80年代初,很可能不仅是为了模仿其他语言,而且错过了C语言的未来发展。在1999年,C语言中的_Bool、true/false才被纳入标准。
那么YES和NO是历史遗留问题吗?是的。它们只是历史遗留问题吗?不是。正如NULL不是纯粹意义上3-3的结果(尽管NULL通常被定义为0,或者如果可以的话,随意使用),true不是BOOL的值。
您不会(我想)编写以下代码:
int matches = NULL;
for (int i = 0; i<count; ++i) {
    if (array[i] == value) ++matches;
}

这个句子可能不太明显错误,但它属于同一范畴:
BOOL foundMatch = false;
for (int i = 0; i<count; ++i) {
    if (array[i] == value) {
        foundMatch = YES;
        break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接