Ich habe eine for-Schleife, in der ich das erste Element in einem nullbasierten Array überspringen muss.
Welche davon zeigt meine Absichten deutlicher?
for($i=1 ; $i < count(array) ; $i++){
array[$i];
}
oder
for($i=0+1 ; $i < count(array) ; $i++){
array[$i];
}
$i=2-1
ist der überlegene Weg. : /foreach ($i in range(1, count))
(wie auch immer das in PHP aussieht). Oder so etwasforeach ($item in array.skip(1))
würde eine C # -Person tun.Antworten:
Ich hasse beide.
Wer hat gesagt, Sie könnten magische Zahlen verwenden? Wenn Sie mit einem Versatz von 1 beginnen, sagen Sie uns, WARUM Sie mit einem Versatz von 1 beginnen. Das Hinzufügen einer ebenso magischen Null erklärt mir nichts.
Ist das der Nutzlastoffset? Handelt es sich um eine Pascal-Zeichenfolge, die Sie in eine nullterminierte c-Zeichenfolge konvertieren? Bitte sagen Sie uns, was los ist.
Tut mir leid, aber ich habe viel Zeit meiner Karriere damit verschwendet, sinnlose Geheimnisse wie dieses zu entschlüsseln, und meine Geduld für sie hat nachgelassen. Ist eine Variable mit einem anständigen Namen wirklich zu viel verlangt?
Mit anständigem Namen meine ich einen Namen, der erklärt, WARUM wir das erste Element überspringen. Nicht etwas, das einfach sagt, dass wir das erste Element überspringen. Die 1 hat mir das alleine gesagt.
quelle
static final int LONELIEST_NUMBER = 1
meinen gesamten Java-Code zu definieren. :-) Das heißt, nach weiteren Überlegungen möchte ich Ihre Antwort rückgängig machen, kann es aber nicht, es sei denn, Sie bearbeiten sie. Dumme SO-Regel?Kurze Antwort: Die erste Option ist besser.
Die zweite Option fügt nur Rauschen hinzu. Es ist sehr unwahrscheinlich, dass 0 + 1 dem Leser hilft zu verstehen, dass es 0 gewesen sein könnte, aber es ist 1. Viel wahrscheinlicher ist es, dass er einen kurzen Moment verwirrt und von dem abgelenkt wird, worum es in der Schleife geht. Besonders in einer Sprache, in der alle Arrays bei 0 beginnen.
Wie bereits erwähnt, fügen Sie einfach einen Kommentar hinzu, wenn Sie die Tatsache betonen möchten, dass die Schleife bei 1 und nicht bei 0 beginnt.
quelle
Sagen Sie uns nicht, dass Sie den ersten Artikel überspringen - das können wir sehen. Was nicht offensichtlich ist, ist warum . Also ... wenn es aus dem Kontext nicht ersichtlich ist, sagen Sie uns warum:
Oder, wenn Sie kommentaravers sind, so etwas wie:
Verwenden Sie keine Kommentare und Tricks, um uns daran zu erinnern, wie die Sprache funktioniert.
quelle
Ihr Beispiel sieht erfunden aus. Im Code der realen Welt ist die Tatsache, dass die Schleifen beim zweiten Array-Element beginnen müssen, höchstwahrscheinlich aus den folgenden Codezeilen ersichtlich. Zum Beispiel, wenn der echte Code so aussieht
Es wäre keine Erklärung oder kein "0 + 1" -Konstrukt erforderlich, um zu verdeutlichen, warum die Schleife bei 1 statt bei 0 beginnt.
Wenn der Code in der Schleife die Gründe jedoch nicht so offensichtlich erklärt (möglicherweise
array[0]
eine besondere Bedeutung hat und anders behandelt werden muss als die übrigen Elemente), fügen Sie einen erklärenden Kommentar hinzu. Aber bevor Sie dies tun, überlegen Sie zweimal, ob Siearray[0]
diese besondere Bedeutung vermeiden können , und organisieren Sie den umgebenden Code neu, was wahrscheinlich die bessere Alternative wäre.quelle
Ich habe Option 2 noch nie gesehen, aber ich mag es. Warum? Mit Option 1 würde ich mich fragen, ob der Programmierer vergessen hat, dass Arrays bei 0 beginnen. Option 2 macht klarer, dass sie absichtlich bei 1 beginnen.
Das heißt, am besten in jedem Fall einen Kommentar hinzufügen, warum Sie Element überspringen.
Wenn Sie leicht beschreiben können, warum Sie bei eins beginnen, verwenden Sie eine Konstante. Wenn Sie sich beispielsweise Befehlszeilenargumente ansehen, so etwas wie
Persönlich würde ich wahrscheinlich stattdessen nur einen Kommentar verwenden, YMMV.
quelle
Ich bezweifle, dass jemand von dem ersten verwirrt wäre. Wir mussten es alle tun. So sehr, dass der zweite viel eher verwirrt. "Warum gibt es dort eine 0+? Haben sie den Operator + irgendwie überschrieben?"
Ein anständiger Compiler verwandelt den zweiten ohnehin in den ersten, aber es sieht so aus, als würden Sie PHP verwenden, das interpretiert wird. Jedes Mal, wenn der Interpreter diese Schleife erreicht, muss er tatsächlich 0 und 1 addieren. Keine große Sache, aber warum sollte der Interpreter die Arbeit machen?
quelle
Verwenden Sie eine Variable, die den Startpunkt erklärt.
Sie müssen " das erste Element in einem nullbasierten Array überspringen ", also zum Beispiel:
quelle
Wenn man von allen Schleifen besessen ist, die bei Null beginnen, können Sie eine continue-Anweisung verwenden. Fügen Sie einen Kommentar hinzu, warum Sie überspringen, da dies normalerweise nicht der Fall ist.
quelle
if first then skip
Aussage mit einem Kommentar, warum. Noch ohne Kontext ist keine der Lösungen "am besten"Was ich tun würde, ist das erste Element vor dem Schleifen zu entfernen. Erstellen Sie bei Bedarf ein neues Array. Erklären Sie in einem Kommentar, warum Sie es tun. Und dann machen Sie einfach einen einfachen Foreach.
Auf diese Weise ist Ihre Absicht völlig klar.
Zur weiteren Verdeutlichung können Sie den Code in eine Methode mit einem geeigneten Namen einschließen, um die Dinge klarer zu machen.
All dies fehlt jedoch immer noch der Kontext. Was willst du mit den Elementen machen? Werden Sie das neue Array zurückgeben? Interessieren Sie sich für das ursprüngliche und das neue Array nach Ihnen?
doStuff()
?Auf jeden Fall gibt es hier keine klare Antwort, und die Entscheidung, wie der Code lesbar gemacht werden soll, hängt stark vom Kontext ab.
quelle
$array[$i-1] = $array[$i]
etwas Ähnliches tun , wie in der Antwort von @ DocBrown angegeben?1
(siehe Kevin Lees Kommentar), wird der Code dadurch überhaupt nicht klarer. Der Leser muss array_shift verstehen, was es tut, wie es funktioniert. Vielleicht ist diese Codezeile ein Fehler? Ändert es das Array oder gibt es ein neues zurück? Fügt es ein Element ein oder entfernt es eines? Ändert es die Indizes oder nicht? Ich kann nicht erkennen, dass die Verwendung einer einbasierten Schleife keine große Verbesserung dieser Funktion darstellt (und ihren Namen sofort verständlich macht).