2010-06-04 12 views
51

Entiendo que esta es una pregunta subjetiva, por lo que me disculpo si es necesario cerrarla, pero siento que surge con la frecuencia suficiente para que me pregunte si hay una preferencia general por una forma sobre la otra.¿Cuál es la forma más clara: if (! Value) o if (flag == value)?

Obviamente, la mejor respuesta es "refactorizar el código para que no tenga que probar la falsedad", pero a veces no hay una manera fácil de hacerlo y la rama "else" simplemente continúa el proceso. Así que cuando usted debe tener un "si no falsa" construcción, que es el estándar preferido:

El operador not

if(!value) 

O la prueba de falsa

if(value == false) 
+0

También existe la posibilidad de if (value! = True). Personalmente no encuentro ninguno particularmente deseable que los otros. –

+35

Una ventaja de la primera es que no se puede hacer si (shouldLaunchMissiles = false) – JRL

+5

Ocurre que esta es una pregunta subjetiva, suponiendo que la comunidad sienta que las respuestas son valiosas y quiere conservarla, ¿podría alguien hacer una pregunta wiki? ? No tengo ganas de darle a nadie el crédito de "respuesta" porque esta pregunta es realmente justa, ya que no hay una respuesta absolutamente correcta. – CodexArcanum

Respuesta

66

if(!value) es más fácil/más rápido seguir. Subjetivo como dijiste. Mientras seas consecuente, esto es lo principal.

EDITAR

Otro punto a añadir - omitiendo las verdaderas palabras clave/falso deberían también (con suerte) forzar al codificador a utilizar variables mejor con nombre. variables de Bool siempre deben indicar el significado o el propósito del estado, tales como:

if(MyWallet.IsEmpty)

No hay ninguna razón de lo anterior utilizar == false o == true ya que es redundante. Lo anterior es humano legible de inmediato.

mucho mejor que tener que descifrar:

if(MyWallet.EmptyStatus == true) o algo ridículo como esto.

+5

Es cierto que la consistencia es lo más valioso. – CodexArcanum

+2

@CodexArcanum: Pero ser consistentemente incorrecto o consistentemente ilegible es una mala cosa. – David

+4

@KP: votado al alza. Gran punto acerca de los nombres de variables. Su respuesta muestra cómo una decisión en el estilo de codificación puede afectar fácilmente otras decisiones en el estilo de codificación y ayudar a alguien que ve el código por primera vez a entenderlo lo más rápido posible. – David

21
if(!value) 

Esto es siempre más claro en mi opinión.

if(value == false) 

odio decir esto, porque suena tipo de medio, pero esto normalmente indica que la persona que escribe el código realmente no entiende el uso de valores booleanos. No necesita volver a validar qué es un booleano en una sentencia if. Es redundante

(Personalmente, estaría molesto por la persona también si el nombre de la variable value vez de algo más significativo. Tengo la sensación de lo que usted envió es sólo pseudo código, que sin duda ding que en una revisión.)

Editar (en respuesta a un comentario más abajo):

puede parecer trivial, pero a menudo es un signo de cosas mucho más grandes. A decir verdad, la mayoría de las personas que usan var == verdadero etc. no entienden. Es solo un hecho. No digo que sean estúpidos o no deberían ser programadores simplemente porque probablemente haya algo que necesiten revisar y aprender. El problema es que cuando la lógica se vuelve mucho más compleja, no entender conceptos como este puede llevar a problemas mucho más grandes en el futuro. Algunas personas dicen "es un estilo". Esta bien. La verdadera pregunta en este caso es: "¿Cómo es beneficioso para mí hacerlo de esta manera? ¿Qué es lo que yo u otras personas obtenemos de él?" Si no puede responder sólidamente a esa pregunta, entonces debe preguntarse "¿Por qué es esta una buena idea?"

+6

+1 para el comentario sobre la comprensión. Estoy de acuerdo en que los desarrolladores con menos conocimiento conceptual del código tienden a inclinarse hacia el uso de '== false' sobre permitir que el valor booleano hable por sí mismo, especialmente cuando veo' if (value == true) '. –

+0

Reconozco que la segunda forma parece tonta y es redundante, pero a menudo la veo en el código de ejemplo. La razón dada suele ser que deja muy claro en un escaneo rápido del código lo que se está probando, en el supuesto de que un escaneo rápido podría pasar por alto el '!'. La intención es, supongo, eliminar un obstáculo que podría hacer que el lector se detuviera y desperdiciara unos segundos mirando más de cerca la afirmación. – CodexArcanum

