L'utilisation de variables à une lettre est-elle encouragée? [fermé]

13

L'utilisation de variables à une lettre est-elle encouragée en Java? Dans les extraits de code ou les didacticiels, vous les voyez souvent. Je ne peux pas imaginer que leur utilisation soit encouragée car cela rend le code relativement plus difficile à lire et je ne les vois jamais être utilisés dans d'autres langages de programmation!

William Edwards
la source
3
Oui et non. Tout dépend de la situation.
Zavior
1
Ne rend pas toujours le code plus difficile à lire. Comme par exemple, lorsque vous implémentez du code basé sur des équations mathématiques, il est généralement judicieux d'utiliser les mêmes noms de variables que ceux utilisés dans les équations. (Les commentaires renvoient au papier / texte où se trouvent les équations originales, ou si vous êtes comme moi, vous incluez parfois le code LaTeX pour eux.)
jamesqf

Réponses:

32

Nommer correctement les choses est difficile. Très dur. Si vous le regardez dans l'autre sens, vous pouvez également considérer que cela signifie que les choses correctement nommées sont importantes. (Sinon, pourquoi auriez-vous passé l'effort à le nommer?)

Mais, parfois, les noms des choses ne sont tout simplement pas importants. C'est pourquoi nous avons des choses comme des fonctions anonymes ("lambdas"), par exemple: parce que parfois cela ne vaut pas la peine de nommer des choses.

Il existe de nombreux exemples où des noms de variables à lettre unique (ou très courts) sont appropriés:

  • i, j, k, lPour les indices de boucle
  • ket vpour la clé et la valeur dans une carte
  • npour un nombre (par exemple en Math.abs(n))
  • a, b, cDes objets quelconques (par exemple, max(a, b))
  • epour l'élément dans une for eachboucle générique
  • f pour la fonction dans une fonction d'ordre supérieur
  • p pour la fonction de prédicat dans un filtre
  • T, T1, T2, ... pour les variables de type
  • E pour les variables de type représentant le type d'élément d'une collection
  • R pour une variable de type représentant le type de résultat d'une fonction
  • expour l'exception dans une catchclause
  • op pour l'opération dans une carte ou un pli
  • en ajoutant la lettre spour indiquer le pluriel, c'est-à-dire une collection (par exemple nspour une collection de nombres, xset yspour deux collections arbitraires d'objets génériques)

Je ne les vois jamais utilisés dans d'autres langages de programmation!

Ils sont très courants dans à peu près tous les langages que je connais (et probablement aussi dans ceux que je ne connais pas). Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, vous l'appelez.

Jörg W Mittag
la source
5
-1 L'utilisation de noms de variables à 1 lettre est une programmation paresseuse. Parfois , il est normal d'être paresseux, mais si vous obtenez jusqu'à ket ldes indices de boucle, qui est trop loin (vous ne devriez pas avoir que beaucoup de boucles imbriquées pour commencer, extrait les aux fonctions) . Personnellement, je n'utilise jamais plus d'une variable à 1 lettre par fonction, mais je tire pour 0.
BlueRaja - Danny Pflughoeft
Aussi, lou lenest utilisé pour une longueur et arrpour un tableau (par exemple:) for(var i=0; l=arr.length; i<l; i++). En outre, fnpeut être utilisé à la place de f, lorsque vous faites référence à une fonction.
Ismael Miguel
4
@ BlueRaja-DannyPflughoeft Je préfère le considérer comme une programmation efficace. Jorg pourrait probablement développer quand les lettres simples sont appropriées, pas seulement où, mais pour être honnête, j'imagine que la plupart des programmeurs tracent la ligne différemment. En ce qui concerne les indices de boucle, je pourrais faire valoir que tout code où les indices n'ont pas besoin de noms avec une valeur sémantique est assez simple pour justifier l'imbrication à plusieurs niveaux sur une extraction inutile. Ils pourraient également être utilisés dans des boucles distinctes pour éviter les éventuels problèmes de portée que Nelson soulève .
Lilienthal
2
@Lilienthal: le code doit être efficace à lire et non efficace à écrire. Habituellement, c'est la même chose, mais pas toujours, comme dans ce cas.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Pas dans tous les programmes non, mais je ne vois rien de mal aux suggestions de Jorg. Comme l'a dit Killian : "Tout ce qui est plus long ne peut pas rendre la sémantique plus évidente, mais prend beaucoup plus de temps à lire." Mais c'est probablement en grande partie une question de préférence personnelle et de style.
Lilienthal
20

Si votre boucle ne fait rien d'autre qu'utiliser une variable pour compter

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

alors oui, c'est le meilleur nom que vous pourriez utiliser. Tout ce qui est plus long ne peut pas rendre la sémantique plus évidente, mais prend beaucoup plus de temps à lire.

Si la variable est utilisée à l' intérieur l' la boucle, un nom significatif peut être utile.

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

Si votre variable est utilisée à l'échelle de la méthode, son nom doit être plus long; s'il est utilisé à l'échelle de la classe, son nom devrait être totalement explicite, sinon cela réduira presque certainement la clarté de votre code.

