it-swarm-eu.dev

Tut "if (0 == value) ..." nicht mehr Schaden als Nutzen?

Dies ist eines der Dinge, die ich am meisten hasse, wenn ich es im Code eines anderen sehe. Ich weiß, was es bedeutet und warum manche Leute es so machen ("Was ist, wenn ich stattdessen versehentlich '=' setze?"). Für mich ist es sehr ähnlich, wenn ein Kind die Treppe hinuntergeht und die Schritte laut zählt.

Wie auch immer, hier sind meine Argumente dagegen:

  • Es stört den natürlichen Fluss des Lesens des Programmcodes. Wir Menschen sagen "wenn der Wert Null ist" und nicht "wenn Null der Wert ist".
  • Moderne Compiler warnen Sie, wenn Sie eine Aufgabe in Ihrem Zustand haben oder wenn Ihr Zustand nur aus dieser Aufgabe besteht, die ja ohnehin verdächtig aussieht
  • Sie sollten nicht vergessen, double '=' zu setzen, wenn Sie Werte vergleichen, wenn Sie ein Programmierer sind. Sie können auch vergessen, "!" beim Testen von Ungleichheit.
50
mojuba

Ah, ja, "Yoda-Bedingungen" ("Wenn der Wert Null ist, führen Sie diesen Code aus, den Sie müssen!"). Ich zeige immer jemanden, der behauptet, er sei "besser", auf Werkzeuge wie Flusen (1). Dieses spezielle Problem wurde seit den späten 70er Jahren gelöst. Die meisten modernen Sprachen kompilieren nicht einmal einen Ausdruck wie if(x = 10), da sie sich weigern, das Ergebnis der Zuweisung zu einem Booleschen Wert zu erzwingen.

Wie andere gesagt haben, ist es sicherlich kein Problem, aber es provoziert ein bisschen kognitive Dissonanz.

59
TMN

Es ist widerlich, weil es eine kleine, aber spürbare mentale Steuer auferlegt.

Die Leute lesen von links nach rechts in praktisch allen Programmiersprachen (und den meisten natürlichen Sprachen).

Wenn ich 123 == x Sehe, analysiere ich es mental wie folgt:

  • 123 - na und? unvollständige Informationen.
  • == - nun, 123 ist 123, warum es testen ...
  • x - ok, darum machen wir uns also Sorgen. Erst jetzt habe ich den Kontext.
  • Gehen Sie zurück zu überdenken 123 Und warum x damit verglichen wird.

Wenn ich x == 123 Sehe, ist mentales Parsen:

  • x - Bietet Kontext, ich weiß, worum es bei der Bedingung geht. Ich kann den Rest ignorieren. Basierend auf dem vorherigen Ablauf habe ich eine gute Idee, warum und was kommen wird (und sei überrascht, wenn es anders ist).
  • == - Das dachte ich mir.
  • 123 - Ja.

Die Störung ist klein (in einem einfachen Beispiel), aber ich immer bemerke es.

Es kann eine gute Idee sein, den Wert an die erste Stelle zu setzen, wenn Sie wollen darauf aufmerksam machen möchten, z. if (LAUNCH_NUKES == cmd). Normalerweise ist dies nicht die Absicht.

56
dbkk

Schädlich? Nein, es funktioniert so oder so.

Schlechte Praxis? Bestenfalls umstritten. Es ist eine einfache defensive Programmierung.

Lohnt es sich, den Schlaf zu verlieren? Nein, nein.

47
Wonko the Sane

Dies ist im Grunde Flaimbait.

Nein, es schadet nicht mehr als es nützt. Einfach.

Mehr Wörter?

Compiler-Argument? Ähm, ish, vielleicht - vertraue nicht zu sehr auf den Komplizen, um dich vor dir selbst zu retten.

"Du solltest nicht vergessen" - na ja duh - nein natürlich solltest du nicht, während ich müde bin, ich habe den ganzen Tag programmiert, ich musste zwei verschiedene Sprachen verwenden und manchmal, Nur manchmal mache ich als Mensch einen Fehler.

Der Sinn dieser Art von Verhalten ist, dass es defensiv ist, es ist nicht da, weil Sie erwarten, Fehler zu machen, genauso wenig wie Sie eine Versicherung haben, weil Sie einen Absturz erwarten ... aber wenn Sie es tun, ist es schön, abgedeckt zu werden.

