Ternärer Operator (Bedingung? Foo: bar) und XOR (^) -Operator

8

Ich habe kürzlich in einer Codeüberprüfung gelesen, dass beide ternary operator (condition ? foo : bar)und die XOR operator ^in Java selten verwendet werden. Ist es wahr?

Wenn ja, liegt das daran, dass sie weniger lesbar sind? oder aus einem anderen Grund.

Kuldeep Jain
quelle
5
Der XOR-Operator ist in der allgemeinen Programmierung im Allgemeinen eher selten.
Die von beiden bereitgestellten Funktionen werden häufig als IF-ELSE-Anweisungen implementiert.

Antworten:

8

Der ternäre Operator wird gut verwendet, insbesondere für kurze Nullprüfungen / Standardeinstellungen:

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

Einige Leute halten dies für nicht so lesbar wie ein Wenn / Sonst, aber das war nicht die Frage.

Der bitweise XOR- Operator wird nur bei der Bitverarbeitung verwendet. Wenn Sie ein bitweises XOR benötigen, führt kein Weg daran vorbei.

Der logische XOR- Operator ist in der Tat so selten, dass ich ihn in den letzten zehn Jahren in Java in gültigen Fällen nicht gesehen habe . Dies liegt auch daran, dass das boolesche XOR nicht wie ||oder "skaliert" &&. Was ich meine:

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

Im letzten Fall würde der Codierer "nur einer sollte wahr sein" bedeuten. Aber XOR ist ein Biest. Der Kodierer hat das Biest bekommen und nicht, was er wollte.

Das wäre eine interessante Interviewfrage: Was ist das Ergebnis der letzten if?

AH
quelle
7
Ich denke, wir sehen das logische XOR nicht, weil die Leute '! =' Lesbarer finden.
Nettogrof
1
Es wäre eine großartige Trivia-Frage, aber in einem Interview wäre sie nutzlos. Wenn ich etwas weiß, das seit 10 Jahren niemand mehr gesehen hat und das ich wahrscheinlich nie verwenden werde, kann ich nicht sagen, ob Sie guten, lesbaren Code schreiben und Produkte auf den Markt bringen können. :)
jmort253
1
@ jmort253: Wenn Sie diese Art von Code mehr als einmal gesehen haben. Es war aber jeweils ungültiger Code. Eine Interviewfrage wie diese würde mir also sagen, ob der Bittsteller weiß, wie man stinkenden Code erkennt oder nicht.
AH
@AH - Ok, das macht Sinn. Sie wollen auf jeden Fall Leute, die wackelige Logik erkennen können. :)
jmort253
Außerdem stimme ich @Nettogrof zu - ich habe !=ein paar Mal Boolesche Werte verwendet, und logisches XOR ist mir noch nie in den Sinn gekommen.
Izkata
7

Früher war es schwierig, den ternären Operator zu analysieren, aber seitdem habe ich festgestellt, dass es einige Stellen gibt, an denen er sehr nützlich ist. Dies ist in der Regel keine Anwendungslogik, sondern eine Protokollierung.

Zum Beispiel:

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

Für mich ist das viel ordentlicher als beide

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

Oder

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

Zusammenfassend ist es eine Frage, wo es verwendet wird und dafür.

Was das Bit angeht, habe ich immer noch Probleme damit, aber das liegt daran, dass ich es gewohnt bin, auf einem hohen Abstraktionsniveau zu arbeiten, wie andere Kommentatoren vorgeschlagen haben. Wenn ich irgendwo im Code auf etwas stoße, das jemand als "effizient" bezeichnet, wird die Zeit, die verschwendet wird, während ich es herausfinde, die Vorteile zunichte machen.

Chooban
quelle
3
Ich werde sagen, dass ich den ternären Operator häufig benutze und ihn gut lesbar finde. Es geht nur darum, sich daran zu gewöhnen, es zu sehen, und wie Sie sagten, zu wissen, wann man es benutzt. IMHO, wenn es nicht in eine Zeile passt, dann benutze if-else.
jmort253
Ich denke das Wann ist sehr wichtig. Zum Zeitpunkt der Überprüfung habe ich den Code nach dem Vorbild von zurückgestoßen foo.setParam( bool ? ClassA.method() : ClassB.method ). Es funktioniert, aber es riecht ein bisschen, IMO.
Chooban
Ich bin mir nicht sicher, ob ich damit einverstanden bin. Wenn Sie und ich zusammenarbeiten würden, würde ich mein Bestes geben, um nett zu spielen und konservativ damit umzugehen. :)
jmort253
Es hängt alles vom Kontext ab. Das Beispiel, an das ich dachte (das ich natürlich nicht übergeben muss / kann), war, dass die Geschäftslogik darüber, woher Daten abgerufen werden sollen, verdeckt wurde. Ein Beispiel dafür, dass ein paar zusätzliche Codezeilen und ein Kommentar dem nächsten Entwickler in der Region helfen würden. Lassen Sie mich nur nicht mit unlesbarem Perl-Code anfangen, der verwendet wird unless ( !bool ) {. :)
Chooban
3

Dies ist eher eine meinungsbasierte Antwort, aber in meinem Fall:

  1. Aus irgendeinem Grund finde ich den ternären Operator weniger lesbar als ein if-else-Konstrukt.

  2. Was XOR betrifft, haben wahrscheinlich die meisten Java-Programme keine Verwendung für solche bitweisen Manipulationen auf niedriger Ebene. Zum größten Teil scheint es nur ein Relikt zu sein, das von C. geerbt wurde.

Tudor
quelle