Uso de guiones bajos en variables de Java y nombres de métodos [cerrado]


83

Incluso hoy en día veo a menudo guiones bajos en las variables y métodos de Java, un ejemplo son las variables miembro (como "m_count" o "_count"). Por lo que recuerdo, el uso de guiones bajos en estos casos se denomina mal estilo por Sun.

El único lugar donde deben usarse es en las constantes (como en "public final static int IS_OKAY = 1;"), porque las constantes deben estar todas en mayúsculas y no en camel. Aquí, el guión bajo debería hacer que el código sea más legible.

¿Crees que usar guiones bajos en Java es de mal estilo? Si es así (o no), ¿por qué?

Respuestas:


146

Si no tiene código usándolo ahora, le sugiero que continúe con eso. Si su código base lo usa, continúe con eso.

Lo más importante del estilo de codificación es la coherencia . Si no tiene nada con lo que ser coherente, es probable que las recomendaciones del proveedor de idiomas sean un buen punto de partida.


3
Usamos convenciones de codificación sin usar guiones bajos. De todos modos, mirando frameworks y código más antiguo, a menudo veía subrayados. La pregunta de que la coherencia gobierna sobre la convención debe responderse claramente por coherencia, pero no es el punto en el que pensé al hacer la pregunta.
Georgi

1
El uso continuo del carácter '_' sería una mala práctica. Esta forma de trabajo introduce un costo de mantenimiento adicional y tendría que informar estas convenciones excepcionales a cada nuevo desarrollador que se une al equipo.
Halil

1
esto es como nombrar interfaces de esta manera: ReadableInterface- absolutamente redundante. En los IDE modernos, no es necesario especificar el tipo de variable o su rango; colorear y saltar rápidamente hace todo el trabajo por usted. Entonces, en mi opinión, este es un mal estilo ya que escribe caracteres redundantes y obliga a la gente a leerlo / mantenerlo.
kiedysktos

120
sunDoesNotRecommendUnderscoresBecauseJavaVariableAndFunctionNamesTendToBeLongEnoughAsItIs ();

as_other_have_haid_consistency_is_the_important_thing_here_so_else_whake_you_think_is_more_readable ();

La pregunta de que la consistencia gobierna sobre la convención claramente debe responderse por consistencia, pero no es el punto en el que pensé al hacer la pregunta. De todos modos, hay veces que conviene dejar huellas antiguas, ¿eh?
Georgi

2
Si ya se está usando una convención de nomenclatura "conflictiva", creo que depende de cuánto código estemos hablando. No recomendaría reescribir miles de líneas de código solo para pasar de old_convention a newConvention, dado que la antigua convención se usa de manera consistente.
Anders Sandvig

Jajaja Dicho esto, cuando el código se pega en editores que tienen corrector ortográfico, las palabras "mal escritas" se subrayan, oscureciendo así el subrayado. Ésta es una buena razón para no utilizar guiones bajos. Además, el estuche Camel es más corto. Finalmente, la tecla shift es más fácil de usar en letras que en la fila superior (es decir, shift dash '-').
Tihamer

@Tihamer Otros dirían que el snake_caseformulario es más fácil de leer. Especialmente con palabras cortas (1-2 letras), definitivamente diría que este es el caso. En cuanto a "difícil de escribir", escribir una palabra con lotsOfMixedCaseWithinIt tampoco es precisamente conveniente. Yo recomendaría que se trate de a qué estás acostumbrado. En Java, sin embargo, digo "use la forma común" como lo recomienda el JLS / etc. En Ruby / Python / C, use el caso de serpiente. Y así sucesivamente ...
Per Lundberg

37

Reglas:

  1. Haz lo que hace el código que estás editando
  2. Si el n. ° 1 no aplica, use camelCase, sin guiones bajos

31

No creo que usar _ o m_ para indicar variables miembro sea malo en Java o en cualquier otro idioma. En mi opinión, mejora la legibilidad de su código porque le permite ver un fragmento e identificar rápidamente todas las variables miembro de los locales.

También puede lograr esto obligando a los usuarios a anteponer las variables de instancia con "esto", pero esto me parece un poco draconiano. De muchas maneras viola DRY porque es una variable de instancia, ¿por qué calificarla dos veces?

