¿Se fomenta el uso de variables de una letra? [cerrado]

13

¿Se fomenta el uso de variables de una letra en Java? En fragmentos de código o tutoriales, a menudo los ves. ¡No puedo imaginar que se fomente su uso porque hace que el código sea relativamente más difícil de leer y nunca veo que se usen en otros lenguajes de programación!

William Edwards
fuente
3
Si y no. Depende completamente de la situación.
Zavior
1
No siempre hace que el código sea más difícil de leer. Como por ejemplo, cuando implementa código basado en ecuaciones matemáticas, generalmente tiene sentido usar los mismos nombres de variables que se usan en las ecuaciones. (Comentarios apuntan de nuevo al papel / texto donde las ecuaciones originales se encuentran, o si eres como yo, que a veces incluyen el código LaTeX para ellos.)
jamesqf

Respuestas:

32

Nombrar correctamente las cosas es difícil. Muy duro. Si lo miras de otra manera, también puedes tomar esto como que significa que las cosas con un nombre apropiado son importantes. (De lo contrario, ¿por qué habría gastado tanto esfuerzo nombrarlo?)

Pero, a veces, los nombres de las cosas simplemente no son importantes. Es por eso que tenemos cosas como funciones anónimas ("lambdas"), por ejemplo: porque a veces simplemente no vale la pena nombrar cosas.

Hay muchos ejemplos, donde los nombres de variables de una sola letra (o muy cortos) son apropiados:

  • i, j, k, lPara los índices de bucle
  • ky vpara la clave y el valor en un mapa
  • npara un número (por ejemplo, en Math.abs(n))
  • a, b, cPara objetos arbitrarios (por ejemplo, en max(a, b))
  • epara el elemento en un for eachbucle genérico
  • f para la función en una función de orden superior
  • p para la función predicado en un filtro
  • T, T1, T2, ... para las variables de tipo
  • E para variables de tipo que representan el tipo de elemento de una colección
  • R para una variable de tipo que representa el tipo de resultado de una función
  • expara la excepción en una catchcláusula
  • op para la operación en un mapa o pliegue
  • agregar la letra spara indicar el plural, es decir, una colección (por ejemplo, nspara una colección de números xsy yspara dos colecciones arbitrarias de objetos genéricos)

¡Nunca los veo en otros lenguajes de programación!

Son muy comunes en casi todos los idiomas que conozco (y probablemente también en aquellos que no conozco). Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Ir, C ++, C, lo que sea.

Jörg W Mittag
fuente
55
-1 El uso de nombres de variables de 1 letra es una programación diferida. A veces está bien ser perezoso, pero si está llegando a los índices de bucle ky está len él, eso está demasiado lejos (para empezar, no debería tener tantos bucles anidados; extráigalos en funciones) . Personalmente, nunca uso más de una variable de 1 letra por función, pero disparo por 0.
BlueRaja - Danny Pflughoeft
Además, lo lense usa para una longitud y arrpara una matriz (por ejemplo:) for(var i=0; l=arr.length; i<l; i++). Además, fnse puede usar en lugar de fcuando se refiere a una función.
Ismael Miguel
44
@ BlueRaja-DannyPflughoeft Prefiero pensar que es una programación eficiente. Jorg probablemente podría expandirse cuando las letras simples son apropiadas, no solo dónde, sino para ser honesto, imagino que la mayoría de los programadores dibujan la línea de manera diferente. En cuanto a los índices de bucle, podría argumentar que cualquier código en el que los índices no necesitan nombres con valor semántico es lo suficientemente simple como para justificar el anidamiento multinivel sobre la extracción innecesaria. También podrían usarse en bucles separados para evitar posibles problemas de alcance que plantea Nelson .
Lilienthal
2
@Lilienthal: el código debe ser eficiente para leer, no eficiente para escribir. Por lo general, son lo mismo, pero no siempre, como en este caso.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft No en todos los programas, no, pero no veo nada malo con las sugerencias de Jorg. Como dijo Killian : "Cualquier cosa por más tiempo no puede hacer que la semántica sea más obvia, pero lleva mucho más tiempo leerla". Pero esto es probablemente una cuestión de preferencia personal y estilo.
Lilienthal
20

Si su ciclo no hace más que usar una variable para contar

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

entonces sí, este es el mejor nombre que podrías usar. Cualquier cosa más larga no puede hacer que la semántica sea más obvia, pero lleva mucho más tiempo leerla.

Si la variable se usa dentro del bucle, un nombre significativo puede ser útil.

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

Si su variable se usa en todo el método, su nombre debería ser más largo; si se usa en toda la clase, es mejor que su nombre se explique por sí mismo, de lo contrario, seguramente disminuirá la claridad de su código.