En bref, plus la portée de la variable est grande, plus son nom doit être long.

Kilian Foth
la source
Honnêtement, je suis arrivé au point où je n'utiliserai pas un nom de variable de caractère, point. J'essaie d'utiliser des noms qui expliquent l'usage, même pour les compteurs. J'utiliserais généralement une variable nommée indexlors de l'itération sur un tableau, par exemple.
Michael
13
@Michael: À mon avis, la programmation du jargon est son propre langage, ce n'est pas l'anglais proprement dit. Et dans cette langue, iest un mot propre avec un sens défini avec précision, à savoir "index dont vous n'avez pas trop à vous soucier". Mais je suppose que c'est une question de familiarité. Si vous lisez beaucoup de Haskell, vous vous habituerez à lire mcomme monade , fcomme foncteur , xcomme un objet , xscomme une liste de xs et ainsi de suite.
Jörg W Mittag
2
Juste une énorme mise en garde. Les noms de variable à lettre unique ne sont OK que si la langue a une portée de variable appropriée. Vous vous demanderez évidemment «Quelle langue n'a pas de portée appropriée?». Eh bien, il m'a fallu trois heures pour apprendre que JavaScript ne couvre pas les variables dans une boucle FOR. Essayez-le avec une boucle for dans une boucle for en utilisant le même nom de variable. Ça va vous couper le souffle.
Nelson
@Nelson: Cette question et cette réponse concernent Java. De toute évidence, différentes langues peuvent avoir des considérations quelque peu différentes. (JavaScript n'est pas le même langage que Java.)
ruakh
Je suis tout à fait pour les noms de variables à une seule lettre chaque fois qu'ils ont le plus de sens, mais je ne suis pas d'accord pour dire que ic'est "le meilleur nom que vous pourriez utiliser" pour une boucle qui utilise une variable uniquement pour le comptage. Dans ce cas, je préférerais voir countutilisé comme nom de variable: immédiatement compréhensible. for (int count = 0; count < 10; count++)ou while (count--).
Todd Lehman
4

En lisant le code dans la réponse de Kilian, je ne pense pas "qu'il y ait une boucle, et il y a une variable, et elle a le type int, et elle a un nom, et le nom est i, et il est initialisé à 0,. .. ". Je pense juste "boucle ..." où les trois points représentent des détails sans importance auxquels je ne pense même pas. Dans l'esprit de mon programmeur, cette variable n'existe pas vraiment, c'est juste un artefact que je dois taper, comme le for (;;) {} qui en fait une boucle.

Puisque cette variable n'existe même pas dans mon esprit, pourquoi lui donnerais-je un nom, au-delà de ce qui est absolument nécessaire?

gnasher729
la source
Je dois ajouter que dans ce type de construction, je suis souvent tenté de ne pas utiliser même i, mais _pour la variable manifestement dénuée de sens. Mais tout le monde ne connaît pas Prolog, et cela créerait probablement plus d'attention qu'il n'enlève.
Kilian Foth
Vous devez également considérer comment la variable est utilisée à l' intérieur de la boucle, pas seulement dans l'en- for (...)tête.
@KilianFoth: il est également utilisé de cette façon dans Haskell, ML, F # et Scala, je crois. Et dans Ruby, même s'il _s'agit d'un identifiant légal comme les autres, il y a eu un changement récent selon lequel les variables locales inutilisées nommées _(ou commençant par _) ne génèrent pas un avertissement "variable locale inutilisée", même si Ruby les avertit normalement.
Jörg W Mittag
-1

Si vous faites référence aux lettres i, j, k comme des indices dans une boucle, c'est une pratique courante en Java et dans d'autres langages de programmation. Bien qu'il soit préférable d'utiliser un pour chaque boucle de style, comme

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

au lieu de

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

En Java, ce style de boucle n'a été introduit que récemment. C'est peut-être pourquoi vous le remarquez plus pour Java, car le bouclage sur les index était le moyen le plus courant de boucler sur un tableau ou une liste.

Il existe quelques autres cas où des lettres simples peuvent être appropriées, comme lors de l'implémentation d'une fonction mathématique où des lettres simples telles que n, x ou y peuvent déjà être courantes. Mais en général, non, nommez vos variables quelque chose de significatif.

pseudo
la source
5
"En Java, ce style de bouclage n'a été introduit que récemment" ... comme il y a dix ans? ( Java 5 est sorti en 2004 )
meriton
1
Oui, c'est assez récent. Non, je ne suis pas vieux. Tais-toi. Merde, les enfants descendent de ma pelouse. Il existe encore de nombreuses applications Java héritées de la version antérieure à Java 5. Et encore plus de programmeurs Java qui ont appris le langage sur Java 1.4 et refusent de mettre à jour leur façon de faire. Et pourtant, encore plus d'échantillons de code en ligne remontent au début des années 2000 (oui, nous avions Internet à l'époque; nous l'appelions simplement le Web 2.0).
Nick