ternario switch relacionales operadores operador condiciones condicion java boolean-operations

java - switch - Usando el operador NO en condiciones IF



operadores en java (7)

¿Es realmente una buena práctica evitar el uso del operador NO en condiciones IF para que su código sea más legible? Escuché if (doSomething()) es mejor que if (!doSomething()).


Como una declaración general, es bueno hacer que sus condicionales sean lo más legibles posible. Para su ejemplo, usando! esta bien el problema es cuando las cosas parecen

if ((a.b && c.d.e) || !f)

es posible que desee hacer algo como

bool isOk = a.b; bool isStillOk = c.d.e bool alternateOk = !f

entonces su declaración if se simplifica a

if ( (isOk && isStillOk) || alternateOk)

Simplemente hace que el código sea más legible. Y si tiene que depurar, puede depurar el conjunto isOk de vars en lugar de tener que revisar las variables en el alcance. También es útil para tratar con las NPE, ya que romper el código en partes más simples siempre es bueno.


En general, ! es un operador lógico booleano perfectamente bueno y legible. No hay razón para no usarlo a menos que esté simplificando eliminando los negativos dobles o aplicando la ley de Morgan.

!(!A) = A

o

!(!A | !B) = A & B

Como regla general, mantenga la firma de sus métodos de devolución booleanos mnemotécnicos y en línea con la convención. El problema con el escenario que propone @hvgotcodes es que, por supuesto, ab y cde no son ejemplos muy amigables para empezar. Supongamos que tiene una clase de vuelo y asiento para una aplicación de reserva de vuelo. Entonces la condición para reservar un vuelo podría perfectamente ser algo así como

if(flight.isActive() && !seat.isTaken()) { //book the seat }

Este código perfectamente legible y comprensible. Sin embargo, podría redefinir su lógica booleana para la clase Seat y reformular la condición para esto.

if(flight.isActive() && seat.isVacant()) { //book the seat }

Así eliminando el! operador si realmente le molesta, pero verá que todo depende de lo que significan sus métodos booleanos.


No, no hay absolutamente nada de malo en usar el ! operador en if..then..else declaraciones.

Lo que es importante es nombrar las variables y, en su ejemplo, los métodos. Si está utilizando:

if(!isPerson()) { ... } // Nothing wrong with this

Sin embargo:

if(!balloons()) { ... } // method is named badly

Todo se reduce a la legibilidad. Siempre apunta a lo que es más legible y no te equivocarás. Siempre trate de mantener su código continuo, por ejemplo, mire la answer Bill the Lizards.


Nunca había escuchado de esto antes.

Como es

if (doSomething()) { } else { // blah }

mejor que

if (!doSomething()) { // blah }

Lo posterior es más claro y conciso.

Junto al ! El operador puede aparecer en condiciones complejas como (! a || b). ¿Cómo lo evitas entonces?

Utilizar el ! Operador cuando lo necesites.


Por lo general, no es una mala idea evitar el operador! Si tiene la opción. Una razón simple es que puede ser una fuente de errores, porque es posible pasarlo por alto. Más legible puede ser: if (conditionA == false) en algunos casos. Esto principalmente juega un papel si te saltas la otra parte. Si tiene un bloque else de todos modos, no debe usar la negación en la condición if.

Excepto en condiciones compuestas como esta:

if(!isA() && isB() && !isNotC())

Aquí tienes que usar algún tipo de negación para obtener la lógica deseada. En este caso, lo que realmente vale la pena pensar es en el nombramiento de las funciones o variables. Trate de nombrarlos para que a menudo pueda usarlos en condiciones simples sin negación.

En este caso, debería pensar en la lógica de isNotC () y si podría reemplazarse por un método esC () si tiene sentido.

Finalmente, su ejemplo tiene otro problema cuando se trata de la legibilidad, que es incluso más seria que la pregunta de si usar la negación o no: ¿el lector del código realmente sabe cuándo doSomething () devuelve true y cuando false? Si fue falso, ¿se hizo de todos modos? Este es un problema muy común, que termina cuando el lector intenta averiguar qué significan realmente los valores de retorno de las funciones.


Realmente depende de lo que estás tratando de lograr. Si no tiene otra cláusula, entonces if(!doSomething()) parece estar bien. Sin embargo, si tiene

if(!doSomething()) { ... } else { // do something else }

Probablemente revertiría esa lógica para eliminar el ! operador y hacer la cláusula if poco más clara.


intenta así

if (!(a | b)) { //blahblah }

Es lo mismo con

if (a | b) {} else { // blahblah }