+0

Ok ahora, si (valor == verdadero) es tonto. En C# de todos modos, puede tener mérito en un lenguaje como Javascript, donde if (value) está probando tanto la verdad booleana como la comprobación nula. – CodexArcanum

1

Cualquiera que prefiera.Elija uno y quédese con él.

+2

Mala idea, cuando hay más de un desarrollador en la misma base de código. –

+0

@Pavel - ese tipo de cae bajo 'Elija uno y quédese con él' :). – IVlad

+0

hasta cierto punto, sí :) es más como elegir uno global, y atenerse a él, que es lo que SO es tan bueno, razón por la cual es la pregunta. Esto hace que esta pregunta sea válida. –

13

Yo nunca uso if(value == true), así que por coherencia tampoco usaría if(value != false).

+8

'if (value! = False)' ... ¡Agradable! –

+3

if (value! = False) ... que acaba de enviar escalofríos por mi columna vertebral ... agradable :) – kemiller2002

+1

+1 jaja, amo la meticulosidad! – SwDevMan81

13

if(!value) es más clara y más "elegante", especialmente si el nombre de variables booleanas correctamente

  • isWhatever
  • hasWhatever
  • etc

Algo así como

if (Page.IsPostback == true) 

parece redundante para mí

+4

+1. por ejemplo, 'while (! done)' Lee como "while not done", que es mucho más claro que 'while (done == false)' que a su vez se lee como "while done is false". El estilo de codificación convencional tiene su propio lenguaje. –

26

personalmente me gusta

if ((value == false) == true) ...

causa esta es la verificación de que la declaración es en realidad value is false evaluando a un valor booleano verdadero ...

y, a continuación, obviamente, que abarca tanto posssibilites añade aún más claridad,

if ((value == false) == true && (value == false) != false)

<grin/>

y para aquellos de ustedes que son glotones reales para la claridad, la legibilidad y la demanda incontrovertible, sugeriría

if (((value == false) == true && (value == false) != false) == true)

+9

Ah, antiguo patrón de patrón de redundancia. –

+18

if (((value == false) == true) .ToString(). Length == 4) ... :) – Nagg

+0

Y para ser aún más claro, es posible que desee agregar '&& (value == false)! = falso' –

0

Si la condición es sólo un cheque de un solo valor, a continuación, !value es más rápido.

Sin embargo, cuando la condición contiene comprobaciones de valores múltiples, me resulta mucho más fácil leer value == false. De alguna manera, es más fácil analizar múltiples verificaciones de igualdad que múltiples negaciones de valores.

5

Uso Not value al codificar en VB, pero tiendo a usar value == false al codificar en C#. Encuentro que el signo de exclamación a veces puede perderse en el nombre de la variable (por ejemplo, legal). Tal vez sea porque soy un veterano experimentado.

+2

tengo tantos condimentos, está empezando a hacer que mi cabello se vea gris y se atasque en mis arrugas. – Robaticus

+1

Lástima que C# no tenga una palabra clave 'no' (como C++), que se destaca bastante bien. –

11

Opinión disidente (tipo de)

Desde un punto de vista compilación, usted va a obtener el mismo IL, por lo que realmente sólo importa desde el punto de vista legibilidad.

Desde ese punto de vista, el if(value == false) es más obvio para un lector casual, ¡y hay menos posibilidades de perderlo! antes del bool.

Honestamente, utilizo ambos enfoques, y la mayoría de las veces, lo hago depender de mi nombre de variable. Si todavía suena bien decir "no" en lugar del "bang", es probable que use la notación bang

p.

if(!gotValue) {} 
//if (I've) not gotValue 

//but 

if(checkValue == false){} 
//If (I've) not checkValue doesn't quite work here grammatically. 
0

Lamento decir que el segundo me parece estúpido.

me gustaría añadir un nivel adicional, si alguien prefiere que:

if((value==false) == true) 

:)

2

no creo que es todo lo que subjetiva. Tengo nunca visto que se recomienda en la forma más larga. En realidad, todos los libros y guías de programación y "Cómo ser un buen programador". Los que he leído lo desaniman.

Se cae en la misma categoría que

if (value) { 
    return true; 
} else { 
    return false; 
} 

otoh, todas las respuestas que se dan aquí hacer mi primera declaración no es igual un poco cierto.

+2

Me recuerda a la función IsTrue (valor de bool). – sunside

1

