Machen Sie eine große Sache aus == wahr?

105

Es gibt einen Kollegen von mir, der ständig schreibt:

if (someBool == true)

Es treibt mich die Wand hoch! Soll ich eine große Sache daraus machen oder es einfach fallen lassen?

JoelFan
quelle
12
Ich bevorzuge das explizite if (some_flag == true)aber das implizite if (is_something)oder if (has_something). Beachten Sie die Variablennamen.
Fredoverflow
69
Erinnern Sie Ihren Kollegen daran, dass der Typ von someBool == trueauch boolesch ist, also sollte er nach der gleichen Logik sein if ((someBool == true) == true).
Mike Seymour
2
@GSto: Ich nehme an, du weißt es, aber in PHP kannst du das tun, um irgendetwas auf einen Bool zu "werfen" und das kann tatsächlich nützlich sein.
Zneak
2
@zneak Oder du könntest klarer und sinnvoller sein $var = (bool) some_expression. Und in den meisten Fällen spielt es keine Rolle, da PHP die erforderlichen Konvertierungen dynamisch ausführt.
Waiwai933
4
Überprüfen Sie immer zuerst die Konstante if (true == someBool), falls Sie versehentlich = anstatt == [Ja, ich mache Witze!] eingegeben haben
Steven A. Lowe

Antworten:

126

Es ist nur redundanter Code, nicht Leben oder Tod. Jedoch....

Wenn es viel passiert, könnte es ein Problem mit someBoolder Namensgebung geben. Ein guter Name kann einen großen Beitrag dazu leisten, die Notwendigkeit von==true

if(IsSomeCondition)

oder

if(hasCondition)

oder

if(somethingExists)

zum Beispiel.

Robert Harvey
quelle
Das klingt für mich am zutreffendsten. Es dreht sich alles um Klarheit und die Kunst der Benennung. Die ursprüngliche Syntax ist nicht so schlecht, aber dies ist der richtige Weg zu besserem Code.
TJB
2
Schlagen Sie mich dazu! Ohne entsprechende Benennung macht die prägnantere Äquivalenz überhaupt keinen Sinn.
Troy Hunt
4
Ich musste someBool == trueaus Gründen der Übersichtlichkeit mehrmals für Legacy-Code verwenden. Aber wenn ich von Grund auf neu schreibe, if (isSomething)
benenne
Ich stimme zu, auch wenn der Name dies lösen würde, vorausgesetzt, der Name wäre SomeBool, könnte er alles bedeuten und von jedem Typ sein (eine ganze Zahl, die der Anzahl der Booleschen Werte in einem Array entspricht, vielleicht?). Booleaner brauchen eine Art existenzielles Verb, oder sie sind für sich allein immer schwer zu lesen.
Morgan Herlocker
Ich stimme zu, es dreht sich alles um Lesbarkeit. Wenn Variablen gut benannt sind, brauchen Sie sie nicht. Wenn sich der Ausdruck damit besser lesen lässt, würde ich "== true" wählen, auch wenn Sie "== false" anstelle von (dem hässlichen) "if (! ())" Verwenden.
Ronny Brendel
71

Wenn ich sehe someBool == true, kann ich nicht anders, als das Gefühl zu haben, dass der Programmierer die Idee der Evaluierung nicht verinnerlicht hat , was ein ziemlich grundlegender Mangel ist.

Meine Sichtweise ist jedoch verzerrt, weil ich mehrere Sommer im College verbracht habe, um Kindern Programmieren beizubringen, die häufig solche Ausdrücke geschrieben haben, weil sie die mentale Übung, einen Ausdruck zu bewerten, nicht wirklich gemeistert haben. Sobald sie sich mit dem Konzept befasst hatten, wurde die Redundanz offensichtlich.

Für einen sonst kompetenten professionellen Programmierer ist dies wahrscheinlich nicht der Fall. Es ist wahrscheinlich nur eine schlechte Angewohnheit, die sie in ihren frühen Tagen des Programmierens entwickelt und nie ganz erschüttert haben. Aber es würde mich immer noch ein bisschen erschrecken, wenn es das erste war, was ich in einem Interview gesehen habe.

