it-swarm-eu.dev

Verwenden einzelner Zeichen für Variablennamen in Schleifen / Ausnahmen

Ich habe einige Gespräche mit einem Kollegen über die Verwendung von Variablennamen mit einem Buchstaben unter bestimmten Umständen in unserer Codebasis geführt, bei denen wir uns beide nicht einig sind.

Er bevorzugt eine ausführlichere Namenskonvention für diese, und ich nicht.

Meiner Meinung nach gibt es drei Szenarien, in denen ich Variablennamen mit einem Buchstaben verwende:

  • Schleifen - ifor(int i = 0; i < 10; i++) { ... }
  • Lambda-Ausdrücke in C # - x/y/z: .Where(x => x == 5)
  • Ausnahmen - e: try { ... } catch(ExceptionType e) { /* usage of 'e' */ }

Dies sind die nur Szenarien, in denen ich es verwenden würde, und ich verwende offensichtlich an anderer Stelle ausführlichere Namenskonventionen.

Mein Kollege brachte folgende Argumente für Ausnahmen und Schleifen vor:

  • i - es hat nichts zu bedeuten.
  • e - es ist der häufigste Buchstabe in der englischen Sprache. Wenn Sie die Lösung nach Ausnahmen durchsuchen möchten, finden Sie viele unerwünschte Instanzen von e.

Ich akzeptiere diese Argumente, habe aber die Erwiderung, dass, wenn man nicht weiß, was i in einer for-Schleife bedeutet, sie wahrscheinlich kein Programmierer sein sollten. Es ist ein sehr gebräuchlicher Begriff für Schleifen und Ausnahmen, ebenso wie e. Ich habe auch erwähnt, dass sie, wenn man wollte, im Fall der Ausnahme nach catch suchen könnten.

Mir ist klar, dass dies subjektiv ist, aber dann könnte man argumentieren, dass Kodierungsstandards genau das sind - Meinungen, wenn auch Meinungen von Akademikern.

Ich würde mich auf jeden Fall freuen und die Ergebnisse an ihn weiterleiten, würde aber lieber, dass wir (unser Unternehmen) weiterhin einen einzigen Codierungsstandard verwenden, anstatt zwei Entwickler mit unterschiedlichen Meinungen darüber zu haben, was zu verwenden ist.

68
Dan Atkinson

Ich stimme Ihrer Meinung voll und ganz zu und glaube, dass nicht alles subjektiv ist.

Der Name einer Variablen ist nur so relevant wie ihr Gültigkeitsbereich.

Es macht keinen Sinn, endlose Diskussionen über einen Namen einer Variablen zu führen, der nur von einer Person gelesen wird, die diesen bestimmten Code mit kleinem Gültigkeitsbereich liest. Auf der anderen Seite müssen Klassennamen und Mitgliedsnamen klar angeben, was los ist. Ein Großteil des erwarteten Verhaltens muss in einem kurzen Namen erklärt werden.

Konventionen verbessern die Lesbarkeit.

i und e sind gebräuchliche Konventionen für diese Variablen mit kleinem Gültigkeitsbereich. Ihre Absicht ist wirklich klar, wenn Sie die Konvention kennen.

Prägnanz verbessert die Lesbarkeit.

Ein kurzer Variablenname, der seine Absicht klar darstellt, ist einem großen Variablennamen vorzuziehen.

83
Steven Jeuris

Dies hängt wirklich von der Situation/dem Kontext ab (und es gibt keine Lösung für alle ).

Im Allgemeinen kann i, j, k [übrigens i als Index genommen werden; Seine Verwendung stammt aus dem mathematischen Hintergrund, wo dies am häufigsten die ersten drei Indizes waren (denken Sie an die Tensorrechnung). Es kann auch mit Fortrans Geschichte verbunden sein, in der i als erste implizit typisierte Ganzzahl häufig als Index einer Schleife verwendet wurde. ] werden oft verwendet, wenn es sich um einen einfachen Zähler handelt. Wenn es eine bestimmte Bedeutung hat, wie Monat oder Jahr, dann ist ein längerer Variablenname besser.

54
Rook

