Frage

Ich persönlich mag den exklusiv oder , ^, Operator, wenn es Sinn im Zusammenhang mit boolean Kontrollen wegen seiner Prägnanz macht. Ich ziehe es viel zu schreiben

if (boolean1 ^ boolean2)
{
  //do it
}

als

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

, aber ich habe oft verwirrte Blicke von anderem erfahrenem Java-Entwickler (nicht nur die Neulinge), und manchmal von Besuchern, wie es nur für bitweise Operationen verwendet werden soll.

Ich bin gespannt, wie die besten Praktiken in Bezug auf die Nutzung des ^ Operator.

War es hilfreich?

Lösung

Sie können einfach verwenden != statt.

Andere Tipps

Ich glaube, Sie Ihre eigene Frage beantwortet haben - wenn Sie seltsame Blicke von Leuten bekommen, ist es wahrscheinlich sicherer, mit der expliziten Option gehen

.

Wenn Sie sie kommentieren müssen, dann sind Sie wahrscheinlich besser dran mit der ausführlichere Version ersetzt und nicht den Menschen die Frage an erster Stelle fragen.

Ich finde, dass ich eine Menge ähnliche Gespräche haben. Auf der einer Seite haben Sie eine kompakte, effiziente Methode, um Ihr Ziel zu erreichen. Auf der anderen Seite, haben Sie etwas, dass der Rest des Teams könnte nicht verstehen, macht es schwer, in die Zukunft zu erhalten.

Meine allgemeine Regel ist, zu fragen, ob die Technik etwas verwendet wird, dass es sinnvoll ist Programmierer in der Regel zu erwarten zu kennen. In diesem Fall denke ich, dass es vernünftig ist, Programmierer zu erwarten zu wissen, wie Boolesche Operatoren zu verwenden, so xor in einem mit if-Anweisung in Ordnung ist.

Als ein Beispiel für etwas, das nicht in Ordnung sein würde, nehmen Sie den Trick mit xor zwei Variablen zu tauschen, ohne eine temporäre Variable. Das ist ein Trick, den ich nicht jeder mit vertraut zu sein, erwarten würde, so wäre es nicht Code-Review übergeben.

Ich denke, es ist in Ordnung sein würde, wenn Sie es kommentieren, z.B. // ^ == XOR.

Sie können immer wickeln Sie es nur in einer Funktion ihm einen ausführlichen Namen geben:

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

Aber, so scheint es mir, dass es nicht für alle schwer sein würde, der nicht wusste, was der Operator ^ für Google ist es wirklich schnell. Es wird schwer sein, nicht nach dem ersten Mal zu erinnern. Da Sie für andere Zwecke gebeten, ihre gemeinsamen die XOR für Bit Maskierung zu verwenden.

Sie können auch XOR verwenden, um die Werte in zwei Variablen zu tauschen, ohne eine dritte temporäre Variable mit .

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

Hier ist ein Stackoverflow Frage XOR Zusammenhang Swapping .

Ich habe vor kurzem ein xor in einem JavaScript-Projekt bei der Arbeit und endete Zugabe von 7 Zeilen Kommentare zu erklären, was los war. Die Begründung für die Verwendung von xor in diesem Zusammenhang war, dass eine der Bedingungen (term1 im Beispiel unten) auf nicht zwei, sondern drei Werte annehmen kann: undefined, true oder false, während die andere (term2) true oder false werden könnte. Ich würde eine zusätzliche Kontrolle für die undefined Fälle mußte hinzufügen, aber mit xor, war folgende ausreichend, da die xor den ersten Term zwingt zunächst als Boolesche ausgewertet werden, lassen undefined als false behandelt bekommen:

if (term1 ^ term2) { ...

Es war am Ende ein bisschen zuviel des Guten, aber ich wollte es dort halten, wie auch immer, als eine Art ein Osterei.

if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

IMHO könnte dieser Code vereinfacht werden:

if(boolean1 != boolean2) 
{ 
  //do it 
} 

Mit Code Klarheit im Kopf, meine Meinung ist, dass in boolean Kontrollen XOR ist nicht typische Verwendung für den XOR-Bit-Operator. Aus meiner Erfahrung, bitweise XOR in Java ist Regel verwendet, um eine Maske flag toggle Verhalten zu implementieren:

flags = flags ^ MASK;

Diese Artikel von Vipan Singla erläutert die Verwendung Fall mehr im Detail.

Wenn Sie bitweise XOR wie in Ihrem Beispiel verwenden müssen, kommentieren, warum Sie es verwenden, da es wahrscheinlich sogar eine bitweise gebildete Publikum verlangen in ihren Tracks zu stoppen, zu verstehen, warum Sie es verwenden.

Wenn das Nutzungsmuster rechtfertigt es, warum nicht? Während Ihr Team der Bediener sofort nicht erkennt, mit der Zeit sie konnte. Menschen lernen neue Wörter die ganze Zeit. Warum nicht in der Programmierung?

Die einzige Warnung, die ich angeben könnte, ist, dass „^“ nicht den Kurzschluss Semantik Ihrer zweiten boolean Kontrolle hat. Wenn Sie wirklich den Kurzschluss Semantik benötigen, dann eine statische util Methode funktioniert auch.

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}

Ich persönlich bevorzuge die "boolean1 ^ boolean2" Ausdruck aufgrund seiner Prägnanz.

Wenn ich in Ihrer Situation bin (Arbeit im Team), würde ich durch Einkapseln der „boolean1 ^ boolean2“ Logik in einer Funktion mit einem beschreibenden Namen wie „isDifferent (boolean1, boolean2)“ einen Kompromiss schlagen.

Zum Beispiel, statt "boolean1 ^ boolean2" zu verwenden, würden Sie rufen "isDifferent (boolean1, boolean2)" wie folgt:

if (isDifferent(boolean1, boolean2))
{
  //do it
}

Ihre "isDifferent (boolean1, boolean2)" Funktion aussehen würde:

private boolean isDifferent(boolean1, boolean2)
{
    return boolean1 ^ boolean2;
}

Natürlich bringt diese Lösung die Verwendung eines angeblich Fremdfunktionsaufruf, der an mich zu Best Practices Kontrolle unterworfen ist, aber es vermeidet den ausführlichen (und hässlich) Ausdruck „(boolean1 &&! Boolean2) || (boolean2 && ! boolean1) "!

! = Ist OK zwei Variablen zu vergleichen. Es funktioniert nicht, obwohl, mit mehreren Vergleichen.

str.contains("!=") ^ str.startsWith("not(")

sieht für mich besser als

str.contains("!=") != str.startsWith("not(")

Als Bit-Operator ist xor viel schneller als jedes andere Mittel, sie zu ersetzen. So für die Leistung entscheidend und skalierbare Berechnungen, xor ist zwingend notwendig.

Meine subjektive persönliche Meinung: Es ist verboten, für jeden Zweck zu verwenden, Gleichheit (== oder! =) Für Boolesche Werte. Mit ihm zeigt Mangel an grundlegenden Programmier Ethik und Fundamentaldaten. Jeder, der dich anschaut gibt verwirrt ^ über sollte der Booleschen Algebra zu den Grundlagen zurückgeschickt werden (ich war versucht, zu schreiben „um die Flüsse des Glaubens“ hier :)).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top