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

时间:2011-06-21 06:01:15

标签: objective-c naming-conventions boolean convention

大多数语言都使用true/false关键字作为布尔值。我发现即使是Smalltalk也在使用true/false。我知道Objective-C只是借用Smalltalk的概念,而不是语言本身,但我很好奇为什么它使用YES/NO而不是更广泛使用的true/false。有历史原因吗?

5 个答案:

答案 0 :(得分:35)

Objective-C被设计为(现在仍然是)C的严格超集。创作者非常努力地确保它们不会以任何方式破坏与C的兼容性。他们还尝试使它们的修改有些明显,以便很容易分辨代码的哪些部分使用Objective-C以及哪些部分使用简单的C.例如,@用于表示NSStrings而不仅仅是使用引号。这允许普通C字符串与新字符串共存。

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

答案 1 :(得分:5)

Objective-C是一种非常详细的语言,所有方法都非常具有描述性,使用YES / NO表示布尔值而非true / false使其更具人性化。

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

如果B回答“是”(或“否”),则听起来完全正常,并且使用YES / NO而不是true / false,代码看起来更像普通英语。

答案 2 :(得分:3)

Apple一直试图让事情变得更容易使用。如果您阅读了一些系统布尔方法,并问自己使用YES|NOTRUE|FALSE回答布尔问题更有意义,您会看到我的答案是YES|NO意见。

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

答案 3 :(得分:2)

很奇怪,但我发现代码使用YES / NO宏而不是TRUE / FALSE(也可以使用)更具可读性。

但是,Objective-C现在是C99的超集,因此您应该尽可能使用C99 boolean类型和true以及false。我正在考虑将yesno定义为truefalse,但到目前为止已经抵制了它。

答案 4 :(得分:1)

想到这一点的最好方法是它是平行进化。

Objective-C的BOOLYES / NO日期一直追溯到20世纪80年代早期,可能不仅仅是为了模仿其他语言,而是为了C的未来发展。 C中的_Booltrue / false仅在1999年成为该标准的一部分。

YESNO是历史的吗?是。他们只是历史吗?不是。正如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;
    }
}