Ich stimme Ihnen zu: i als Schleifenvariablenname ist eine uralte Redewendung, die niemanden verwirren sollte. Entspricht e für eine Ausnahmevariable in einem catch-Block. Letzteres (oder vielmehr beides) sollte kurz und einfach sein, wodurch der Umfang der Variablen klein wird und die Verwechslungsgefahr für die Leser begrenzt wird. Und wenn jemand nach Ausnahmen suchen möchte, sollte er trotzdem besser nach Ausnahmetypen oder Fangblöcken suchen.

Ich persönlich bevorzuge jedoch die Verwendung von Variablen mit längeren Schleifenvariablen wie index oder idx. Mein Grund ist, dass i so kurz ist, dass es schwierig ist, mit dem Cursor zu lokalisieren.

Aktualisieren

Als Referenz stammen die Argumente Ihres Kollegen wahrscheinlich aus Ottingers Regeln für die Benennung - einer ausgezeichneten und pragmatischen Herangehensweise an das Thema, die zum Lesen empfohlen wird. Möglicherweise hat er jedoch die unten genannten Teile übersehen:

Meine persönliche Präferenz ist, dass Einzelbuchstaben NUR als lokal Variablen innerhalb von kurz Methoden verwendet werden können. Die Länge eines Namens sollte irgendwie der Größe seines Gültigkeitsbereichs entsprechen. Wenn eine Variable oder Konstante an mehreren Stellen in einem Code angezeigt oder verwendet werden kann, muss ihr unbedingt ein suchfreundlicher Name zugewiesen werden.

Und

Sicherlich kann ein Schleifenzähler i oder j oder k genannt werden (obwohl niemals l!), Wenn sein Umfang sehr, sehr klein ist und keine anderen Namen kann damit in Konflikt stehen. Diese sind zulässig, da es sich um herkömmliche Lösungsdomänennamen handelt.

24
Péter Török

wortreichere Namen können genauso bedeutungslos sein. "i" wird so häufig als einfacher Iterationszähler verwendet, dass es fast Standard ist. Wenn Sie denselben Zähler "iter" nennen, weil ein "Codierungsstandard" die Verwendung von Variablennamen mit einem Buchstaben verbietet, wird keinerlei Wert hinzugefügt.

"x", "y" und "z" sind Standardkoordinatennamen, die als xCoord, yCoord, zCoord bezeichnet werden und nichts hinzufügen.

"e" ist natürlich ein mathematischer Ausdruck. Es ist jedoch relativ häufig, es als Namen für Ausnahmen in Catch-Blöcken in Java zu verwenden. Wenn man es "exc" oder ähnliches nennt, würde das keinen echten Mehrwert bringen.

15
jwenting

Ich bevorzuge aussagekräftige Variablennamen, auch für Schleifenvariablen. Also schreibe ich normalerweise so etwas

for (int vertexIndex=0; vertexIndex<polygon.VertexCount; vertexIndex++)
   DoSomethingWithVertex(polygon[vertexIndex]);

Mir ist klar, dass es für eine kleine Schleife wie diese kaum einen Unterschied gibt (so oder so), aber:

  • wenn der Schleifenkörper länger ist, ist vertexIndex oft klarer als i. Natürlich ist i ein Index, aber welcher Index? Zu welchem ​​Array? Zu welchem ​​Element in diesem Array?
  • wenn der Schleifenkörper andere Funktionen aufruft und den Index als Argument übergibt, ist es häufig einfacher, den Wert am Aufrufer und an den Angerufenen konsistent zu benennen - und Sie möchten die Methodenparameter i und x nicht aufrufen
  • wenn verschachtelte Schleifen vorhanden sind, ist die Verwendung von i, j, k als Indizes sehr verwirrend und fehleranfällig

um konsistent zu sein, verwende ich überall nur aussagekräftige Variablennamen für Schleifenindizes.

@ André Paramés fragte: "Wenn der Schleifenkörper lang genug ist, um die Bedeutung von i zu verbergen, ist es nicht Zeit für eine Umgestaltung?"

