Un comentario sobre esta pregunta: ¿ Comprobar si un método devuelve falso: asignar el resultado a la variable temporal o poner la invocación del método directamente en condicional? dice que debe usar en !boolean
lugar de boolean == false
cuando prueba las condiciones. ¿Por qué? Para mí boolean == false
es mucho más natural en inglés y es más explícito. Me disculpo si esto es solo una cuestión de estilo, pero me preguntaba si había alguna otra razón para esta preferencia !boolean
.
60
boolean == true
: no tiene sentido. Las expresiones dentro de lasif
declaraciones son solo eso: expresiones. Si algo ya se evalúa como una expresión booleana, ¿por qué agregaría un cheque para obligarlo a evaluar?!boolean_variable
es la forma en que la mayoría de los programadores de C lo hacen, estoy de acuerdo.boolean != true
?Respuestas:
Cuando veo una línea como
if (!lateForMeeting())
, leí eso como "Si no es tarde para reunirse" , lo cual es bastante sencillo de entender, en lugar deif (lateForMeeting() == false)
lo que leería como "Si el hecho de que llegue tarde a la reunión es falso " .Tienen un significado idéntico, pero el primero está más cerca de cómo se construiría la oración equivalente en inglés.
fuente
if not late_for_meeting
:)unless late_for_meeting
done()
. Los negativos dobles son malos.Escritura
== false
y== true
es redundante. También se puede llevar a extremos arbitrarios. Si empiezas a escribirEntonces porque no
O porque no
La moraleja de esta historia es que si
condition
es una expresión booleana, entonces no necesita agregar== false
; para eso está el operador!
;)fuente
== false
NO es redundante, solo más detallado que!
. OTOH,== true
es redundante.(exp1 != exp2)
vs((exp1 == exp2) == false)
. Es cierto que estos son escenarios inventados, pero aún así casi nunca debes escribir comparaciones explícitas con verdadero o falso. Del mismo modo que debe usar el operador!=
, también debe usarlo!
.!
.bool_expression == bool_literal
,== ...
es redundante. Si está probando verdadero o falso es irrelevante. Es solo un cambio en el orden de los bloques consecuentes / alternativos. Los ejemplos de Andrés ilustran este punto perfectamente. La mayoría de los compiladores modernos optimizarán la redundancia, pero sigue siendo redundante.En C y algunos lenguajes similares, comparar expresiones booleanas para igualdad
false
otrue
es un hábito peligroso.En C, cualquier expresión escalar (numérica o puntero) se puede utilizar en un contexto booleano, por ejemplo, como la condición de una
if
declaración. La regla Cif (cond)
es equivalente aif (cond != 0)
, es decir, cero es falso y cualquier valor distinto de cero es verdadero. Sicond
es de tipo puntero,0
se trata como una constante de puntero nulo;if (ptr)
significaif (ptr != NULL)
.Esto significa que
y
No significan lo mismo . El primero es verdadero si
cond
no es cero; el segundo es verdadero solo si es igual atrue
, que en C (si tiene#include <stdbool.h>
) es simplemente1
.Por ejemplo, la
isdigit()
función declarada en<ctype.h>
devuelve unint
valor,0
si el argumento es un dígito, no cero si no lo es. Puede volver42
para indicar que la condición es verdadera. La comparación42 == true
fallará.Sucede que ese
0
es el único valor considerado falso, por lo que la comparación para igualdadfalse
funcionará;if (!cond)
yif (cond == false)
hacer lo mismo Pero si vas a aprovechar eso, debes recordar que comparar confalse
está bien, y comparar contrue
no lo está. Peor aún, la comparación contrue
funcionará la mayor parte del tiempo (por ejemplo, los operadores de igualdad y relacionales siempre rinden0
o1
). Esto significa que cualquier error que introduzca al usar esto aún podría ser difícil de rastrear. (No se preocupe, aparecerán tan pronto como demuestre el código a un cliente importante).C ++ tiene reglas ligeramente diferentes; por ejemplo, su
bool
tipo está un poco más integrado en el lenguaje y seif (cond)
conviertecond
en tipobool
. Pero el efecto es (principalmente) el mismo.Algunos otros idiomas tienen lo que uno podría llamar booleanos con mejor comportamiento, de modo que
cond == true
ycond == false
(o lo que sea que sea la sintaxis) es seguro. Aun así, cada idioma que he visto tiene un operadornot
u!
; está ahí, así que bien podrías usarlo. Usar encond == false
lugar de!cond
onot cond
no, en mi opinión, mejora la legibilidad. (Es cierto que el!
personaje puede ser difícil de ver de un vistazo; a veces agrego un espacio después!
para evitar esto).Y a menudo puede evitar el problema y mejorar la claridad reorganizando ligeramente el código. Por ejemplo, en lugar de:
podrías escribir:
Eso no siempre es mejor, pero no está de más buscar oportunidades donde está.
Resumen: en C y C ++, las comparaciones de igualdad con
true
yfalse
son peligrosas, excesivamente detalladas y con un estilo pobre. En muchos otros idiomas, tales comparaciones pueden no ser peligrosas, pero siguen siendo demasiado detalladas y de mal estilo.fuente
== true
no es seguro. Se siente mejor así.(==True) . f
para aclarar que queremos la-> Bool
instanciación de la función de retorno polimórficof
. Eso es más claronot . not . f
y menos incómodo que(f :: a -> Bool)
.pred(x)==pred(y)
una función de retorno de boolpred
. La alternativa seríapred(x)? pred(y) : !pred(y)
que estarás de acuerdo es difícilmente aceptable.pred(x)
ypred(y)
usas el mismo valor para denotar la verdad, lo cual es una suposición segura en algunos idiomas pero no en otros. En C, por ejemplo, podrías escribir!!pred(x) == !!pred(y)
.Los dos son funcionalmente idénticos, por lo que cuál usar es cuestión de gustos.
La principal razón por la que yo utilizo
== false
es que he encontrado que!
es muy fácil pasar por alto, cuando se mira en código.Después de haber sido mordido severamente por esto, me he acostumbrado a dejarlo muy claro cuando hago pruebas de falso.
Si el operador hubiera sido nombrado
not
como en Pascal, no creo que esto se hubiera convertido en un problema.fuente
== false
lugar de!
por esta misma razón (para que se destaque). Sin embargo, no había ningún requisito para usar== true
, por lo que cualquier valor distinto de cero seguía funcionando como debería.!
es probablemente el error más problemático de este tipo, esto en mi opinión no debería dar lugar a la costumbre de escribir==false
sino de escribir mejores pruebas unitarias.Si
condition == false
realmente es "mucho más natural en inglés" para usted, entonces debo suponer que no es un hablante nativo. De lo contrario, no puedo explicar esto, porque nadie habla así:Compara eso con
Dicho esto, estoy de acuerdo en que el carácter único y delgado
!
se pasa por alto fácilmente en el código. Por esa razón, prefiero la palabra clavenot
cuando es compatible con el idioma. C ++, por ejemplo , permite esto, aunque muchos programadores no lo saben.Para los idiomas que requieren
!
, pongo un espacio entre el operador y el operando. Esto hace que la negación sea mucho más difícil de pasar por alto:Tenga en cuenta que cada programador debe traducir esto automáticamente , sin pensarlo dos veces, a "no condicionar" en su cabeza. Adquirir este tipo de fluidez en la lectura de modismos de códigos es uno de los primeros pasos para convertirse en un buen programador.
fuente
Cuando veo
var == false
, siempre me pregunto sivar
es booleano o de tipo lógico con más de dos valores (con, por ejemplo, amaybe
y anundefined
, así comotrue
yfalse
, o algo así como los nueve valores de IEEE 1164 ).fuente
porque a veces podrías escribir
boolean = false
(con los errores obvios) yfalse == boolean
no parece natural (no importa cuán buena sea la práctica)fuente
if( INVALID_HANDLE_VALUE == hFile )
a evitar cosas como esas. De esa manera, si se resbala y usa un signo igual en lugar de dos, obtendrá un error de compilación. Obviamente, esto solo funciona cuando la expresión izquierda es una constante, pero me ha ahorrado más dolores de cabeza de los que puedo contar.hFile==INVALID_HANDLE_VALUE
escritura de la naturaleza .if (!boolean_variable)
se traduce enif the condition is not true
.if (boolean == false)
se traduce enif the condition not false is true
. Debido a que es una lógica inversa, es más difícil de entender.fuente
isVisible
, sería un mejor ejemplo. Entoncesif (!isVisible)
significaría si no es visible, lo cual es más fácil de entender entoncesif (isVisible==false)
, que es una lógica inversa. Espero que sea más claro ahora. O, ¿entendí mal tu comentario?En compiladores (mucho) más antiguos, creo que se dividirían (booleano == falso) en 2 asignaciones de registro y un código de comparación en lenguaje de máquina. El primer ejemplo se dividiría en una tarea y un operador NOT. En términos de rendimiento, la operación de comparación tomaría varios ciclos de reloj, dependiendo del tamaño del registro que se compara, en comparación con una inversión bit a bit (1 reloj) y sería más lenta de ejecutar.
Dicho esto, creo que los compiladores más nuevos eliminan esto, por lo que debería estar bien seguir con cualquiera.
fuente
En el trabajo, a menudo trato con booleanos que pueden ser nulos, así que a menudo codifico este caso como
porque personalmente siento que la simetría hace que sea más fácil de leer. Especialmente si también se están probando otros booleanos.
Realmente no me importa de una forma u otra.
fuente
value == true
entonces no hay razón para verificar que no sea nulo. Si elvalue == null
nunca debe desencadenar la declaración if en primer lugar, entoncesif (value)
debería ser suficiente.if (value)
arroja una excepción. Agradecería que las personas que votan negativamente den una razón.value == true
sería suficiente.Cuando está probando la verdadera condición, tiene sentido hacerlo solo
if (condition)
, especialmente cuando aplica la convención de nombrar variables booleanas que comienzan con 'es':if (isOpen)
es perfectamente claro y su uso!= false
sería redundante.Para un C / C ++ / Java / etc. programador, el significado del '!' El operador está completamente asimilado, hasta el punto de que automáticamente tenemos "no" en nuestras mentes cuando lo vemos. Entonces tener
if (!isOpen)
es tan claro comoif (_NOT_ isOpen)
para mí. Pero no estás lo suficientemente familiarizado, en C / C ++ puedes crear una macro#define _NOT_ !
. Pero confía en mí, después de unos años esto es completamente innecesario.Aparte de eso, siempre es preferible probar valores booleanos sin compararlos con literales. Por ejemplo, es peligroso probar
if (x == true)
porque un valor booleano se considera verdadero si no es cero, y el verdadero literal tiene solo un valor específico, por lo que x podría ser 'verdadero' (es decir, distinto de cero) y aún así la comparación se evalúa como falsa (porque contiene 2 y el verdadero literal es, digamos, 1.) Por supuesto, eso no se aplica a una comparación con falso, pero si no lo usa cuando prueba verdadero, ¿por qué usarlo cuando prueba falso?fuente
El tamaño importa ;)
En expresiones mixtas es más fácil de leer:
Y especial para ruby un ejemplo donde hay una gran diferencia:
nil no es falso, pero tampoco es cierto.
fuente
Basado en mi experiencia y las respuestas de mi búsqueda a la que te has vinculado.
Algunas personas prefieren usar if (condición), porque la razón es que es más corto de escribir. y para mí tiene sentido, por ejemplo (! isValidated ()) Leí esto como No validado. pero para mí todo se basa en preferencias personales, y depende de la estructura lógica del método isValidated (), si devuelve verdadero o falso
fuente
Si nombró su variable correctamente, entonces
!boolean
es más natural. Se lee comonot boolean
a cualquiera que sea lo suficientemente programador como para leer código mentalmente.fuente
Para algunas personas, cuanto antes se exprese un significado, mejor.
Para aquellas personas que tienen "if! ..." se compara más rápido con "if ..." y luego tienen que leer toda la condición (que en realidad podría ser bastante larga, por ejemplo (thisThing = thatThing o algo = la otra cosa) O ( thinga = thingb y thinga = thingd), etc.) solo para encontrar el == falso al final.
Tener el! (De hecho, prefiero un no cuando el idioma lo permite) de inmediato obtiene el inglés 'no' para esta condición allí antes.
Este problema también lleva a consideración para usarlo
until
en los idiomas que lo admiten, por ejemplo, hacer "cosas comunes" hasta que se complete. Como otros dicen, el objetivo es la expresión en lenguaje natural. Me gusta el ejemplo de "el sol está brillando" arriba.fuente
Otra razón es que si está trabajando en una base de código que usa varios idiomas, si hay una forma idiomática de hacer algo que sea seguro en todos los idiomas, es una buena idea hacerlo de esa manera en todas partes para formar un buen hábito y son menos propensos a tropezar.
No puedo pensar en ningún lugar que
if (!variable)
(o sus equivalentes, comoif not variable
depender de su idioma) no sea seguro, mientras que, por ejemplo,if self.is_ready() == False: ...
no es seguro en Python siself.is_ready()
regresaNone
, ahora o en el futuro, lo que sería algo totalmente razonable que haga. indicar que no estaba listo ya queNone
es tan falso comoFalse
.fuente