Tim Goodman
quelle
Ich würde das nicht so schnell zur Gewohnheit machen. Ich habe einige wirklich atemberaubende Dinge aus dem Munde professioneller Programmierer gehört. Normalerweise folgte kurz darauf einer der Grokker: "Wie hat das jemals funktioniert?"
Dash-Tom-Bang
12
Stimmen Sie der Bewertung uneingeschränkt zu. Gelegentlich habe ich mich gefragt: "Wo hört es auf?" if ((((x == true) == true) == true)! = false) // und so weiter ...
yawmark
1
Manchmal habe ich geschrieben if (c == true) return true; else return false;, aber in 99% der Fälle (die 1% sind da, da ich nie sicher sein kann, dass ich einige nicht verpasst habe) werde ich das Ganze sofort bemerken und durch ein anderes ersetzen return c. Ich gehe davon aus, dass die meisten kompetenten Programmierer etwas Ähnliches tun sollten, wenn sie die Gewohnheit zu Beginn ihrer Karriere entwickelt haben. Was ich nicht erwarten würde, ist eine wtf Antwort.
Lie Ryan
1
Oh Mann, die Kunst des Denkens. Ich bin letzte Woche in unserer Codebasis buchstäblich darauf gestoßen. if (!someCondition) { someCondition = false; }Ich habe einige (ähm, viele) Redundanzen sowie einige Unmöglichkeiten in unserem Code gesehen, aber dieser war so einfach und doch so ärgerlich zu glauben, dass jemand ihn tatsächlich geschrieben hat. Mehrmals sogar.
Anthony Pegram
1
Beachten Sie nur, dass ich einige Fälle gesehen habe, von if(x) x=true;denen NICHT redundant waren, sondern das Äquivalent von x=!!x;(normalisieren von x auf 0/1)
jkerian
58

Das macht mich auch verrückt, aber ich würde ihnen die Redundanz konstruktiv erwähnen und sie dann fallen lassen, auch wenn sie nicht übereinstimmen.

Alternativ können Sie diesen Ansatz ausprobieren:
Sie: Können Sie beginnen, die folgende Codekonvention für die Auswertung von Booleschen Werten zu verwenden?

if (someBool==true)&&(true==true) {}

Sie: Warum sollten wir das tun? Die zweite Hälfte dieser Aussage ist überflüssig, sie würde immer als wahr gewertet.

Sie: Bei George, Sie haben Recht. Wie dumm von mir. Dann gehen wir einfach mit einer Version ohne Redundanz. Wie wäre es mit?

if (someBool) {}
JohnFx
quelle
6
Ja, stimmte zu. Es ist albern, aber du musst deine Kämpfe auswählen, und dieser Code tut in der Tat, was deine Kollegen tun werden. Erwähne es in einem nicht- "Was zur Hölle ist FALSCH mit dir ?!" Art und Weise, dann lass es. Aber wenn sie anfangen Mist wie "if (someBool! = True)" oder "if (! SomeBool == true)" oder andere solche Windungen zu ziehen, könnte das ein Kampf sein, der es wert ist, ausgewählt zu werden ...
BlairHippo 18.10.10
3
Wie ist (someBool == false) schlechter als wenn (someBool == true)?
FinnNk 18.10.10
5
true=truenicht kompilieren, können Sie nicht zuordnen zu true;-)
fredoverflow
1
Ich habe mich an if(somebool == false)oder gewöhnt !=, aber immer gegen falsch und nicht wahr. Ich finde es überflüssig, aber da der Codierungsstandard darauf besteht, dass er if()wie ein Funktionsaufruf aussieht, hilft mir das Leerzeichen zwischen den Parens, ihn zu lesen. Ein Bool ist für sich genommen ein Bool, aber er if (somePointer)fliegt nicht; Ich bevorzuge, if (somePointer != NULL)da ein Zeiger kein Narr ist.
Dash-Tom-Bang
5
Es geht um Lesbarkeit, nicht um Unlogik oder (Mikro-) Redundanz
Ronny Brendel
45