Ein typisches menschliches Gehirn hat eine Kurzzeitgedächtniskapazität von etwa 7 Datenblöcken. Wenn der Schleifenkörper also 8 oder mehr Chunks enthält (wobei "Chunks" Anweisungen, lokale Variablen, Parameter, Kommentare sind), kann Ihr Gehirn die Bedeutung jedes dieser Chunks nicht gleichzeitig speichern. Stattdessen verschiebt Ihr Gehirn Teile in den Arbeitsspeicher hinein und aus ihm heraus, während Sie den Code lesen. Wenn Sie beispielsweise Variablennamen wie i und j verwenden, verschiebt Ihr Gehirn die Bedeutungen von i und j aus dem Arbeitsspeicher. Wenn Sie das nächste Mal j lesen, verlässt sich Ihr Gehirn normalerweise auf den Kontext, um die Bedeutung zu finden. Wenn Sie also customers[j] in der Mitte des Schleifenkörpers lesen, wird Ihr Gehirn infer, dass j ist einen Index in das Array customers. Wenn Sie customers[vertexIndex] Geschrieben hätten, würden Sie sehen, dass Sie den falschen Index verwenden. Und das ist für sehr kurze Schleifenkörper mit nur 8 Informationsblöcken, d. H. 5-8 Codezeilen.

Wenn der Körper länger wird, extrahieren Sie ihn normalerweise in eine separate Funktion mit dem Parameter vertexIndex. Und das ist der zweite Punkt, den ich angesprochen habe: Wenn die Variable in dieser Funktion vertexIndex heißt, sollte sie beim Aufrufer auch wirklich vertexIndex heißen.

15
nikie

Ich stimme den Punkten Ihrer Kollegen nicht zu.

Für mich bedeutet ich "Iteration". Sehr sinnvoll im Falle einer Schleife.

Die meisten IDEs ermöglichen die Suche nach Regex-Typen im Text. Sie können also nach 'e' suchen, nicht in einem Wort. Das wäre effektiv.

10
TZHX

Kurze Variablennamen sind wie Pronomen in natürlichen Sprachen: in einem kleinen Kontext/Bereich zu verwenden. "i" in einer kurzen Schleife (keine Verschachtelungen) oder "e" in einer Folge von wenigen Fängen sind vollkommen in Ordnung. In vielen Fällen wäre der lange/beschreibende Name für "i" "the_stupid_index_needed_to_get_at_the_really_interesting_things" und Sie verwenden einen Lambda-Ausdruck, nur weil er nur in einem Kontext benötigt wird.

Perls $ _ ist ein Superpronomen, das funktioniert (für Perl-Programmierer); Obwohl ich ein bisschen Angst habe, wenn ich erlaubt/ermutigt werde, auch nur 'es' zu überspringen (nur "drucken" bis "$ _ drucken").

Die Suche nach Variablennamen, um Probleme im Code zu erkennen, wäre nicht meine erste Idee. Ich denke, der Programmierer sollte eine Vorstellung von der Klasse oder Funktion haben, nach der er bei bestimmten Problemen suchen soll.

6
Ekkehard.Horner

