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?
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?
if (some_flag == true)
aber das impliziteif (is_something)
oderif (has_something)
. Beachten Sie die Variablennamen.someBool == true
auch boolesch ist, also sollte er nach der gleichen Logik seinif ((someBool == true) == true)
.$var = (bool) some_expression
. Und in den meisten Fällen spielt es keine Rolle, da PHP die erforderlichen Konvertierungen dynamisch ausführt.Antworten:
Es ist nur redundanter Code, nicht Leben oder Tod. Jedoch....
Wenn es viel passiert, könnte es ein Problem mit
someBool
der Namensgebung geben. Ein guter Name kann einen großen Beitrag dazu leisten, die Notwendigkeit von==true
oder
oder
zum Beispiel.
quelle
someBool == true
aus Gründen der Übersichtlichkeit mehrmals für Legacy-Code verwenden. Aber wenn ich von Grund auf neu schreibe,if (isSomething)
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.
quelle
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 ersetzenreturn 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.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.if(x) x=true;
denen NICHT redundant waren, sondern das Äquivalent vonx=!!x;
(normalisieren von x auf 0/1)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?
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?
quelle
true=true
nicht kompilieren, können Sie nicht zuordnen zutrue
;-)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 erif()
wie ein Funktionsaufruf aussieht, hilft mir das Leerzeichen zwischen den Parens, ihn zu lesen. Ein Bool ist für sich genommen ein Bool, aber erif (somePointer)
fliegt nicht; Ich bevorzuge,if (somePointer != NULL)
da ein Zeiger kein Narr ist.Ich denke, wenn etwas so Triviales Ihr größtes Problem mit Ihren Mitarbeitern ist, sollten Sie sich für ziemlich glücklich halten.
quelle
Sie sollten diese schlechte Angewohnheit definitiv beenden. Sanft...
Es ist leicht zu vergessen, die doppelten Gleichheitszeichen zu schreiben und den Code in Folgendes umzuwandeln:
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.
quelle
if (answer = 42) {}
einfach nicht kompiliert, da der Ausdruck kein Bool ist.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:
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:
quelle
actionsAreAllowed
.if (x) { ...
Sie schreiben , behaupten Sie bereits, dassx
es sich um einen Booleschen Wert handelt oder dass er in einen Booleschen Wert konvertierbar ist. Was Sie es nennen, ist irrelevant.Was ist mit nullbaren Bools?
quelle
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,== false
beim 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.
quelle
(9 == True)
in Python false ausgewertet, und ich würde mir vorstellen, dass dies in C ++ ähnlich ist.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.
quelle
erinnere mich an "Boolean Madness Code", es ist wie diese
Anstatt von:
quelle
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:
Nachdem ich das eine Weile gelesen habe, möchte ich auch Symmetrie mit
Betrachten Sie es also als ein Artefakt von C
!
anstelle vonnot
.quelle
not
Betreiber, 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.not
ist keine Option.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.quelle
if (b == true) {
nicht nur redundant. Es ist auch ein bisschen riskant, weil Sie versehentlich zugewiesen könntetrue
zub
.if (b == true)
undb
kein Narr sind, gehen die Typkonvertierungen in die falsche Richtung. Abool
ist 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)
danntrue
eine wirdint
mit dem Wert 1 zum Zwecke des Vergleichs, anstattb
wird in Typ umgewandeltbool
, die das richtige Ergebnis geben würde.==
.Findest du das schlecht? Wie wäre es mit:
quelle
ich bevorzuge
oder
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!
quelle
if (!bNotVal)
oderif (bNotVal)
überhaupt in erster Linie ist. Ugh Negative in Namen erschweren das Lesen.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.
quelle
Wie wäre es mit
WARUM IST DAS EINE SAITE ?!
quelle
if(preg_match('/title/', implode($_POST))){
. PHP, genug gesagt, ich muss einen besseren Job finden.x
sie 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"]
Tatsächlich wäre ein Test auf x == true erforderlich, wenn es nullbar ist. :)
quelle
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.
quelle
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 :)
quelle
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.
quelle
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:
während
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:
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.
quelle
bool b;
Wird nur dann mit false initialisiert, wennb
es sich um ein Feld handelt. Sie müssen lokale Variablen explizit initialisieren.true
oder nur auf "true" testen möchten . Zum Beispiel wird jede nicht leere Zeichenfolge berücksichtigt== true
, jedoch=== true
in einigen Sprachen nicht.Ah ja, aber was ist, wenn die Variable nullbar ist? (Bool?)
Einige Sprachen (C #) erfordern und cast oder Vergleich mit "true".
quelle
Die Jungen kennen die Regeln, aber die Alten kennen die Ausnahmen;)
C#
Wenn Sie sich mit einem beschäftigennull-able bool
, müssen Sie spätestens :Wenn Tristate kein Problem ist, sollte es normalerweise keinen Grund geben, etwas mit
true
/ zu vergleichenTrue
. In und inPython
mehreren anderen SprachenC/C++
können Sie jedoch einenif
Ausdruck 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:Hier
z
sollte seinTrue
,z2
sollte aber seinFalse
. NunClojure
nähert sich eine Sprache dies auf eine andere Art und Weise - da wird dieand
Funktion nicht unbedingt als a bewertetbool
, aber dieif
kann damit umgehen.Unabhängig von der Sprache lohnt es sich wahrscheinlich, Kommentare abzugeben, wenn Sie etwas mit
True
oder vergleichenFalse
.quelle
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 AussageisEnabled || isEffective || hasProperty
weitaus lesbarer als der Vergleich mittrue
oderfalse
.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.
Durch die Bereinigung von Code, der nicht dem neuen Stil entspricht, habe ich einige weitere Fälle solcher subtiler Fehler identifiziert und korrigiert.
quelle
Musste dies die ganze Zeit in ActionScript 2 verwenden (zugegebenermaßen jetzt eine tote Sprache), weil:
Es war also fast immer das Beste, genau zu sein.
quelle
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):
Es scheint, dass einige Programmierer es aufgrund des Fehlens einer strengen Typdefinition in dieser Sprache vorziehen, nicht mit den
false|undefined
Werten herumzuspielen .quelle
Ich habe einen Kollegen, der einen Code wie diesen haben wird:
Und dann möchte er für eine Art Test / Debugging diesen Block nicht aufrufen und ändert ihn in:
Und dann ändert er es gelegentlich zu:
Das Schlimmste ist, diese Art des Debuggens hat sich bei mir gelegentlich ausgewirkt und ist für andere Entwickler wirklich schlecht zu lesen!
quelle
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).
quelle
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.
quelle
wie wäre es mit:
Ja, ich habe es gesehen.
quelle