В большинстве языков ключевые слова true/false
используются для булевых значений. Я обнаружил, что даже Smalltalk использует true/false
. Я знаю, что Objective-C просто заимствует концепции у Smalltalk, а не сам язык, но мне любопытно, почему он использует YES/NO
вместо более широко используемого true/false
. Есть ли историческая причина?
Почему Objective-C использует соглашение макроса YES/NO вместо true/false?
Ответ 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;
}
}