Operador ternário (condição? Foo: bar) e operador XOR (^)

8

Eu li em uma recente revisão de código que ambos ternary operator (condition ? foo : bar)e o XOR operator ^raramente são usados ​​em Java. É verdade?

Se sim, é porque são menos legíveis? ou algum outro motivo.

Kuldeep Jain
fonte
5
O operador XOR é bastante raro na programação de alto nível em geral.
A funcionalidade fornecida por ambos é frequentemente implementada como instruções IF-ELSE.

Respostas:

8

O operador ternário é bem usado, especialmente para verificações / padrões curtos de nulidade:

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

Algumas pessoas consideram isso não tão legível quanto um if / else, mas essa não era a questão.

O operador XOR bit a bit é usado apenas no processamento de bits. Se você precisar de um XOR bit a bit, não há como contorná-lo.

O operador lógico XOR é realmente tão raro, que eu não o vi nos últimos dez anos em Java em casos válidos . Isso também se deve ao fato de o XOR booleano "não escalar" como ||ou &&. O que eu quero dizer:

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

No último caso, acho que o codificador significava "apenas um deveria ser verdadeiro". Mas XOR é uma fera. O codificador pegou a fera e não o que queria.

Essa seria uma pergunta interessante da entrevista: qual é o resultado da última if?

AH
fonte
7
Acho que não vemos o XOR lógico porque as pessoas acham '! =' Mais legível.
Nettogrof 11/03/12
1
Seria uma ótima pergunta trivial, mas seria inútil em uma entrevista. Saber algo que ninguém vê em 10 anos e provavelmente nunca usará não me dirá se você pode escrever códigos bons e legíveis e lançar produtos. :)
jmort253
1
@ jmort253: Se você já viu esse tipo de código mais de uma vez. Mas era um código inválido em cada caso. Portanto, uma pergunta de entrevista como essa me diria se o suplicante sabe ou não identificar códigos fedorentos.
AH
@ Ah - Ok, isso faz sentido. Você definitivamente quer pessoas que possam identificar uma lógica instável. :)
jmort253
Além disso, concordo com a @ Nettogrof - usei !=booleanos algumas vezes, e o XOR lógico nunca passou pela minha cabeça.
Izkata 12/03/12
7

Eu costumava achar o operador ternário difícil de analisar, mas desde então descobri que há alguns lugares onde é muito útil. Estes não tendem a ser a lógica do aplicativo, mas o log.

Por exemplo:

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

Para mim, isso é muito melhor do que qualquer um

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

Ou

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

Em resumo, é uma questão de onde está sendo usado e para isso.

Quanto aos bits, ainda luto com eles, mas é porque estou acostumado a trabalhar em um alto nível de abstração, como outros comentaristas sugeriram. Se eu me deparar com algum código que alguém decidiu usar para ser "eficiente", o tempo perdido enquanto eu descobri isso nega benefícios.

chooban
fonte
3
Eu direi que uso muito o operador ternário e acho bastante legível. É apenas uma questão de se acostumar a vê-lo e, como você disse, saber quando usá-lo. IMHO, se não puder caber em uma linha, use if-else.
jmort253
Eu acho que o quando é muito importante. No momento da revisão, repus o código ao longo das linhas de foo.setParam( bool ? ClassA.method() : ClassB.method ). Funciona, mas é um pouco de cheiro, IMO.
chooban
Não tenho certeza se eu concordo. Embora se você e eu estivéssemos trabalhando juntos, eu faria o possível para ser legal e conservador ao usar isso. :)
jmort253
Tudo se resume ao contexto. O exemplo em que eu estava pensando (que, é claro, eu não tenho que entregar / não posso postar) era onde a lógica de negócios sobre de onde extrair dados estava sendo obscurecida. Um exemplo de algum lugar em que algumas linhas extras de código e um comentário ajudariam o próximo desenvolvedor na área. Apenas não me inicie no código perl ilegível que usa unless ( !bool ) {. :)
chooban 11/03/12
3

Esta é mais uma resposta baseada em opinião, mas no meu caso:

  1. De fato, por alguma razão, acho o operador ternário menos legível do que uma construção if-else.

  2. Quanto ao XOR, provavelmente a maioria dos programas Java não tem utilidade para manipulações bit a bit de baixo nível. Na maioria das vezes, parece ser apenas uma relíquia herdada de C.

tudor
fonte