Ich persönlich mag die ausschließliche oder , ^
, Bediener , wenn es Sinn im Zusammenhang mit boolean Kontrollen wegen seiner Prägnanz macht. Ich schreibe viel lieber
if (boolean1 ^ boolean2)
{
//do it
}
als
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
Aber ich bekomme oft verwirrte Blicke von anderen erfahrenen Java-Entwicklern (nicht nur von Neulingen) und manchmal Kommentare darüber, wie es nur für bitweise Operationen verwendet werden sollte.
Ich bin gespannt auf die Best Practices in Bezug auf die Verwendung des ^
Betreibers.
bool1 ^ bool2 ^ bool3
bool1 != bool2 != bool3
!=
liefert korrekte Ergebnisse fürboolean
s (aber nicht fürBoolean
s, seien Sie also vorsichtig). Es ist jedoch nicht immer schön, zum Beispiel(some != null) != (other != null)
nicht sehr lesbar. Sie müssen die Teile entweder in expliziten Booleschen Werten oder!=
in einer separaten Methode extrahieren .a ^ b
=> "a oder b, aber nicht beide",a != b
=> "a ist nicht gleich b". (Was @RobertGrant gesagt hat). Die meisten Menschen würden den ersten leichter verstehen, wenn sie wissen, was xor ist (was ziemlich nützlich ist, um zu wissen, ob Sie auf dem Gebiet des Rechnens sind ...)a != b
=> "a ist nicht identisch mit b"Ich denke, Sie haben Ihre eigene Frage beantwortet - wenn Sie seltsame Blicke von Menschen bekommen, ist es wahrscheinlich sicherer, die explizitere Option zu wählen.
Wenn Sie es kommentieren müssen, ist es wahrscheinlich besser, es durch die ausführlichere Version zu ersetzen und die Leute nicht dazu zu bringen, die Frage überhaupt zu stellen.
quelle
(boolean1 && !boolean2) || (boolean2 && !boolean1)
in einen realen Anwendungscode schreiben ...Ich finde, dass ich viele ähnliche Gespräche habe. Einerseits haben Sie eine kompakte, effiziente Methode, um Ihr Ziel zu erreichen. Auf der anderen Seite haben Sie etwas, das der Rest Ihres Teams möglicherweise nicht versteht, was es schwierig macht, es in Zukunft aufrechtzuerhalten.
Meine allgemeine Regel ist zu fragen, ob die verwendete Technik etwas ist, von dem man vernünftigerweise erwarten kann, dass Programmierer es im Allgemeinen wissen. In diesem Fall halte ich es für vernünftig, von Programmierern zu erwarten, dass sie wissen, wie man boolesche Operatoren verwendet. Daher ist die Verwendung von xor in einer if-Anweisung in Ordnung.
Nehmen Sie als Beispiel für etwas, das nicht in Ordnung wäre, den Trick, xor zu verwenden, um zwei Variablen ohne Verwendung einer temporären Variablen auszutauschen. Das ist ein Trick, mit dem ich nicht erwarten würde, dass jeder vertraut ist, also würde er die Codeüberprüfung nicht bestehen.
quelle
Ich denke, es wäre in Ordnung, wenn Sie es kommentieren würden, z
// ^ == XOR
.quelle
Sie können es jederzeit in eine Funktion einschließen, um ihm einen ausführlichen Namen zu geben:
Aber es scheint mir, dass es für niemanden schwer sein würde, der nicht wusste, wofür der Operator ^ ist, es wirklich schnell zu googeln. Es wird nicht schwer sein, sich nach dem ersten Mal zu erinnern. Da Sie nach anderen Verwendungszwecken gefragt haben, ist es üblich, das XOR für die Bitmaskierung zu verwenden.
Sie können XOR auch verwenden, um die Werte in zwei Variablen auszutauschen, ohne eine dritte temporäre Variable zu verwenden .
Hier ist eine Stackoverflow-Frage zum XOR-Austausch .
quelle
Ich habe kürzlich ein xor in einem JavaScript-Projekt bei der Arbeit verwendet und am Ende 7 Kommentarzeilen hinzugefügt , um 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) konnte nicht zwei nimmt aber drei Werte:undefined
,true
oderfalse
während der anderen (term2
) könnte sein ,true
oderfalse
. Ich hätte eine zusätzliche Prüfung für dieundefined
Fälle hinzufügen müssen, aber mit xor war Folgendes ausreichend, da das xor den ersten Term zwingt, zuerst als Boolescher Wert ausgewertet zu werden, und wie folgtundefined
behandelt wirdfalse
:Am Ende war es ein bisschen übertrieben, aber ich wollte es trotzdem dort behalten, als eine Art Osterei.
quelle
bool? a
Wert explizit auf true getestet werden. Gibta == true
es eine ähnliche Technik in Java? In C # würde bei zwei gegebenenbool?
Werten "Null als falsch behandeln" dazu führen(a == true) ^ (b == true)
. Eine äquivalente Formel lautet(a == true) != (b == true)
. Kannst du etwas ähnliches in Java machen?IMHO könnte dieser Code vereinfacht werden:
quelle
Im Hinblick auf die Klarheit des Codes bin ich der Meinung, dass die Verwendung von XOR bei booleschen Prüfungen keine typische Verwendung für den bitweisen XOR-Operator ist. Nach meiner Erfahrung wird bitweises XOR in Java normalerweise verwendet, um ein Maskenverhalten zu implementieren
flag toggle
:Dieser Artikel von Vipan Singla erklärt den Anwendungsfall ausführlicher.
Wenn Sie bitweises XOR wie in Ihrem Beispiel verwenden müssen, kommentieren Sie, warum Sie es verwenden, da wahrscheinlich sogar ein bitweises Publikum in seinen Tracks anhalten muss, um zu verstehen, warum Sie es verwenden.
quelle
Ich persönlich bevorzuge den Ausdruck "boolean1 ^ boolean2" wegen seiner Prägnanz.
Wenn ich in Ihrer Situation wäre (in einem Team arbeiten), würde ich einen Kompromiss eingehen, indem ich die Logik "boolean1 ^ boolean2" in eine Funktion mit einem beschreibenden Namen wie "isDifferent (boolean1, boolean2)" kapsle.
Anstatt beispielsweise "boolean1 ^ boolean2" zu verwenden, würden Sie "isDifferent (boolean1, boolean2)" wie folgt aufrufen:
Ihre Funktion "isDifferent (boolean1, boolean2)" würde folgendermaßen aussehen:
Natürlich beinhaltet diese Lösung die Verwendung eines scheinbar fremden Funktionsaufrufs, der an sich der Best Practices-Prüfung unterliegt, aber den ausführlichen (und hässlichen) Ausdruck "(boolean1 &&! Boolean2) || (boolean2 &&! Boolean1) vermeidet. "!
quelle
Wenn das Verwendungsmuster dies rechtfertigt, warum nicht? Während Ihr Team den Bediener nicht sofort erkennt, könnte es mit der Zeit. Menschen lernen ständig neue Wörter. Warum nicht in der Programmierung?
Die einzige Warnung, die ich sagen könnte, ist, dass "^" nicht die Kurzschlusssemantik Ihrer zweiten booleschen Prüfung hat. Wenn Sie die Kurzschlusssemantik wirklich benötigen, funktioniert auch eine statische util-Methode.
quelle
xor
, die genau das tut, was der xor-Operator tut, aber auf Umwegen, mehr Fragen in meinem Kopf aufwerfen (insbesondere über Kompetenz) als ein Programmierer, der gerade verwendet hat^
.! = ist OK, um zwei Variablen zu vergleichen. Bei mehreren Vergleichen funktioniert dies jedoch nicht.
quelle
Als bitweiser Operator ist xor viel schneller als jedes andere Mittel, um es zu ersetzen. Für leistungskritische und skalierbare Berechnungen ist xor daher unerlässlich.
Meine subjektive persönliche Meinung: Es ist für jeden Zweck absolut verboten, Gleichheit (== oder! =) Für Boolesche Werte zu verwenden. Die Verwendung zeigt einen Mangel an grundlegender Programmierethik und Grundlagen. Jeder, der Sie verwirrt ansieht, sollte zu den Grundlagen der Booleschen Algebra zurückgeschickt werden (ich war versucht, hier "an die Flüsse des Glaubens" zu schreiben :)).
quelle
sieht für mich besser aus als
quelle