Почему Objective-C использует соглашение макросов ДА / НЕТ вместо истина / ложь? - PullRequest
18 голосов
/ 21 июня 2011

Большинство языков используют ключевые слова true/false для логических значений. Я обнаружил, что даже Smalltalk использует true/false. Я знаю, что Objective-C просто заимствует понятия из Smalltalk, а не самого языка, но мне любопытно, почему он использует YES/NO вместо более широко используемого true/false. Есть ли историческая причина?

Ответы [ 5 ]

35 голосов
/ 21 июня 2011

Objective-C был разработан, чтобы быть (и остается) строгим надмножеством C. Создатели очень много работали, чтобы гарантировать, что они не нарушат совместимость с C. Они также попытались сделать свои модификации несколько очевидными, чтобы было легко определить, какие части кода используют Objective-C, а какие - простой C. В данном случае @ используется для обозначения строк NSS, а не просто использования кавычек. , Это позволяет простым C-строкам сосуществовать с новыми.

C уже имел неформальную систему макросов TRUE / FALSE. Я подозреваю, что разработчики Objective-C выбрали макросы YES / NO, чтобы избежать конфликта и сделать очевидным, что код на самом деле Objective-C. Обратите внимание также на использование nil для «пустого» объекта, а не просто на изменение поведения старого доброго NULL.

5 голосов
/ 21 июня 2011

Objective-C - очень многословный язык, все методы очень описательны, и использование YES / NO для логических значений вместо true / false делает его более читабельным для человека.

Вы, вероятно, нашли бы следующий разговор странным, если бы это произошло в реальной жизни: A: "Вы видели фильм?" B: "True"

Если бы B ответил «да» (или «нет»), это звучало бы совершенно нормально, и код больше походил бы на обычный английский, используя YES / NO вместо true / false.

3 голосов
/ 21 июня 2011

Apple всегда старалась сделать вещи проще в использовании.Если вы прочитаете некоторые системные логические методы и спросите себя, на что имеет больше смысла отвечать на логический вопрос, используя YES|NO или TRUE|FALSE, вы увидите, что спасибо, на мой взгляд, ответ YES|NO.1005 * В противном случае вы всегда можете использовать TRUE|FALSE в своем коде.

2 голосов
/ 21 июня 2011

Странно, но я считаю, что код более удобочитаем, используя макросы YES / NO, а не TRUE / FALSE (которые также работают).

Однако Objective-C теперь является надмножеством C99, поэтому вы должны использовать тип C99 boolean и true и false везде, где это возможно.Я играл с идеей определения yes и no до true и false, но до сих пор сопротивлялся ей.

1 голос
/ 25 июня 2013

Лучший способ думать об этом - это параллельная эволюция.

Objective-C BOOL и YES / NO восходит к началу 1980-х годов и, вероятно, был предназначен дляне только подражать другим языкам, но и пропустить будущее развитие C._Bool, true / false в C были сделаны только частью стандарта в 1999 году.

Так что 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;
    }
}
...