Mi estilo personal es usar m_ en lugar de _. La razón es que también existen variables globales y estáticas. La ventaja de m _ / _ es que distingue un ámbito de variables. Por lo tanto, no puede reutilizar _ para global o estático y, en su lugar, elijo g_ y s_ respectivamente.


1
Esta pregunta trataba sobre preguntar sobre los guiones bajos de Java en general, no sobre preguntarles solo a las variables miembro (aunque este fue un ejemplo en la pregunta).
Georgi

10
¿Así que me rebajas por comentar un subconjunto de la pregunta? Parece un poco extremo
JaredPar

1
@JaredPar: eres el único que ofrece una buena sugerencia de estilo alternativo. +1 por eso.
djangofan

Escribir this.foo (o this-> foo en C ++) probablemente sería una forma mucho más clara de diferenciar variables locales y campos / miembros.
Kevin

7

El "mal estilo" es muy subjetivo. Si ciertas convenciones funcionan para usted y su equipo, creo que calificará un estilo malo / bueno.

Para responder a su pregunta: utilizo un guión bajo inicial para marcar variables privadas. Lo encuentro claro y puedo escanear el código rápidamente y averiguar qué está pasando.

(Sin embargo, casi nunca uso "esto", excepto para evitar un conflicto de nombres).


Como dijiste, el estilo es muy subjetivo. Tiendo a usar thisbastante libremente para indicar una variable miembro si creo que necesita que se le preste atención. Sin embargo, no soy un fanático de eso.
Chris Cudmore

6

el uso de 'm_' o '_' al principio de una variable facilita la detección de variables miembro en métodos a lo largo de un objeto.

Como beneficio adicional, escribir 'm_' o '_' hará que intellsense los muestre primero;)


5
Si está programando Java, lo más probable es que tenga un IDE que coloree sus variables de miembro en un color diferente. "m_" es simplemente desagradable.
JeeBee

Prefiero "its" porque se lee bien:if (itsEmail.equals(email))
davetron5000

7
Prefiero esto. para los nombres de los miembros. Absolutamente inconfundible.
S.Lott

5
  • Resulta que me gustan los guiones bajos iniciales para las variables de instancia (privadas), parece más fácil de leer y distinguir. Por supuesto, esto puede meterte en problemas con casos extremos (por ejemplo, variables de instancia pública (no comunes, lo sé), de cualquier manera, nombre ellos podría decirse que está rompiendo su convención de nomenclatura:
  • private int _my_int; public int myInt;? _my_int? )

-por mucho que me guste el _style de esto y creo que es legible, encuentro que podría decirse que es más problemático de lo que vale, ya que es poco común y es probable que no coincida con nada más en la base de código que estás usando.

-La generación de código automatizada (por ejemplo, los getters, setters de generación de eclipse) no es probable que entienda esto, por lo que tendrá que arreglarlo a mano o limpiar con eclipse lo suficiente para que lo reconozca.

En última instancia, va en contra del resto de las preferencias del mundo (java) y es probable que tenga algunas molestias por eso. Y como han mencionado los carteles anteriores, la coherencia en la base del código supera todos los problemas anteriores.


3
Configurar Eclipse para comprender sus preferencias de prefijo (o sufijo) es bastante sencillo. En Preferencias-> Java-> Estilo de código hay una tabla donde puede establecer las convenciones de nombres de variables para campos, campos estáticos, campos finales estáticos, parámetros y variables locales. Todos los generadores de código parecen respetar esta configuración.
metasim

5

Hay una razón por la que el uso de guiones bajos se consideraba de mal estilo en los viejos tiempos. Cuando un compilador en tiempo de ejecución era algo inasequible y los monitores venían con una resolución asombrosa de 320x240 píxeles, a menudo no era fácil diferenciar entre _namey __name.


Es por eso que OCaml nunca se ejecutaría en máquinas antiguas.
David Tonhofer

4

Es bueno tener algo para distinguir las variables privadas de las públicas, pero no me gusta '_' en la codificación general. Si puedo ayudarlo con un código nuevo, evito su uso.


4

Aquí hay un enlace a las recomendaciones de Sun para Java. No es que tengas que usar estos o incluso que el código de su biblioteca los siga todos, pero es un buen comienzo si vas desde cero. Herramientas como Eclipse tienen formateadores integrados y herramientas de limpieza que pueden ayudarlo a cumplir con estas convenciones (u otras que usted defina).