Ich denke, wenn etwas so Triviales Ihr größtes Problem mit Ihren Mitarbeitern ist, sollten Sie sich für ziemlich glücklich halten.

GrandmasterB
quelle
5
Gut gesagt, es ist gut, nach Perfektion zu streben, aber es gibt sicherlich größere Fische zum Braten
TJB
3
Ich denke, Sie sagen dies zu jedem Problem, das eine Diskussion verdient.
Dave Van den Eynde
2
Dies weist möglicherweise auf viel größere Probleme hin. Ein kleiner brauner Fleck an der Decke in Ihrer Garage scheint vielleicht keine große Sache zu sein, aber es könnte bedeuten, dass Sie ein großes Wasserleck haben.
Josh
42

Sie sollten diese schlechte Angewohnheit definitiv beenden. Sanft...

Es ist leicht zu vergessen, die doppelten Gleichheitszeichen zu schreiben und den Code in Folgendes umzuwandeln:

if (someBool = true)

In C # wird zum Beispiel nur eine Warnung ausgegeben, kein Fehler. Wenn Sie also Warnungen nicht als Fehler behandeln, wird der Code ausgeführt. Setzen Sie die Variable auf true und geben Sie immer die Bedingung ein.

Guffa
quelle
6
Dies ist kein relevantes Argument. Wenn Sie in einer solchen Sprache arbeiten, können Sie das Wahre einfach auf die andere Seite stellen. Die Frage ist, ob das Wahre überhaupt aufgenommen werden soll oder nicht.
Cam
8
@Cam: Fehlt dir der Punkt. Rückwärtslogik schlage ich nicht vor.
Guffa,
15
@Cam - Er gibt ein reales Beispiel dafür, wann dies ein Problem sein kann. Ich würde sagen, das ist ziemlich relevant.
ChaosPandion
1
@Guffa Cam ist sehr richtig. Dies ist kein Grund, die Verwendung von == (anyType) in if-Blöcken zu beenden.
Ronny Brendel
2
@Ronny: Nein, es kann bei keinem Typ vorkommen (es sei denn, die Sprache lässt tatsächlich einen Typ als Bedingung zu). Die Anweisung wird if (answer = 42) {}einfach nicht kompiliert, da der Ausdruck kein Bool ist.
Guffa
21

Ich stimme dir zu, aber ich werde hier den Anwalt des Teufels spielen:


Abhängig von der Sprache und dem Namen der Variablen ist x == true angemessen:

Betrachten Sie die folgende Situation in einer Sprache mit statischer Typisierung und Typenzwang für ganzzahlige Typen:

if (actionsAllowed){
    //do actions, since they are allowed
    //...
}

Jemand, der diesen Codeabschnitt liest, erkennt möglicherweise nicht sofort, dass actionsAllowed eine boolesche Variable ist - es kann sich auch um eine Ganzzahl handeln, die die Anzahl der zulässigen Aktionen darstellt. Wenn Sie == true hinzufügen, wird klar, dass x ein Boolescher Wert ist und keine Ganzzahl, die zu einem Booleschen Wert gezwungen wird:

