Wird die Verwendung von Ein-Buchstaben-Variablen empfohlen? [geschlossen]

13

Wird die Verwendung von Ein-Buchstaben-Variablen in Java empfohlen? In Code-Snippets oder Tutorials werden sie häufig angezeigt. Ich kann mir nicht vorstellen, dass ihre Verwendung empfohlen wird, da der Code dadurch relativ schwer zu lesen ist und ich nie sehe, dass sie in anderen Programmiersprachen verwendet werden!

William Edwards
quelle
3
Ja und nein. Kommt ganz auf die Situation an.
Verhalten
1
Erschwert das Lesen von Code nicht immer. Wenn Sie beispielsweise Code implementieren, der auf mathematischen Gleichungen basiert, ist es normalerweise sinnvoll, dieselben Variablennamen zu verwenden, die in den Gleichungen verwendet werden. (Kommentare verweisen auf das Papier / den Text, in dem sich die Originalgleichungen befinden, oder, wenn Sie wie ich sind,
fügen

Antworten:

32

Dinge richtig zu benennen ist schwierig. Sehr schwer. Wenn Sie es anders sehen, können Sie dies auch so verstehen, dass richtig benannte Dinge wichtig sind. (Andernfalls, warum hätten Sie sich die Mühe gemacht, es zu benennen?)

Aber manchmal sind die Namen der Dinge einfach nicht wichtig. Deshalb haben wir zum Beispiel anonyme Funktionen ("Lambdas"), weil es manchmal einfach nicht wert ist, Dinge zu benennen.

Es gibt viele Beispiele, in denen einzelne Buchstaben (oder sehr kurze) Variablennamen angemessen sind:

  • i, j , k, lFür die Schleifenindizes
  • kund vfür den Schlüssel und Wert in einer Karte
  • n für eine Nummer (zB in Math.abs(n) )
  • a, b, c(Für beliebige Objekte zB inmax(a, b) )
  • e für das Element in einem generischen for each Schleife
  • f für die Funktion in einer übergeordneten Funktion
  • p für die Prädikatfunktion in einem Filter
  • T, T1,T2 , ... für Typ - Variablen
  • E für Typvariablen, die den Elementtyp einer Sammlung darstellen
  • R für eine Typvariable, die den Ergebnistyp einer Funktion darstellt
  • exfür die Ausnahme in einer catchKlausel
  • op für die Operation in einer Karte oder Falte
  • Anhängen des Buchstabens szur Angabe des Plural, dh einer Sammlung (z. B. nsfür eine Sammlung von Zahlen xsund ysfür zwei beliebige Sammlungen von Sammelobjekten)

Ich sehe sie nie in anderen Programmiersprachen!

Sie kommen in so ziemlich jeder Sprache vor, die ich kenne (und wahrscheinlich auch in denen, die ich nicht kenne). Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, D, Go, C ++, C, Sie nennen es.

Jörg W. Mittag
quelle
5
-1 Die Verwendung von 1-Buchstaben-Variablennamen ist eine verzögerte Programmierung. Manchmal ist es in Ordnung , faul zu sein, aber wenn Sie bekommen bis zu kund lin Schleife Indizes, die zu weit ist (Sie sollten nicht so viele verschachtelte Schleifen haben zu beginnen; Extrakt sie Funktionen) . Persönlich verwende ich nie mehr als eine 1-Buchstaben-Variable pro Funktion, aber ich schieße für 0.
BlueRaja - Danny Pflughoeft
Auch loder lenwird für eine Länge und arrfür ein Array verwendet (zB:) for(var i=0; l=arr.length; i<l; i++). Auch fnkann verwendet werden , anstatt f, wenn Sie auf eine Funktion beziehen.
Ismael Miguel
4
@ BlueRaja-DannyPflughoeft Ich halte es lieber für eine effiziente Programmierung. Jörg könnte wahrscheinlich erweitern, wann einzelne Buchstaben angebracht sind, nicht nur wo, aber um ehrlich zu sein, stelle ich mir vor, dass die meisten Programmierer die Grenze anders ziehen. In Bezug auf die Schleifenindizes könnte ich argumentieren, dass jeder Code, in dem die Indizes keine Namen mit semantischem Wert benötigen, einfach genug ist, um ein Verschachteln auf mehreren Ebenen über eine unnötige Extraktion hinweg zu rechtfertigen. Sie könnten auch in separaten Schleifen verwendet werden, um mögliche Probleme mit dem Geltungsbereich zu vermeiden, die Nelson anspricht .
Lilienthal
2
@Lilienthal: Code sollte effizient zu lesen und nicht effizient zu schreiben sein. Normalerweise sind sie dasselbe, aber nicht immer, wie in diesem Fall.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Nicht in allen Programmen nein, aber ich sehe nichts falsches an Jörgs Vorschlägen. Wie Killian es ausdrückte: "Alles, was länger ist, kann die Semantik unmöglich deutlicher machen, aber das Lesen dauert viel länger." Dies ist jedoch wahrscheinlich weitgehend eine Frage der persönlichen Vorlieben und des Stils.
Lilienthal
20

Wenn Ihre Schleife nichts anderes tut, als eine Variable zum Zählen zu verwenden

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

dann ja, das ist der beste Name, den Sie verwenden könnten. Alles, was länger ist, kann die Semantik unmöglich deutlicher machen, aber das Lesen dauert viel länger.

Wenn die Variable innerhalb der Schleife verwendet wird, kann ein aussagekräftiger Name hilfreich sein.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

Wenn Ihre Variable methodenweit verwendet wird, sollte ihr Name länger sein. Wenn es klassenweit verwendet wird, sollte sein Name völlig selbsterklärend sein, andernfalls wird es mit ziemlicher Sicherheit die Klarheit Ihres Codes verringern.

Kurz gesagt, je größer der Gültigkeitsbereich der Variablen ist, desto länger muss ihr Name sein.

Kilian Foth
quelle
Ehrlich gesagt bin ich an einem Punkt angelangt, an dem ich keine einzelnen Zeichenvariablennamen verwenden werde, Punkt. Ich versuche, Namen zu verwenden, die die Verwendung auch für Zähler ausdrücken. Normalerweise verwende ich eine Variable mit dem Namen, indexwenn ich zum Beispiel über ein Array iteriere.
Michael
13
@Michael: Meiner Meinung nach ist die Programmiersprache Jargon eine eigene Sprache, nicht das richtige Englisch. Und in dieser Sprache iist es ein richtiges Wort mit einer genau definierten Bedeutung, nämlich "Index, um den Sie sich nicht zu viele Sorgen machen müssen". Aber ich denke, es ist eine Frage der Vertrautheit. Wenn Sie viel von Haskell lesen, werden Sie daran gewöhnt, mals Monade , fals Funktor , xals Objekt , xsals Liste von xs usw. zu lesen .
Jörg W Mittag
2
Nur eine wirklich große Einschränkung. Einbuchstabige Variablennamen sind nur dann in Ordnung, wenn die Sprache den richtigen Variablenumfang hat. Sie werden sich offensichtlich fragen: "Welche Sprache hat keinen angemessenen Sprachumfang?". Ich habe drei Stunden gebraucht, um zu lernen, dass JavaScript die Variablen in einer FOR-Schleife nicht berücksichtigt. Probieren Sie es mit einer for-Schleife in einer for-Schleife mit demselben Variablennamen aus. Es wird dich umhauen.
Nelson
@ Nelson: Diese Frage und diese Antwort beziehen sich auf Java. Offensichtlich können verschiedene Sprachen etwas unterschiedliche Überlegungen haben. (JavaScript ist nicht dieselbe Sprache wie Java.)
ruakh
Ich bin alle für einbuchstabige Variablennamen, wenn sie am sinnvollsten sind, aber ich stimme nicht zu, dass dies ider beste Name ist, den Sie für eine Schleife verwenden können, die eine Variable nur zum Zählen verwendet. In diesem Fall würde ich lieber countals Variablennamen verwendet sehen: sofort verständlich. for (int count = 0; count < 10; count++)oder while (count--).
Todd Lehman
4

Wenn ich den Code in Kilians Antwort lese, glaube ich nicht, dass es eine Schleife und eine Variable gibt, und sie hat den Typ int und einen Namen, und der Name ist i und sie ist mit 0 initialisiert. .. ". Ich denke nur "loop ...", wo die drei Punkte für unwichtige Details stehen, über die ich nicht einmal nachdenke. Nach Meinung meines Programmierers existiert diese Variable nicht wirklich, es ist nur ein Artefakt, das ich eingeben muss, wie das for (;;) {}, das es zu einer Schleife macht.

Da diese Variable nicht einmal in meinem Kopf existiert, warum sollte ich ihr einen Namen geben, der über das absolut Notwendige hinausgeht?

gnasher729
quelle
Ich sollte hinzufügen, dass ich bei dieser Art von Konstrukt oft versucht bin, nicht einmal i, sondern _für die offensichtlich bedeutungslose Variable zu verwenden. Aber nicht jeder ist mit Prolog vertraut, und es würde wahrscheinlich mehr Aufmerksamkeit erregen, als es entfernt.
Kilian Foth
Sie müssen auch berücksichtigen, wie die Variable innerhalb der Schleife und nicht nur im for (...)Header verwendet wird.
@KilianFoth: Es wird auch so in Haskell, ML, F # und Scala verwendet, glaube ich. Und in Ruby, obwohl _eine rechtliche Kennung ist wie jede andere, gab es eine neue Änderung , dass nicht verwendete lokale Variablen mit den Namen _(oder ab _) kann nicht erzeugen eine „nicht genutzte lokale Variable“ Warnung, obwohl Rubin normalerweise über sie warnt.
Jörg W Mittag
-1

Wenn Sie die Buchstaben i, j, k als Indizes innerhalb einer Schleife bezeichnen, ist dies in Java und anderen Programmiersprachen üblich. Obwohl es wahrscheinlich besser ist, für jede Style-Schleife eine zu verwenden, wie z

for(User user: users) {
  doSomethingWithTheUser(user);
}

Anstatt von

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

In Java wurde dieser Schleifenstil erst vor relativ kurzer Zeit eingeführt. Dies mag der Grund sein, warum Sie es für Java eher bemerken, da das Durchlaufen der Indizes die häufigste Methode zum Durchlaufen eines Arrays oder einer Liste war.

Es gibt einige andere Fälle, in denen einzelne Buchstaben geeignet sein können, beispielsweise bei der Implementierung einer mathematischen Funktion, bei der einzelne Buchstaben wie n, x oder y bereits häufig vorkommen können. Aber im Allgemeinen, nein, geben Sie Ihren Variablen einen aussagekräftigen Namen.

Nick
quelle
5
"In Java wurde dieser Loop-Stil erst vor relativ kurzer Zeit eingeführt" ... wie vor einem Jahrzehnt? ( Java 5 wurde im Jahr 2004 veröffentlicht )
meriton
1
Ja, das ist ziemlich neu. Nein ich bin nicht alt Halte den Mund, halt den Rand, Halt die Klappe. Verdammte Kinder steigen von meinem Rasen. Es gibt immer noch eine Menge älterer Java-Anwendungen aus der Zeit vor Java 5. Und noch mehr Java-Programmierer, die die Sprache unter Java 1.4 gelernt haben und sich weigern, ihre Arbeitsweise zu aktualisieren. Und noch mehr Codebeispiele online aus den frühen 2000er Jahren (ja, wir hatten damals das Internet, wir haben es nur das Web 2.0 genannt).
Nick