(Dies ist .NET-zentriert, aber Ihre Frage erwähnte C # -Lambda-Ausdrücke, daher denke ich, dass dies in Ihrem Fall relevant ist.)

Ich würde immer ex für eine Ausnahme verwenden, da e bereits (von WinForms und ASP.NET WebForms-Konventionen) als EventArgs-typisiertes Argument für einen Ereignishandler verwendet wird.

z.B.

protected void button_Click(object sender, System.EventArgs e)
{
    try
    {
        // whatever
    }
    catch (Exception ex)
    {
        // some exception handling
    }
}

MSDN verwendet jedoch e für Ausnahmevariablen .

Während dieser Diskussion würde ich vorschlagen, zwei Dinge zu beachten:

  • Variable Namenskonventionen können normalerweise als eine Form von religiöser Krieg betrachtet werden.
  • Die wichtigste Codierungskonvention besteht darin, den Stil des vorhandenen Codes beizubehalten .
6
Richard Ev

Ich sehe hier keine Frage, aber "i", "j" beziehen sich normalerweise auf Koordinaten wie "x" und "y" (meine persönliche Präferenz). Ich verstehe, dass "e" zu häufig ist, aber wenn Ihre Suche nach Ausnahmen, jus zu dieser Suche "Ausnahme".

das größte Problem bei der Verwendung von Variablen mit einem Buchstaben besteht darin, dass Sie möglicherweise mit ihnen verwechselt werden. Wenn diese Variable jedoch einen begrenzten Umfang hat, z. B. in einer Schleife oder in einem Try-Catch, sehe ich kein Problem damit

5
IvoC

Es ist normalerweise nicht sehr relevant, wenn Sie eine einzelne Schleife haben, und ich bevorzuge es, i oder j der Einfachheit halber (und wegen der Konvention) zu verwenden. Bei verschachtelten Schleifen verwende ich manchmal ausführlichere Namen, um zu erkennen, welcher Index sich auf was bezieht. Wenn ich beispielsweise zwei Arrays habe: Datums- und Mengenangaben und eine verschachtelte Schleife, die zuerst über Datumsangaben und dann über Mengenmengen iteriert, würde ich die Namen dateIdx und QuantityIdx verwenden, um Verwirrung zu vermeiden. Ich hatte Fehler in meinem Code, als ich schrieb

matrix[i][j] = fun(dates[i], quantities[j]);

sollte aber haben

matrix[i][j] = fun(dates[j], quantities[i]);

Mit ausführlicheren Namen würde ich den Fehler leicht erkennen, als

matrix[quantityIdx][dateIdx] = fun(dates[quantityIdx], quantities[dateIdx]);

würde einfach falsch aussehen.

5
quant_dev

Eine interessante erkenntnistheoretische Frage ist die von Bedeutung. Ihr Kollege scheint anzunehmen, dass nur weil etwas etwas bedeutet für ihn, dann gibt es ist Bedeutung und sonst ist es nicht.

Die Wahrheit ist natürlich, dass all diese Symbole, die wir jeden Tag verwenden, nicht nur beim Programmieren, nur deshalb eine Bedeutung haben, weil wir sie ihnen zuschreiben. Oder anders ausgedrückt, die Bedeutung befindet sich in Ihrem Gehirn, nicht im Symbol. (Um dies für zwölf klar zu machen, denken Sie an eine Keilschrifttafel - sicherlich hatte sie einmal eine Bedeutung für die Schriftsteller, für die meisten Milliarden von Menschen heute jedoch nicht.)

Vor diesem Hintergrund ist die Annahme, dass lange Namen etwas bedeuten, während kurze Namen dies nicht tun, absurd. Darüber hinaus kann die Erwartung, dass ein langer Name in einem Programmtext irgendwie die Bedeutung hat, die er möglicherweise in einem anderen Kontext hat, zu Verwirrung führen.

4
Ingo

Ein paar Punkte:

  • Ich habe gehört, dass Sie lieber "ii" als "i" verwenden sollten, denn wenn Sie jemals nach Ihrem Schleifenindex suchen müssen, können Sie dies tun (und es ist im Allgemeinen visuell eindeutiger) Ich denke das ist eine gute Idee.
  • Dies hängt vom Umfang und Inhalt Ihrer Schleife ab. Wenn Ihre Schleife einfach zehnmal etwas tut (z. B. wenn sie überhaupt nicht auf die Schleifenvariable zugreift), dann denke ich, dass "i" oder "ii" tausendmal vernünftiger ist als ein längerer Name. Jeder, der jemals programmiert hat, sollte wissen oder lernen, dass "i" normalerweise "Schleifenvariable" bedeutet.
  • Wenn sich in Ihrer Schleife ein großer Codeblock befindet, sollten Sie diesen zu einer Funktion hinzufügen. In beiden Fällen kann es jedoch hilfreich sein, einen kurzen, aber aussagekräftigen Namen zu haben, z. carIdx oder day, nicht zuletzt, weil Sie "i" im Hauptteil der Schleife verwenden möchten.
  • Wenn Ihre Schleife den Inhalt einer Datenstruktur durchläuft, verwenden Sie einen relevanten Namen: eine Abkürzung oder Kleinbuchstabenform des Datentyps oder der Variablen, die enthalten ist, wenn sie hinreichend unterscheidbar ist (z. B. für jedes Auto in carsOwned), oder eine längere Form, wenn Ihre Schleife ist komplexer.
  • Ich denke, dasselbe gilt für Lambdas und Ausnahmen, obwohl ich weniger vertraut bin. Wenn zum Beispiel IS ein vernünftiger Name für die Eingabe in Ihr Lambda ist, insbesondere wenn es mehr als einen gibt, dann verwenden Sie ihn, aber meistens ist der gesamte PUNKT eines Lambda zu Nehmen Sie eine anonyme Eingabe, die jeder als "x" sehr gut versteht.
4
Jack V.

Wenn Sie über lesbaren Code sprechen, müssen Sie einige Dinge beachten:

  • Was sind Ihre Codierungsstandards?
  • Was sind gängige Konventionen für Ihre Plattform?
  • Gibt es das Potenzial für Verwirrung?

Angenommen, Ihre Codierungsstandards sagen nicht viel über Namenskonventionen für Variablen aus, sollten Sie über die Diskussion des Codes nachdenken. Zum Beispiel mit der folgenden Schleife:

for(int i = 0; i < 10; i++)
{
    function(i);
}

Die Schleife und alle ihre Funktionen sind in ihrem gesamten Umfang klar erkennbar. Stellen Sie sich nun vor, wir hätten verschachtelte Schleifen (mein Favorit ist die Schleife innerhalb einer Schleife innerhalb einer Schleife). oder vielleicht eine Schleife, die 100 Zeilen umfasst. An diesem Punkt sind Einzelbuchstaben-Iteratoren nicht sehr sinnvoll, da es so leicht ist, sich im Bereich zu verlieren. Möglicherweise möchten Sie diese 100 Codezeilen in einige Methoden/Funktionen umgestalten, um sie ein wenig zu zähmen, aber geben Sie dem Index einen aussagekräftigen Namen.

In Bezug auf Ausnahmen stimme ich eher zu, dass e einfach kein guter Name ist. Meine Gründe unterscheiden sich jedoch von denen Ihres Freundes. Ich habe im Laufe der Jahre viel Java Programmierung) durchgeführt und muss mich mit all den bösen geprüften Ausnahmen auseinandersetzen, die niemals ausgelöst werden, wenn nicht jemand Ihre Java) hackt = installieren. Es ist eine Tatsache des Lebens. Wenn Sie also eine Ausnahme behandeln, müssen Sie einen Teil Ihrer Ausnahmebehandlung in einem anderen Ausnahmebehandler kapseln. Dies tritt häufig mit JDBC-Code auf.

