objective c - ¿Por qué Objective-C usa la convención de macros SÍ/NO en lugar de verdadero/falso?
naming-conventions boolean (5)
La mayoría de los idiomas utilizan las palabras clave de true/false
para los valores booleanos. Encontré que incluso Smalltalk está usando true/false
. Sé que Objective-C solo toma prestados los conceptos de Smalltalk, no el lenguaje en sí, pero tengo curiosidad por saber por qué se usa YES/NO
lugar de usar el true/false
más ampliamente usado. ¿Hay alguna razón histórica?
Apple siempre ha tratado de hacer las cosas más fáciles de usar. Si lees algunos métodos booleanos del sistema y te preguntas qué tiene más sentido para responder a una pregunta booleana, ya sea con YES|NO
o TRUE|FALSE
, verás que la respuesta es YES|NO
en mi opinión.
De lo contrario, siempre puede usar TRUE|FALSE
en su código.
Es extraño, pero encuentro que el código es más legible utilizando las macros YES
/ NO
lugar de TRUE
/ FALSE
(que también funcionan).
Sin embargo, Objective-C es un superconjunto de C99 ahora, por lo que debería usar el tipo boolean
C99 y true
y false
siempre que sea posible. Estaba jugando con la idea de definir yes
y no
a true
y false
pero hasta ahora me he resistido.
La mejor manera de pensar esto es que es una evolución paralela.
Los objetivos BOOL
y YES
/ NO
Objective-C se remontan a principios de la década de 1980, y es probable que no solo imitaran otros idiomas sino que se perdieran el desarrollo futuro de C. _Bool
, true
/ false
en C solo formaron parte de la norma en 1999.
Entonces, ¿son YES
y NO
históricos? Sí. ¿Son sólo históricos? No. Así como NULL
no es el resultado de 3-3 en un sentido puro (a pesar de que NULL
menudo se define como 0
, o casualmente utilizable si lo fuera), true
no es un valor para BOOL
.
Usted no (creo) escribir este código:
int matches = NULL;
for (int i = 0; i<count; ++i) {
if (array[i] == value) ++matches;
}
Esto es obviamente menos erróneo, pero está en el mismo espectro:
BOOL foundMatch = false;
for (int i = 0; i<count; ++i) {
if (array[i] == value) {
foundMatch = YES;
break;
}
}
Objective-C es un lenguaje muy detallado, todos los métodos son muy descriptivos, y el uso de SÍ / NO para los valores booleanos en lugar de verdadero / falso lo hace más legible para los humanos.
Es probable que la siguiente conversación le resulte extraña, si sucediera en la vida real: A: "¿Viste la película?" B: "Verdadero"
Si B hubiera respondido "sí" (o "no"), parecería perfectamente normal, y el código se parece más al inglés simple usando SÍ / NO en lugar de verdadero / falso.
Objective-C fue diseñado para ser (y sigue siendo) un superconjunto estricto de C. Los creadores trabajaron muy duro para asegurarse de que no rompieran la compatibilidad con C de ninguna manera. También intentaron hacer que sus modificaciones fueran algo obvias para que fuera fácil saber qué partes del código usan Objective-C y qué partes usan una C simple. En este caso, la @
usaba para denotar NSStrings en lugar de solo usar comillas. Esto permite que las cadenas C simples coexistan con las nuevas.
C ya tenía un sistema informal de macros VERDADERO / FALSO. Sospecho que los diseñadores de Objective-C eligieron las macros SÍ / NO para evitar conflictos y para que sea obvio que el código es en realidad Objective-C. Observe también el uso nil
para el objeto ''vacío'' en lugar de simplemente modificar el comportamiento de los viejos NULL.