Schwer zu lesen? Sie beschweren sich, dass ein anständiger Programmierer == fest verdrahtet sein sollte (was alle möglichen schlechten Annahmen macht), aber dass derselbe anständige Programmierer 0 == Wert nicht lesen kann?

Tut keinen Schaden, hat potenzielle Vorteile, dumme Frage, lassen Sie andere es tun, wenn sie wollen und weitermachen.

17
Murph

Ich würde es nicht als Schaden bezeichnen, aber es ist widerlich. Also nein, ich würde nicht sagen, dass es so ist.

11
whatsisname

Ich habe nie das Gefühl gehabt, dass das ganze "Was ist, wenn ich ein = vergesse?" jemals wirklich viel Gewicht gehalten. Ja, Sie können einen Tippfehler machen, aber wir alle machen Tippfehler. Es scheint albern, Ihren gesamten Codierungsstil zu ändern, weil Sie Angst haben, einen Fehler zu machen. Warum nicht alle Variablen und Funktionen ohne Interpunktion in Kleinbuchstaben schreiben, weil Sie eines Tages möglicherweise vergessen, etwas groß zu schreiben oder einen Unterstrich zu vergessen?

10
GSto

Einige Leute verwenden es, um klar zu machen, was eine Bedingung tut. Zum Beispiel:

Weg 1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

Weg 2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

Einige Leute glauben, dass das zweite Beispiel prägnanter ist, oder das Umkehren von Argumenten veranschaulicht den Punkt eines Tests (bedingt) vor dem Test selbst.

In Wirklichkeit macht es mir auch nichts aus. Ich habe mein Haustier ärgern über Stil und das größte ist Inkonsistenz. Machen Sie es also genauso und konsequent, und es macht mir nichts aus, Ihren Code zu lesen.

Mischen Sie es bis zu dem Punkt, an dem es so aussieht, als hätten sechs verschiedene Leute mit ihrem eigenen unverwechselbaren Stil gleichzeitig daran gearbeitet. Ich ärgere mich ein wenig.

9
Tim Post

Für mich ist es eine einfache Konditionierung. Als jemand, der (in den 90ern) C und C++ gelernt hat, habe ich mich daran gewöhnt und benutze es immer noch, obwohl die Gründe nicht geklärt sind.

Sobald Sie "konditioniert" sind, um auf der linken Seite nach der "Konstante" zu suchen, wird dies zur zweiten Natur.

Ich benutze es auch nur für Äquivalenz (oder negierte Äquivalenz), nicht für größer/kleiner als.

Ich stimme der Antwort von @/Wonko voll und ganz zu.

6
DevSolo

Der eine Fall, in dem ich es hilfreich finde, ist, wenn der variable Teil des if ziemlich lang ist und das Anzeigen der Werte das Lesen des Codes erleichtert. Die gepunkteten Namespace-Sprachen haben die besten Beispiele dafür.

Zum Beispiel hatte etwas, an dem ich mit Single Sign-On gearbeitet habe, eine Situation, in der zwei Sitzungen gleichzeitig stattfinden konnten, wenn ein bestimmter Fehlertyp auftrat und auf eine bestimmte Weise behoben wurde. Daher muss ich einen Handler hinzufügen, der sich in einem Fall befand, in dem dies aussah etwas wie das:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

In diesem Beispiel gibt es zwar andere Möglichkeiten, dies zu tun, aber dies wäre ein Fall, in dem die Version mit der ersten Nummer möglicherweise besser lesbar ist.

5
Bill

Und doch treten die Fehler auf. Und manchmal möchten Sie eine Zuweisung in einem Schleifenoperator, in dem Sie andernfalls die Gleichheit überprüfen könnten, oder zumindest ist es üblich, sie zu verwenden.

Ich halte etwas daran fest. Der Rat, den ich befolgt habe (möglicherweise von Code Complete), ist, den niedrigeren Wert links im Vergleich beizubehalten. Ich habe das vorhin mit einem Kollegen besprochen und er fand es irgendwie verrückt, aber ich habe mich sehr daran gewöhnt.

Also würde ich sagen:

if ( 0 <= value )

Aber ich würde auch sagen:

if ( value <= 100 )

Gleichheit Ich werde eher mit der Variablen auf der linken Seite überprüfen, es ist nur besser lesbar.

3
glenatron