objective-c naming-conventions boolean convention

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.