In einer Bedingungsanweisung (IF) verwendet jeder (position < size)
, aber warum?
Nur Konvention oder gibt es einen guten Grund dafür?
In freier Wildbahn gefunden:
if (pos < array.length) {
// do some with array[pos];
}
Selten gefunden:
if (array.length > pos) {
// do some with array[pos];
}
if (MIN <= x && x <= MAX)
. (In einigen Sprachen kann dies wieMIN <= x <= MAX
folgt geschrieben werden: In C ist es vollkommen legal, bedeutet aber nicht, was Sie vielleicht denken, dass es bedeutet).[min, max]
und nicht[max, min]
. Daher ist es nur natürlich zu überprüfen, ob ein Elementx
zum Intervall gehört, indem Sie schreibenmin <= x <= max
.Antworten:
Das tiefere Muster ist, dass wir natürlich "[etwas, das variiert] [Vergleich] [etwas, das nicht variiert]" als Standardreihenfolge verwenden. Dieses Prinzip gilt für Ihr Beispiel, da die Position variieren kann, die Größe jedoch nicht.
Die einzige häufige Ausnahme besteht darin, dass sich einige Programmierer beim Testen auf Gleichheit darin üben, die entgegengesetzte Reihenfolge (als Yoda-Bedingungen bezeichnet ) zu verwenden, um das Gemeinsame
variable = constant
und nicht denvariable == constant
Fehler zu vermeiden. Ich halte an dieser Idee nicht fest, weil ich die beschriebene natürliche Reihenfolge finde oben viel besser lesbar, vor allem, weil wir die Idee so auf Englisch ausdrücken und weil die meisten modernen Compiler dies erkennen und eine Warnung ausgeben.quelle
variable = constant
Konstrukt warnen (oder Fehler machen) .constant == variable
Phänomen.if(DBNull == row["fieldName"]) methodCall()
und mich gefragt, ob ich verrückt geworden bin, weil ich es die meiste Zeit umgekehrt gesehen habe.(position < size)
oft eine Obergrenze ausdrückt, so dass es tatsächlich einen Teil von neu formuliertlowerbound <= position < upperbound
, wobei die Größe die Obergrenze ist. Wenn die beiden Einschränkungen explizit sind,position
kann die nur in die Mitte gehen.Die einzige Rechtfertigung, die ich jemals dafür gesehen habe, ist, dass es wie Zahlenlinien oder andere Ordnungssachen ist, die wir in der Schule gelernt haben. Zum Beispiel schreiben wir Zahlenzeilen wie folgt:
Die kleineren Dinge erscheinen links von größeren Dingen. Gleiches gilt für andere Dinge wie Daten (denken Sie daran, wie ein Kalender aufgebaut ist).
Es läuft im Grunde darauf hinaus, wie wir natürlich über die Reihenfolge der Dinge denken. Es ist einfacher, das erste Formular zu lesen, da Sie nicht viel mentale Bearbeitung daran vornehmen müssen.
quelle
Obwohl es hauptsächlich eine Frage der Konvention ist, ist dies meiner Meinung nach am besten so, wie wir denken - es zeigt den Punkt, auf den wir Wert legen.
Wenn wir diese ins Englische übersetzen, wäre dies der Ausdruck "Wenn die Position kleiner als die Array-Länge ist", wobei das Thema des Satzes das vorübergehende Element ist.
Um es anders auszudrücken: "Wenn die Array-Länge größer als die Position ist", wird die Array-Länge (als fester Wert angenommen) in das Subjekt eingefügt und die Position (vorübergehend) wird zum direkten Objekt.
quelle
Meine Meinung, und dies ist nur meine Meinung, ist, dass es eine Konvention für Lesbarkeit ist. Obwohl die beiden identisch sind, fühlen sie sich in meinem Gehirn unterschiedlich an. Ich möchte nicht wissen, ob das Array größer als pos ist. Ich möchte wissen, ob pos kleiner als die Arraygröße ist.
Es ist wie eine halb leere oder halb volle Diskussion. Mathematisch identisch, aber mein Gehirn wird sie je nach Kontext unterschiedlich sehen.
Persönlich, wenn ich sehe
Ich werde darüber nachdenken, ob das ein Fehler ist oder nicht und was der Programmierer gemeint hat. Versucht er etwas anderes als die Überprüfung der Grenzen?
Vielleicht bin ich einfach nicht klug, aber wenn ich diese Art von Analyse für jede Codezeile durchführen muss, tut mein Gehirn weh.
quelle
Um auszudrücken, was einige versucht haben, auf eine andere Art und Weise zu erreichen ...
Wenn die Reihenfolge keinen Einfluss auf das Verhalten des Programms hat, hängt der Unterschied eindeutig davon ab, was für den Menschen am besten lesbar ist. Hier ist ein sprachlicher Grund, warum es sinnvoll ist, das "Thema" links zu setzen:
In der Linguistik ist das Thema eines Satzes das, worüber gesprochen wird, und der Kommentar ist das, was über das Thema gesagt wird. In diesem Beispiel können wir davon ausgehen, dass dies
position
das Thema ist und "weniger als die Array-Länge" der Kommentar ist . In Englisch und in vielen anderen Sprachen wird das Thema normalerweise vor dem Kommentar ausgedrückt." Die Tendenz, topikalisierte Bestandteile zunächst zu setzen (Themenfront), ist weit verbreitet. "
Also eine gute Faustregel Ihrer Codezeile als Satz (oder Klausel, in diesem Fall) zu denken, entscheiden , was der Satz über , und dass die erste Stelle setzen , wenn Sie können. Oft ist das, worum es in dem Satz geht, eher eine Variable als eine Konstante. Manchmal enthält der Kommentar jedoch auch eine Variable, sodass Sie nicht einfach so vorgehen können.
quelle
Es ist eine Kombination aus zwei Dingen, die beide von dem zugrunde liegenden Assembler stammen, zu dem frühe Sprachen kompiliert wurden (und viele aktuelle auch).
Arrays sind nullbasierte Offsets im Speicher (dh der erste Datenblock befindet sich am Anfang des zugewiesenen Speicherblocks ... der 0-Index). Daher die Verwendung von 0..n-1 für das variierende Stück.
Das Verzweigen, wenn ein Wert kleiner als ein anderer Wert (oder ein Register usw.) ist, ist normalerweise eine einzelne Anweisung. Daher die Verwendung des einfachen Operators kleiner als (<).
Das Muster wurde also vom alten Assembler in ANSI-C (das in gewisser Weise eher einem Makro-Assembler ähnelt) und von dort nach Java und in die anderen C-ähnlichen Sprachen verschoben.
quelle
Wie viele andere Antworten gesagt haben, ist es sehr oft einfacher zu lesen:
Fast jeder, den ich kenne, verwendet ausschließlich diesen Stil.
Es gibt eine Ausnahme für Sprachen im C-Stil, die
=
zur Zuweisung und==
zum Vergleich verwendet werden. Wenn Sie versehentlich Folgendes eingeben:Anstatt von:
Dann erhalten Sie keine Fehlermeldung, da dies eine gültige Codezeile ist. (Einige Compiler und IDEs werden Sie davor warnen, aber es ist immer noch sehr einfach, einen so einfachen Tippfehler zu haben.)
Wenn Sie jedoch schreiben:
Der Compiler / Interpreter wird einen Fehler machen, da dies kein gültiges Konstrukt ist (in den meisten Sprachen jedenfalls).
Diese Umschaltung wird oft als Yoda-Bedingung bezeichnet .
UPDATE : Hier ist eine Liste von Orten, an denen Yoda-Bedingungen nützlich sind .
quelle
Persönlich bevorzuge ich Folgendes:
... es ist mehr Code, aber auch sehr einfach zu lesen.
quelle
pos
zu sein> array.length
. Mit anderen Worten, obwohl dies die Bedeutung der Bedingung sehr deutlich macht, ist es tatsächlich etwas schwieriger, IMO zu lesen.Es ist eine Frage der Präferenz oder Konvention. Wenn Sie konsistent sein möchten, gibt es zwei gleichermaßen vernünftige Möglichkeiten:
Stellen Sie immer das "Thema" an die erste Stelle (stellen Sie es sich als Satz vor) - den Wert, um den es beim Test geht. So würden Sie zum Beispiel schreiben
if (age>5)
Oder stellen Sie immer das kleinere Element an die erste Stelle (denken Sie daran, dass die Werte in natürlicher Reihenfolge auf Ihrem Bildschirm angeordnet sind). Sie würden also beispielsweise
if (a<b)
unabhängig davon schreiben, ob es sich bei diesem Code hauptsächlich um a oder hauptsächlich um b handelt.Beide Konventionen würden das erste Snippet empfehlen, das Sie anstelle des zweiten gezeigt haben. Ich denke, in diesem speziellen Fall haben Sie Ihre Antwort. Ich würde sagen, es ist ratsam, das Schreiben von Code zu vermeiden, der sowohl gegen (1) als auch gegen (2) verstößt, da dies das Lesen für die meisten Menschen erschwert.
quelle