Yo preferiría usar if(!value) porque, dependiendo de los nombres de las variables involucradas, el caso "verdadero" tiene mucho más sentido según la semántica inglesa.

considerar uno de los ejemplos en this MSDN article:

if(pane.IsChecked) 

lee en Inglés como: "Si el panel está marcada".

Sin embargo, si (pane.IsChecked == true) lee en inglés como "Si el panel está marcado es verdadero". Esa declaración es mucho menos clara en inglés de lo que debería ser.

Una de las razones por las que no escribimos código C# en binario es la legibilidad humana. Si le dan la opción entre el código que fluye bien cuando lo lee y el código que no lo hace, el lado con el que es más legible. No creo que agregar el "== true" haga que este ejemplo sea más legible, y MSDN tampoco lo cree.

De acuerdo, este es un ejemplo bastante pequeño del que preocuparse. Pero como han indicado algunas de las otras respuestas, no aplicar esta forma de pensar a casos de mayor escala puede perjudicar la legibilidad.

0

De hecho, muchas de las formas posibles.

Esto no es en realidad la forma en que se escribe en los estándares, pero así es como yo lo veo:

//if foo is(or exists) 
if(foo) 

//if foo is true 
if(foo == true) 

//if foo doesn’t exist 
if(!foo) 

if foo is false 
if(foo == false) 

Por lo tanto no veo == false es redundante.

+5

Su variablenaming es el problema. Dele a Foo un nombre que sea como una pregunta a la que puede responder con SÍ o NO. como p. "IsFoo" o "FooExists" o incluso "FooIsTrue", solo tiene que decir: "If FooExists then dosomething". Usted puede ver que "Si Foo" solo no es una pregunta, falta algo para ser realmente una pregunta y – OlimilOops

2

Normalmente preferiría si (! Value) también, cuando sé con certeza que el valor es un booleano. Pero muchas veces puede ser una cadena o un número.

El número cero evaluaría a falsa en los condicionales en un montón de idiomas (no todos, sin embargo); sin embargo, la cadena "0" evaluaría a true.Este es un problema particularmente en JavaScript, particularmente si recibe cadenas JSON del servidor, particularmente si el servidor está escrito en PHP (porque la mayoría de los desarrolladores de PHP son lo suficientemente descuidados como para tomar valores de la base de datos y llamar a json_encode, sin saber que el DB produce cadenas y no tiene idea de que todos esos ceros y unos que utilizan como campos booleanos se codificarán como cadenas en el otro extremo, por lo que todos se tratan como true en condicionales).

Rant over. Mi sugerencia: sea explícito, especialmente si su idioma es del tipo "muy dinámico" (es decir, JavaScript, PHP, Perl).

1

Estoy a favor del estilo if (!value) al menos para evaluar variables o propiedades comunes como Page.IsPostback y similares. Para cualquier cosa más compleja que tiendo a parenthesise la expresión como así:

if (!(SomeType.SomeProperty.CallingAMethod(input).GetSomething.BooleanProperty)) 

Sólo para dibujar un poco más atención a ella.

En general, es un argumento para el estilo Perl unless y until palabras clave.

+0

Esto es lo que también estoy haciendo. Cuando uso un '!' Para negar una expresión, siempre encierro la expresión entre paréntesis, como dijiste para llamar un poco más la atención sobre ella. Creo que aumenta la legibilidad, especialmente cuando se usan variables privadas/clases que comienzan con guión bajo: 'if (! _ WhateverThisThing.TriesToDo())' se escribiría como: 'if (! (_ WhateverThisThing.TriesToDo()))'. IMHO falta el '!' Es más difícil en este último. – Sharky

1

Prefiero la segunda opción, la if (value == false). Me complace utilizar if (~value) o if (not value) en idiomas que lo admitan, pero ! simplemente combina waaaaay demasiado fácilmente con el nombre de variable o llaves de apertura o | o || operadores ... al menos en mi opinión.

Además, dos cosas:

  1. nunca hacen if (value == true), y soy consciente de que soy inconsistente. Y aunque la consistencia es muy importante en mi opinión, ese molesto ! es simplemente peor.
  2. Creo que es realmente una cuestión de gusto personal, al igual que el debate de la llave en la nueva línea. Nunca criticaría a un compañero de equipo por tonterías como esas, y me cuesta entender a las personas que lo harán.
-1

Uso if (value == false) The! en if (! value) es tan pequeño que a veces lo extraño.

Cuestiones relacionadas