Para mí, '_' es demasiado difícil de escribir :)


3

Es una mezcla de estilos de codificación. Una escuela de pensamiento consiste en introducir un guión bajo a los miembros privados para distinguirlos.

setBar( int bar)
{
   _bar = bar;
}

en vez de

setBar( int bar)
{
   this.bar = bar;
}

Otros usarán guiones bajos para indicar una variable local temporal que saldrá del alcance al final de la llamada al método. (Encuentro esto bastante inútil, un buen método no debería ser tan largo, ¡y la declaración es JUSTO ALLÍ! Así que sé que se sale de alcance) Editar: Dios no permita que un programador de esta escuela y un programador de la escuela memberData colaboren ! Sería un infierno.

A veces, el código generado irá precedido de variables con _ o __. La idea es que ningún humano haría esto, así que es seguro.


En su caso, uso lo siguiente: setBar (int aBar) {bar = aBar; } Legible, sin esto. o _bar ...
Georgi

Eso es bastante justo, pero luego aparece aBar en la firma del método en la API, y creo que se ve desordenado.
Chris Cudmore

1
De hecho, me encontré con un caso en el que el código generado automáticamente coincidía con una de las palabras clave del idioma, por lo que la mejor manera de evitar esto era anteponer un _ al principio.
Joe Plante

2

Creo que cualquier estilo que rompa las pautas de estilo de un idioma (sin la debida razón) es feo y, por lo tanto, "malo".

Sin duda, el código que ha visto fue escrito por alguien que solía trabajar en un lenguaje donde los guiones bajos eran aceptables.

Algunas personas simplemente no pueden adaptarse a los nuevos estilos de codificación ...


En general, estoy de acuerdo con la filosofía de "hacer lo que hacen los demás" al codificar, pero no de manera absoluta. Creo que hay un argumento muy fuerte de que, dadas las longitudes razonables de los identificadores, las variables snake_cased_variables son más fáciles de leer que las variables CamelCasedVariables. Mi justificación es que reducir la carga cognitiva visualmente es algo pequeño, pero sigue siendo útil. Las personas aprecian los espacios en blanco en el código, al leer documentos y escuchar música. El caso Camel, creo, es una afrenta al espacio en blanco en nombre de la "eficiencia". ¿Eficiencia para quién?
David J.

2

La razón por la que la gente lo hace (en mi experiencia) es para diferenciar entre variables miembro y parámetros de función. En Java puedes tener una clase como esta:

public class TestClass {
  int var1;

  public void func1(int var1) {
     System.out.println("Which one is it?: " + var1);
  }
}

Si hiciera la variable miembro _var1 o m_var1, no tendría ambigüedad en la función.

Entonces es un estilo, y no lo llamaría malo.


En este escenario, normalmente cambio el nombre del parámetro a "aVar1". En contraste con "la var1".
Lluis Martinez

1

Personalmente, creo que un lenguaje no debería establecer reglas sobre el estilo de codificación. Es una cuestión de preferencias, uso, conveniencia, concepto de legibilidad.
Ahora, un proyecto debe establecer reglas de codificación para mantener la coherencia entre los listados. Puede que no estés de acuerdo con estas reglas, pero debes ceñirte a ellas si quieres contribuir (o trabajar en equipo).

Al menos, los IDE como Eclispe son agnósticos, lo que permite establecer reglas como prefijos o sufijos variables, varios estilos de colocación de llaves y administración de espacio, etc. Por lo tanto, puede usarlo para reformatear el código según sus pautas.

Nota: Soy uno de los que mantienen sus viejos hábitos de C / C ++, codificando Java con prefijos m_ para las variables miembro (y s_ para las estáticas), prefijando booleanos con una b inicial, usando una letra mayúscula inicial para los nombres de funciones y alineando llaves. .. ¡El horror de los fundamentalistas de Java! ;-)
Curiosamente, esas son las convenciones que utilizo donde trabajo ... ¡probablemente porque el desarrollador inicial principal proviene del mundo MFC! :-RE


0

es solo tu propio estilo, nada de un código de estilo malo y nada de un código de estilo bueno, solo diferencia nuestro código con los demás.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.