Fazit: Da jede Ausnahme, die Sie überprüft haben, einen eindeutigen Namen benötigt und Sie mehrere Arten von Fehlern in einer try-Klausel behandeln, geben Sie den Ausnahmen die Namen, die etwas bedeuten. Sehen von e, e1, e2 hilft nicht, wenn ich den Code lese. Welche Art von Ausnahme sehe ich? Verwenden Sie also lange Namen, da es Raum für Verwirrung gibt.

4
Berin Loritsch

Ich benutze i als Zähler in Schleifen nur, wenn:

  • es wird als Index verwendet; und
  • wenn sein Umfang sehr kurz ist.

Wie Rook sagte, hat der Begriff i einen mathematischen Hintergrund als Index, der als Programmierkonvention mitging. Wenn es sich jedoch um eine lange Schleife handelt, die viele Variablen enthält, würde ich den Zähler i in etwas expliziteres umbenennen. Wenn Sie verschachtelte Schleifen haben, die beispielsweise über eine Matrix iterieren, verwende ich normalerweise row und col, da i und j nicht genau klar sind worauf sie sich noch beziehen ("War es A[i][j] oder A[j][i]...? ").

In Bezug auf e für Ausnahmen verwende ich normalerweise ex, weil ich gesehen habe, dass e für element verwendet wird.

3
gablin

Es kommt auf den Unterschied zwischen "Was machst du?" "Wie geht es dir?"

Verwenden Sie nach Möglichkeit zunächst ein foreach anstelle eines for. Es drückt besser aus, was Sie tun (d. H. Durch die Sammlung gehen und jedes Element verarbeiten). Dadurch wird das Problem der Benennung insgesamt beseitigt.

Wenn die Indexvariable überhaupt eine andere Bedeutung hat als "the_stupid_index_needed_to_get_at_the_really_interesting_things" (danke E.H.), dann verwenden Sie diese Bedeutung. row und col sollten gegenüber i und jif bevorzugt werden, wenn das Array eine Tabelle darstellt. Ich benutze auch gerne position oder pos, wenn ich viel tausche.