if (actionsAllowed == true){
    //do actions, since they are allowed
    //...
}
Nocken
quelle
13
Lesbarkeit == GoodThing
Muad'Dib
5
if ((readability == GoodThing) == true) ...
JoelFan
1
bool isGoodThing = Lesbarkeit? true: (CodingStandards? true: (InternalizationOfConcept? true: false));
Johnc
17
Benennen Sie die Variable also um actionsAreAllowed.
Graeme Perrow
9
Indem if (x) { ...Sie schreiben , behaupten Sie bereits, dass xes sich um einen Booleschen Wert handelt oder dass er in einen Booleschen Wert konvertierbar ist. Was Sie es nennen, ist irrelevant.
Daniel Earwicker
15

Was ist mit nullbaren Bools?

bool? MyFlag = null;

if (MyFlag == true)
    ;  

if (MyFlag)  // error, doesn't compile!
    ; 
Steve Wellens
quelle
if (MyFlag.Value)
johnc
1
Nicht alle Sprachen haben nullbare Bools, und viele von denen, die dies tun, akzeptieren Ihr zweites Konstrukt.
19.
1
@johnc: "if (MyFlag.Value)" macht möglicherweise nicht wirklich das, was Sie wollen, da es eine Ausnahme auslösen kann, wenn MyFlag null ist (was Sie testen können, indem Sie MyFlag.HasValue überprüfen).
Ludovic Chabant
4
Dies ist mein Haustier ärgern mit nullable Bools :)
Jarrod Dixon
3
Dummkopf? isValid = null; if (isValid ?? false);
Skolima
11

Normalerweise möchten Sie nicht viel aus Kodierungskonventionen machen, es sei denn, diese Konvention behindert das Projekt in erheblichem Maße. Ich habe so manche hitzige Auseinandersetzung über Kleinigkeiten wie Coderegionen und führende Unterstriche eskalieren sehen.

Abgesehen davon sehe ich kein Problem darin == true, eine bedingte Anweisung zu ergänzen. In der Tat habe ich die Angewohnheit, == falsebeim Testen auf negative Bedingungen anstelle eines führenden Ausrufezeichens zu verwenden. Ich denke, es ist besser lesbar.

Wenn es eine festgelegte Konvention gibt, sage ich, befolge sie, es sei denn, es besteht Grund zur Änderung. Es lohnt sich jedoch nicht wirklich, einen großen Gestank hervorzurufen.

Casey
quelle
1
Abhängig von Ihrer Sprache ist someValue möglicherweise nicht unbedingt das Äquivalent von true, selbst wenn es als true ausgewertet wird. Beispielsweise wird (9 == True)in Python false ausgewertet, und ich würde mir vorstellen, dass dies in C ++ ähnlich ist.
Dash-Tom-Bang
Coderegionen und führende Unterstriche bringen mich dazu, Menschen ins Gesicht zu schlagen.
MGOwen
11

Ack. Ich bin dieser Typ. Die Schande, die Schande. So habe ich gelernt und so habe ich es in meinem Kopf "automatisch formatiert". Das einzige Mal, dass ich Joels bevorzugte Syntax verwende, ist, wenn die bool-Variable ein Verbpräfix wie "is" hat. Ich brauche das Verb, sei es "is", "can", "did" oder ich brauche das ==, um das Verb "equals" bereitzustellen. Ich werde diese Angewohnheit vielleicht nie aufgeben, also werde ich es verstehen, wenn Sie mir auf der Straße nicht „Hallo“ sagen.

Scott Fletcher
quelle
7
Es ist keine schlechte Sache. Code, der sich wie echter Text liest, ist weitaus besser als implizites foo. Behalten Sie diese Gewohnheit für die Lesbarkeit.
Ronny Brendel
11

erinnere mich an "Boolean Madness Code", es ist wie diese

if(someBool == true)
   otherBool = false;
else
   otherBool = true

Anstatt von:

 otherBool = !someBool
Marcelo de Aguiar
quelle
Das ist lustig, ich musste ein System unterhalten, in dem überall Abfälle waren. Es hat mich verrückt gemacht.
Tjaart
8

Persönlich mag ich es nicht, in C-basierten Sprachen "nicht" zu sagen. Das kleine Ausrufezeichen ist zu leicht zu übersehen.

Daher schreibe ich es vollständig aus:

