Operador ternario (condición? Foo: bar) y el operador XOR (^)

8

He leído en una reciente revisión de código que ambos ternary operator (condition ? foo : bar)y los XOR operator ^rara vez se usan en Java. ¿Es verdad?

En caso afirmativo, ¿es esto porque son menos legibles? o alguna otra razón.

Kuldeep Jain
fuente
55
El operador XOR es bastante raro en la programación de alto nivel en general.
La funcionalidad proporcionada por ambos se implementa frecuentemente como declaraciones IF-ELSE.

Respuestas:

8

El operador ternario se utiliza bien, especialmente para verificaciones nulas cortas / valores predeterminados:

System.out.println("foo is "+(foo==null) ? "not set" : foo);

Algunas personas consideran que esto no es tan legible como un if / else, pero esa no era la pregunta.

El operador XOR bitwise solo se usa en el procesamiento de bits. Si necesita un XOR bit a bit, entonces no hay forma de evitarlo.

El operador lógico XOR es realmente tan raro, que no lo vi en los últimos diez años en Java en casos válidos . Esto también se debe al hecho de que el XOR booleano "no escala" como ||o &&. Lo que quiero decir:

if( a && b && c && d ) ....   // it's clear what the intention is
if( a || b || c || d ) ....   // here also
if( a ^  b ^  c ^  d ) ....   // ???

Supongo que en el último caso, el codificador quería decir "solo uno debería ser cierto". Pero XOR es una bestia. El codificador consiguió la bestia y no lo que quería.

Esa sería una pregunta interesante para la entrevista: ¿Cuál es el resultado de la última if?

AH
fuente
77
Creo que no vemos el XOR lógico porque la gente encuentra '! =' Más legible.
Nettogrof
1
Sería una gran pregunta de trivia, pero sería inútil en una entrevista. Saber algo que nadie ha visto en 10 años y que probablemente nunca usará no me dirá si puede escribir un código bueno y legible y lanzar productos. :)
jmort253
1
@ jmort253: Si he visto este tipo de código más de una vez. Pero era un código no válido en cada caso. Entonces, una pregunta de entrevista como esta me diría si el solicitante sabe o no detectar el código maloliente.
AH
@Ah de acuerdo, eso tiene sentido. Usted definitivamente quiere que la gente que pueda ver la lógica inestable. :)
jmort253
Además, estoy de acuerdo con @Nettogrof: he usado !=booleanos un par de veces, y el XOR lógico nunca se me pasó por la cabeza.
Izkata
7

Solía ​​encontrar el operador ternario difícil de analizar, pero desde entonces descubrí que hay algunos lugares donde es muy útil. Estos no tienden a ser la lógica de la aplicación, sino el registro.

Por ejemplo:

log.info( "Object foo is " + ( foo.isEnabled() ? "" : "not " ) + "enabled" );

Para mí, eso es mucho más ordenado que cualquiera

if ( foo.isEnabled() ) 
    log.info( "Foo is enabled" );
else
    log.info( "Foo is not enabled" );

O

log.info( "Foo is enabled : " + foo.isEnabled() );

En resumen, se trata de dónde se está utilizando y para qué.

En cuanto a los bits, aún lucho con ellos, pero eso es porque estoy acostumbrado a trabajar en un alto nivel de abstracción, como han sugerido otros comentaristas. Si encuentro en algún lugar del código que alguien decidió usar eso para ser "eficiente", el tiempo perdido mientras lo descubro niega los beneficios.

chooban
fuente
3
Diré que uso mucho el operador ternario, y lo encuentro bastante legible. Es solo cuestión de acostumbrarse a verlo y, como dijiste, saber cuándo usarlo. En mi humilde opinión, si no puede caber en una línea, utilice if-else.
jmort253
Creo que el momento es muy importante. En el momento de la revisión, he devuelto el código a lo largo de las líneas de foo.setParam( bool ? ClassA.method() : ClassB.method ). Funciona, pero es un poco oloroso, en mi opinión.
chooban
No estoy seguro de estar de acuerdo. Aunque si tú y yo estuviéramos trabajando juntos, haría todo lo posible para jugar bien y ser conservador en mi uso de eso. :)
jmort253
Todo depende del contexto. El ejemplo en el que estaba pensando (que, por supuesto, no tengo que entregar / no puedo publicar) fue donde se ocultaba la lógica empresarial sobre dónde extraer los datos. Un ejemplo de algún lugar en el que algunas líneas adicionales de código y un comentario ayudarían al próximo desarrollador en el área. Simplemente no me hagas comenzar con el código perl ilegible que usa unless ( !bool ) {. :)
chooban
3

Esta es más una respuesta basada en una opinión, pero en mi caso:

  1. De hecho, por alguna razón, encuentro que el operador ternario es menos legible que una construcción if-else.

  2. En cuanto a XOR, probablemente la mayoría de los programas Java no tienen uso para tales manipulaciones bit a nivel bajo. En su mayor parte, parece ser solo una reliquia heredada de C.

Tudor
fuente