Das Idiom for (int i = 0 ....) ist jedoch so gut etabliert, dass es de facto der Standard für eine Iteration ist. Leg dich nicht ohne guten Grund mit gut etablierten Redewendungen an.

Ausnahme oben: Mathematik oder Physik - Verwenden Sie die Standardformeln aus dem Text.

v = d/t; ist einem Physiker oder Ingenieur vertrauter als velocity = distance / time;

2
Chris Cudmore

Obwohl ich kein Problem mit "i" habe, verlangen Konditionsstandards etwas mehr. Ich würde keine Zeit damit verschwenden zu streiten, wenn es notwendig ist. Für mich sind "loopIndex" und "loopCounter" zwei Standardnamen, die ich anstelle von "i" verwende.

1
DPD

@ nikie hat einige meiner Argumente bereits aufgelistet, aber ich möchte hinzufügen, dass Ihr Argument zur Begrenzung der Ausführlichkeit schwach ist.

Wenn Sie den Code isoliert betrachten, würde ein aussagekräftigerer Name helfen. Das Identifizieren der Schleife selbst ist kein Problem, wie Sie es erwähnt haben.

Sie werden das 'i' in einer App oft verwenden und könnten einige Eingaben sparen, aber sie beziehen sich nicht alle auf dasselbe. Viele SQL-Skripte aliasen eine Tabelle mit einem einzelnen Buchstaben, aber jedes Mal, wenn sie verwendet wird, verweist sie auf dieselbe Tabelle.

Es kann schwierig sein, aussagekräftige Namen zu finden, weshalb es am besten ist, es sich zur Gewohnheit zu machen.

1
JeffO

Zum "e", was natürlich für "Ausnahme" oder "Fehler" steht, ist es einfach, nach Ausnahmen zu suchen. Sie müssen nur sicherstellen, dass Ihre Suche mit ganzen Wörtern übereinstimmt (könnte auch nach "e)" mit übereinstimmenden ganzen Wörtern suchen, wenn Sie verwenden kein Leerzeichen zwischen der Variablen und der Klammer. Sie werden nicht viele "e" für sich finden, außer in den Ausnahmebehandlungsroutinen.

Zum "i", es hat eine Bedeutung: Es steht für "Iterator" (oder möglicherweise "Index" oder "Inkrementor").

Es gibt noch einen weiteren Grund, einen kurzen Variablennamen zu haben: Verknüpfungen zu längeren Variablen-/Klassennamen, die in einem Framework sehr häufig verwendet werden, oder was Sie haben. Wie die JQuery "$".

1
Phoenix

Ich dachte, i stehe für 'Inkrement'. Ich denke, die große Anzahl unterschiedlicher Antworten zeigt, dass die ursprüngliche Frage nach der Aussagekraft von Variablennamen etwas enthält - sie bedeuten oft etwas Traditionelles, aber viele Menschen verwenden sie, ohne zu wissen, was die Tradition ist. Es ist leicht zu sagen, dass jemand, der nicht weiß, wofür i steht, "kein Programmierer sein sollte", aber wie kann man lernen wofür i steht ? Hier gibt es ein halbes Dutzend Antworten.

1
David Rhoden

Steve McConnell in Code Complete hatte gute Ratschläge für die Ausführlichkeit von Variablennamen, alles hängt vom Umfang und der Verwendung der Variablen ab. Wenn Sie eine große Klasse haben, haben Ihre Mitgliedsvariablen bessere eindeutige Namen, da Sie wissen möchten, was die Variable darstellt, wenn Sie in der Mitte der Datei im Code vergraben sind. Wenn Sie eine kurze Funktion oder eine Variable haben, die nur für einige Codezeilen verwendet wird, können Sie so kurz machen, wie Sie möchten, da Sie nicht verwirrt werden, wo sie definiert ist oder was sie darstellt, und ein kleinerer Name macht den Code klarer.

Daher sind i, e und x für Ihren Fall großartige Variablennamen. (vorausgesetzt natürlich, Sie haben keine großen komplexen Schleifen)

1
Richard