Подтвердить что ты не робот

Почему Objective-C использует соглашение макроса YES/NO вместо true/false?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

В противном случае вы всегда можете использовать TRUE|FALSE в своем коде.

Ответ 4

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

Однако Objective-C теперь является надмножеством C99, поэтому вы должны использовать тип C99 boolean и TRUE и FALSE, где это возможно. Я играл с идеей определения YES и NO до TRUE и FALSE, но пока что сопротивлялся этому.

Ответ 5

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

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;
    }
}