if (someCondition == false) {

Nachdem ich das eine Weile gelesen habe, möchte ich auch Symmetrie mit

if (someCondition == true) {

Betrachten Sie es also als ein Artefakt von C !anstelle von not.

user1249
quelle
3
C ++ tatsächlich hat den notBetreiber, und so auch C (sobald Sie die Standard - Header enthalten <iso646.h>). Wenn Sie nicht wollen (oder können) verwenden diesen Header (oder wenn Sie mit Java oder C # stecken), schlage ich vor , einen Raum nach dem Ausrufezeichen setzen: if (! condition). Dies macht es etwas auffälliger.
Konrad Rudolph
1
Ich mache Java. notist keine Option.
6

Das hängt von der Sprache ab, ist aber normalerweise eine schlechte Idee ...

Tun Sie dies in C niemals . Es ist zu einfach, eine Situation zu finden, in der der zu testende Wert nicht falsch (ungleich Null) ist, sondern auch nicht dem als "wahr" definierten Einzelwert entspricht.

Führen Sie dies in Ruby nur aus, wenn Sie absolut sicher sind, dass Sie bei allen außer Boolean true fehlschlagen möchten.

In C ++ und anderen statischen Sprachen mit einem Bool-Typ ist es redundant und kann zu Programmierfehlern führen, wenn Sie =anstelle von einen Tippfehler eingeben ==, oder zu Hochstufungsfehlern, wie in den Kommentaren erwähnt.

AShelly
quelle
Tatsächlich ist in Sprachen, in denen der Zuweisungsoperator einen Wert zurückgibt ... wie C ++ ... if (b == true) {nicht nur redundant. Es ist auch ein bisschen riskant, weil Sie versehentlich zugewiesen könnte truezu b.
Stephen C
4
Es ist nicht nur redundant in C ++, es ist gefährlich. Wenn Sie schreiben if (b == true)und bkein Narr sind, gehen die Typkonvertierungen in die falsche Richtung. A boolist ein integraler Typ, der normalerweise auf einen geeigneten integrierten Typ mit dem Wert gefördert wird 1. Wenn Sie schreiben, sagen wir, int b(2); if (b == true)dann trueeine wird intmit dem Wert 1 zum Zwecke des Vergleichs, anstatt bwird in Typ umgewandelt bool, die das richtige Ergebnis geben würde.
David Thornley
@DavidThornley, aktiviere Warnungen in deinem Compiler. Warnungen als Fehler zu behandeln, ist eine bessere defensive Programmiertechnik, als sie zu vermeiden ==.
Abyx
5

Findest du das schlecht? Wie wäre es mit:

if(someCondition) {
  return true;
} else {
  return false;
}
Sverre Rabbelier
quelle
2
Junge, wie oft habe ich das gesehen. Dies ist ein gutes Argument für ein Tool wie ReSharper.
Job
Ja - wenn Sie Schollen mieten, dann kaufen Sie ReSharper.
Kirk Broadhurst
4

ich bevorzuge

if (bVal)

oder

if (!bVal)

Auch, aber ich fürchte, dass es die Leute verärgert, wenn man es anspricht. Deshalb ist es mein Rat, es zu vergessen. Es tut uns leid!

grokus
quelle
4
Für die Liebe von allem, was heilig ist, solange es nicht if (!bNotVal) oder if (bNotVal)überhaupt in erster Linie ist. Ugh Negative in Namen erschweren das Lesen.
Dash-Tom-Bang
2
Ich kannte einen Entwickler, der NotConnected täuschen würde. if (isNotConnected == true) ... yuck
johnc
4

Sie sollten ihm sagen, dass er es falsch macht.

es ist

if (true == someBool) {

}

wenn er jemals eines vergisst, hat er große Probleme mit seinem Schreibstil.

Anzeigename
quelle
3

Wie wäre es mit

if (x == "true")

WARUM IST DAS EINE SAITE ?!

atfergs
quelle
Ich arbeite gerade an einem älteren PHP-Code und manchmal finde ich so etwas if(preg_match('/title/', implode($_POST))){. PHP, genug gesagt, ich muss einen besseren Job finden.
Keyo
4
ja, ich sehe auch, ob (x == "1"), aber das ist in der Regel schlecht zu DB-Design zu tun.
atfergs
Ich habe ähnliche Konstrukte verwendet, wenn xsie von Benutzereingaben stammen (z. B. Konfigurationsdatei oder Webdienst). Allerdings erlaube ich normalerweise andere wahre Werte, so dass es eher wieif x.lower().strip() in ["true", "yes", "on", "1"]
eswald
3

Tatsächlich wäre ein Test auf x == true erforderlich, wenn es nullbar ist. :)

Matt Sherman
quelle
3

Ich schreibe so Code!

Hier ist warum:

"if bla == true" liest sich wie ein Satz, "if bla" in vielen Fällen nicht. Es klingt einfach falsch, wenn man den aktuellen Code liest.

Außerdem warnt der Compiler vor Zuweisungen in if-Blöcken, sodass die Verwendung von == true keine Gefahr darstellt. (Verwechslung mit =)

Verwenden auch Leute, die nicht "== true" schreiben, das "! ()" Für "== false"? Ich finde es wirklich hässlich. Und wenn Sie "== false" verwenden, ist es nur sehr konsequent, auch "== true" zu verwenden, anstatt zwei verschiedene Möglichkeiten zur Überprüfung der Wahrheit zu haben.

Ronny Brendel
quelle
3
Sie sagen, dass "wenn bla" nicht wie ein Satz liest ... das bedeutet, dass Ihre Variable nicht richtig benannt ist ... was daran falsch ist: if (userHasRights) doSomething ()
JoelFan
"in vielen Fällen". Ja, du hast recht. Das Umbenennen ist auch in Ordnung. Mit "if (QWidget :: acceptDrops () == true)" haben Sie keine Möglichkeit, umzubenennen. Vielleicht wäre es gut, ihn doesAcceptDrops () zu nennen ... Es ist zu mühsam (und es ist unmöglich, diese Auslassungsregel in jeder API konsistent zu verwenden), also mit anderen "== whatever" -ifs konsistent zu sein. Ich empfehle dringend, es nicht wegzulassen, damit es nicht anders "aussieht" und somit konsistent aussieht.
Ronny Brendel
3

Denken Sie daran, dass Sie als Teil eines Teams arbeiten. Deshalb müssen Sie diese Dinge gemeinsam erarbeiten. "Plays nice with others" ist auch nach der Grundschule ein wichtiges Persönlichkeitsmerkmal :)

cdkMoose
quelle
2

Im Allgemeinen wird das '== true' weggelassen, aber es ist kaum eine Minute wert, darüber zu diskutieren, es sei denn, Sie haben es in den Codierungsstandards Ihres Teams enthalten.

FinnNk
quelle
3
Auch wenn es in den Kodierungsstandards des Teams liegt, müssen Sie die Standards wirklich neu bewerten, um solche Kleinigkeiten loszuwerden.
JohnFx
Einverstanden! Nur für den Fall ...
FinnNk
2

Obwohl ich als hauptsächlich C # -Entwickler zustimme, kann ich nicht sagen, dass dies immer der Fall ist. In Javascript führt das === beispielsweise eine Typkoaleszenz durch. Angenommen also var x = 3, dann:

if(x) --> true

während

if (x === true) --> false

Ich denke, das ist etwas anderes als ==, da ich selbst in JS nicht if (x == true) verwenden würde, sondern nur etwas, worüber ich nachdenken müsste .

Diese Art von Berührungen berühren jedoch einen anderen Punkt, der in meinem Büro aufgetaucht ist:

bool b = false;

In C # ist bool b; wäre genug und würde b zu falsch initialisieren . Es ist jedoch expliziter, die obige Zeile zu schreiben und sollte trotzdem vom Compiler während der Optimierung herausgerissen werden.

Mein Punkt ist also, dass es nicht immer so offensichtlich ist, was eine gute Praxis ist und was nicht. Vieles hängt von Vorlieben und Sprachfeatures / Macken ab.

Statichippo
quelle
bool b;Wird nur dann mit false initialisiert, wenn bes sich um ein Feld handelt. Sie müssen lokale Variablen explizit initialisieren.
Matthew Flaschen
+1 vereinbart. Es ist das gleiche Problem mit anderen (Skript-) Sprachen. Sie müssen explizit angeben, ob Sie auf Boolean trueoder nur auf "true" testen möchten . Zum Beispiel wird jede nicht leere Zeichenfolge berücksichtigt == true, jedoch === truein einigen Sprachen nicht.
Martin Wickman
2

Ah ja, aber was ist, wenn die Variable nullbar ist? (Bool?)

Einige Sprachen (C #) erfordern und cast oder Vergleich mit "true".

bool? isAccepted = true;

if((bool)isAccepted)
{...}

if(isAccepted == true)
{...}
Jared G
quelle
2

Die Jungen kennen die Regeln, aber die Alten kennen die Ausnahmen;)

C#Wenn Sie sich mit einem beschäftigen null-able bool, müssen Sie spätestens :

bool? x = null;
bool? y = true;
bool? z = false;
if (x == true || y == true || z == true) {
    // That was the only way that is reasonably readable that I know of
    // to accomplish this expression.
}

Wenn Tristate kein Problem ist, sollte es normalerweise keinen Grund geben, etwas mit true/ zu vergleichen True. In und in Pythonmehreren anderen Sprachen C/C++können Sie jedoch einen ifAusdruck ausführen, der nicht bool ist. Diese Sprachen haben eindeutige Regeln für die Interpretation von Ganzzahlen, Zeigern, Listen usw. als wahr oder falsch. Manchmal willst du das nicht. Zum Beispiel in diesem Python-Snippet:

x = True
y = 'abcdef'
z1 = x and y
z2 = (x == True) and (y == True)

Hier zsollte sein True, z2sollte aber sein False. Nun Clojurenähert sich eine Sprache dies auf eine andere Art und Weise - da wird die andFunktion nicht unbedingt als a bewertet bool, aber die ifkann damit umgehen.

Unabhängig von der Sprache lohnt es sich wahrscheinlich, Kommentare abzugeben, wenn Sie etwas mit Trueoder vergleichen False.

Job
quelle
Das erste Problem rührt von einer falschen IMO-Voraussetzung her, bei der schreckliche Variablennamen verwendet werden. Es seien x, y, z wurden genannt notExceptButHasX, exceptNotButIsntY, doNotUnlessIsExceptZ? Wie trägt das zur Lesbarkeit Ihres Problems bei? Wenn x, y, z einen Namen wie "isEnabled", "isEffective", "hasProperty" haben, ist Ihre Aussage isEnabled || isEffective || hasPropertyweitaus lesbarer als der Vergleich mit trueoder false.
Thomas
1

Eine solche Kodierung hätte mich auch schon früher falsch gerieben. Obwohl Ihr Beispielbezeichner den Namen "someBool" trägt, kann die versehentliche Verwendung dieses Codierungsstils für eine Variable, für die nicht garantiert wurde, dass sie ein Boolescher Wert ist, zu unbeabsichtigtem Verhalten führen. Wenn der Wert von "someBool" nicht genau "true" oder "false" ist, ist das Ergebnis "false".

Ich bin im vergangenen Jahr auf einen sehr subtilen Fehler gestoßen, der durch einen solchen Codierungsstil verursacht wurde, der schwer zu identifizieren war, weil die Augen über solchen Konstrukten glänzten. Sie würden denken, "Wie könnte es falsch sein?" Dasselbe gilt für wohlverstandene Ausdrücke wie "(var)" oder "(! Var)", die Sie lesen oder codieren, ohne ihr Verhalten zu überprüfen.

Deshalb habe ich einige Codierungsstandards eingeführt, um die Existenz solcher Fehler in der Codebasis und die Wahrscheinlichkeit, dass sich solche subtilen Fehler in Zukunft versehentlich einschleichen, zu verringern.

  1. Alle Ausdrücke müssen in Klammern angegeben werden.
  2. Alle booleschen Tests müssen negativ sein, wie "suchBool! = False".

Durch die Bereinigung von Code, der nicht dem neuen Stil entspricht, habe ich einige weitere Fälle solcher subtiler Fehler identifiziert und korrigiert.

Huperniketes
quelle
1
Einiges von someBool kann etwas anderes als TRUE / FALSE sein. Dies ist eine schlechte Codierungspraxis.
AttackingHobo
@ AttackingHobo, das ist eine der Gefahren, wenn man keine Booleschen Typen in einer Sprache hat und / oder keine Klasse verwendet, um das gewünschte Verhalten zu erzielen.
Huperniketes
1

Musste dies die ganze Zeit in ActionScript 2 verwenden (zugegebenermaßen jetzt eine tote Sprache), weil:

var something:Boolean = org.black.box.unknown.ThisMightNotExistYet();

// this is slightly ambiguous
if(something)
{
}

// because if you allow undefined you might actually mean
if(false != something)
{
}

// which can mean something different than
if(true == something)
{
}

// and comparing against what you actually MEAN is less script than
if(undefined != value && value)
{
}

Es war also fast immer das Beste, genau zu sein.

bburbank
quelle
1

Genau. Es ist eine redundante Konstruktion, insbesondere in stark getippten Sprachen.

Um einen weiteren Missbrauch von Booleschen Werten hinzuzufügen, habe ich diese Art von Konstruktion einige Male in Javascript gefunden (insbesondere bei einigen spaghettiartigen Monsterfunktionen, wie in über 100 Zeilen):

//create the variable, not initializing it
var flag;
//...
//assing a value to the var, by the example 
flag=$("mycheckbox").selected;
//...

//and at the moment of use it:
if(flag!=true) {
   //code to execute when the checkbox is unchecked
}

Es scheint, dass einige Programmierer es aufgrund des Fehlens einer strengen Typdefinition in dieser Sprache vorziehen, nicht mit den false|undefinedWerten herumzuspielen .

Tomas Narros
quelle
1

Ich habe einen Kollegen, der einen Code wie diesen haben wird:

if(something == true)

Und dann möchte er für eine Art Test / Debugging diesen Block nicht aufrufen und ändert ihn in:

if(something == true && false)

Und dann ändert er es gelegentlich zu:

if(false)

Das Schlimmste ist, diese Art des Debuggens hat sich bei mir gelegentlich ausgewirkt und ist für andere Entwickler wirklich schlecht zu lesen!

ingh.am
quelle
0

Ich würde sagen, Konsistenz ist das A und O in einer Codebasis. Verwenden Sie daher den Stil, der in Ihrer Organisation am häufigsten verwendet wird. Versuchen Sie, Ihren bevorzugten Stil in die offiziellen Kodierungsrichtlinien des Unternehmens aufzunehmen. Wenn es bereits in den Richtlinien steht, befolgen Sie es einfach.

(Abgesehen davon würde es mich auch sehr ärgern - aber wahrscheinlich nicht genug, um eine große Sache daraus zu machen).

driis
quelle
0

Ich ziehe es vor, das Extra nicht zu setzen == true, aber manchmal füge ich es versehentlich hinzu und bemerke es nicht. Die Person hat sie möglicherweise nicht bemerkt und sie versehentlich platziert. Ich lese meinen Code noch einmal und stelle manchmal fest, dass ich das zusätzliche == true eingefügt habe, damit ich das == true entferne. Ich bemerke es manchmal nicht und würde mich freuen, wenn jemand mir sagte, ich hätte es überflüssig gemacht.

sange
quelle
0

wie wäre es mit:

int j = 1;
for (int i=1; i>=j; i++) ...

Ja, ich habe es gesehen.

Dave
quelle