En resumen, cuanto mayor sea el alcance de la variable, más largo debe ser su nombre.

Kilian Foth
fuente
Honestamente, he llegado al punto en que no usaré nombres de variables de un carácter, punto. Intento usar nombres que deletreen el uso, incluso para los contadores. Por lo general, usaría una variable nombrada indexal iterar sobre una matriz, por ejemplo.
Michael
13
@ Michael: En mi opinión, la jerga de programación es su propio idioma, no es inglés propiamente dicho. Y en ese idioma, ies una palabra adecuada con un significado definido con precisión, a saber, "índice del que no debe preocuparse demasiado". Pero supongo que es una cuestión de familiaridad. Si lees mucho Haskell, te acostumbrarás a leer mcomo mónada , fcomo functor , xcomo algún objeto , xscomo una lista de xs, etc.
Jörg W Mittag
2
Solo una gran advertencia. Los nombres de las variables de una sola letra son correctos solo si el idioma tiene un alcance de variable adecuado. Obviamente se preguntará "¿Qué idioma no tiene un alcance adecuado?". Bueno, me llevó tres horas aprender que JavaScript no abarca las variables en un bucle FOR. Pruébelo con un bucle for dentro de un bucle for utilizando el mismo nombre de variable. Te dejará boquiabierto.
Nelson
@ Nelson: Esta pregunta y esta respuesta son sobre Java. Obviamente, diferentes idiomas pueden tener consideraciones algo diferentes. (JavaScript no es el mismo lenguaje que Java.)
ruakh
Estoy a favor de los nombres de variables de una sola letra siempre que tengan más sentido, pero no estoy de acuerdo con que isea ​​"el mejor nombre que pueda usar" para un bucle que usa una variable solo para contar. En ese caso, preferiría ver countusado como el nombre de la variable: instantáneamente comprensible. for (int count = 0; count < 10; count++)o while (count--).
Todd Lehman
4

Al leer el código en la respuesta de Kilian, no creo que "haya un bucle, y haya una variable, y tenga el tipo int, y tenga un nombre, y el nombre sea i, y se inicialice a 0,. .. ". Simplemente pienso "bucle ..." donde los tres puntos representan detalles sin importancia en los que ni siquiera pienso. En la mente de mi programador, esa variable realmente no existe, es solo un artefacto que tengo que escribir, como for (;;) {} que lo convierte en un bucle.

Dado que esa variable ni siquiera existe en mi mente, ¿por qué debería darle un nombre, más allá de lo que es absolutamente necesario?

gnasher729
fuente
Debo agregar que en ese tipo de construcción, a menudo me siento tentado a usar ni siquiera i, sino _para la variable obviamente sin sentido. Pero no todos están familiarizados con Prolog, y probablemente crearía más atención de la que elimina.
Kilian Foth
También debe considerar cómo se usa la variable dentro del bucle, no solo en el for (...)encabezado.
@KilianFoth: creo que también se usa de esa manera en Haskell, ML, F # y Scala. Y en Ruby, aunque _es un identificador legal como cualquier otro, hubo un cambio reciente que indica que las variables locales no utilizadas llamadas _(o que comienzan con _) no generan una advertencia de "variable local no utilizada", aunque Ruby normalmente advierte sobre ellas.
Jörg W Mittag
-1

Si se refiere a las letras i, j, k como índices dentro de un bucle, esa es una práctica común en Java y otros lenguajes de programación. Aunque probablemente sea mejor usar un para cada bucle de estilo, como

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

en lugar de

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

En Java, ese estilo de bucle solo se introdujo recientemente. Esa puede ser la razón por la que lo está notando más para Java, ya que recorrer los índices solía ser la forma más común de recorrer una matriz o lista.

Hay algunos otros casos en los que las letras simples pueden ser apropiadas, como cuando se implementa una función matemática en la que letras simples como n, x o y, ya pueden ser comunes. Pero en general, no, nombra tus variables como algo significativo.

Mella
fuente
55
"En Java, ese estilo de bucle se introdujo hace muy poco" ... ¿como hace una década? ( Java 5 fue lanzado en 2004 )
meriton
1
Sí, eso es bastante reciente. No, no soy viejo. Cállate. Malditos niños salgan de mi césped. Todavía hay muchas aplicaciones Java heredadas de pre Java 5. Y aún más programadores de Java que aprendieron el lenguaje en Java 1.4 y se niegan a actualizar cómo hacen las cosas. Y aún más muestras de código en línea que se remontan a principios de la década de 2000 (sí, teníamos Internet en ese entonces; simplemente lo llamamos Web 2.0).
Nick