¿Es una mala práctica nombrar una variable no utilizada con un solo guión bajo?


44

A menudo, cuando la sintaxis del lenguaje requiere que nombre una variable que nunca se usa, la nombraré _.

En mi opinión, esto reduce el desorden y me permite centrarme en las variables significativas del código. Me parece discreto, por lo que produce un efecto "fuera de la vista, fuera de la mente".

Un ejemplo común de dónde hago esto es nombrar subconsultas en SQL.

SELECT *
FROM
(
    SELECT *
    FROM TableA
    JOIN TableB
        ON TableA.ColumnB = TableB.ColumnB
    WHERE [ColumnA] > 10
) _ --This name is required, but never used here
ORDER BY ColumnC

Otro ejemplo es una variable de bucle que no se usa.

array = [[] for _ in range(n)] # Defines a list of n empty lists in Python

Utilizo esta técnica con moderación, solo cuando siento que un nombre descriptivo no agrega nada al código y, en cierto sentido, lo quita al agregar más nombres para recordar. De alguna manera, lo veo como similar a la varpalabra clave en C #, que también uso con moderación.

Mis compañeros de trabajo no están de acuerdo. Dicen que incluso tener un solo nombre de carácter (alfabético) es mejor que _.

¿Me equivoco? ¿Es una mala práctica hacer esto?


44
Creo que los nombres de las variables deberían seguir la teoría de la información, es decir, la longitud es la probabilidad recíproca logarítmica de su uso (las variables comunes tienen nombres cortos). Una sola letra alfabética parece el camino equivocado.
dan_waterworth

2
@dan_waterworth El uso de caracteres simples o dobles como alias de tabla es una práctica bastante común en los scripts SQL. Como normalmente tiene que escribir muchos [table].[column]identificadores, ayuda mucho la legibilidad para usar [T].[column]. Depende del guión, por supuesto. Una pequeña selección como esa está perfectamente bien, pero si un script fuera muy grande, podría usar nombres más descriptivos.
CodexArcanum

55
Prefiero que uses "tonto". Esto me grita que están allí porque el lenguaje requiere una variable que no tiene contexto semántico fuera de estas pocas líneas. _ no le lee bien a un humano. (una de las razones por las que odio PERL - No puedo escribirlo ni leerlo)
Chris Cudmore

1
Nota al margen: lo que está nombrando allí es una tabla derivada , no una subconsulta.
Nick Chammas

2
La palabra clave var en c # no tiene este significado, es solo una declaración de variable normal donde se infiere el tipo.
Francesco De Vittori

Respuestas:


60

Todos los nombres deben ser significativos. Si _fuera un estándar bien conocido en su empresa o en la comunidad en general, entonces sería significativo como un "nombre que no importa". Si no es así, diría que es una mala práctica. Use un nombre descriptivo para lo que se refiere, especialmente porque el nombre podría ser importante en el futuro.


13
+1. dummySería bueno, joined_absería mejor.
Blrfl

55
+1, hay una convención en la que trabajo para usar '_' para variables no utilizadas. Creo que es una buena convención, pero estoy de acuerdo con esta respuesta para el caso del OP. Idealmente, las bases de código deberían verse como si fueran escritas por una sola persona.
dan_waterworth

20
"_" es un estándar bien conocido con Python.
Neil G

2
Si su empresa usa Perl, por otro lado, usar $ _ podría causar un comportamiento a veces sorprendente.
Plutor

2
En prólogo, un guión bajo indica que la variable será anónima y, por lo tanto, no utilizada.
Ivan

44

Yo diría que es una práctica aceptable. Este es un caso raro en el que consideraría que la mayoría está equivocada y necesita actualizar sus conocimientos sobre ideas de programación recientes. En muchos idiomas, particularmente los lenguajes funcionales basados ​​en ML como Haskell y OCaml, es extremadamente común usarlo _como una variable "no utilizada". Incluso Lua, que no ofrece soporte de lenguaje explícito para ello, fomenta el uso de _un marcador de posición por convención.

Varios idiomas (Haskell, Lua y DI piensan fuera de mi mente) también ofrecen una convención en la que las variables que comienzan con un guión bajo no generan advertencias del compilador sobre la "variable local no utilizada" que hace que _el nombre de la variable no utilizada sea más corto. Podrías usar algo como, _unusedpero estoy de acuerdo contigo en que solo hace desorden.


En el caso específico de SQL, lo he considerado y los compañeros de trabajo pueden ser correctos aquí. Muy comúnmente uso una sola letra mayúscula para los alias de tabla (y a menudo R (esults) para subselecciones). Creo que usar *in select es algo muy malo, porque si la tabla cambia, su conjunto de resultados también cambia inesperadamente. Por lo tanto, normalmente necesitaría el alias de un solo carácter para identificar las columnas que estoy seleccionando. Si deja de usar *, deja de necesitar un nombre "no usado".
CodexArcanum

11
Estrictamente hablando, al menos en Haskell, _es un patrón, no una variable. Es una diferencia sutil, pero significa que puede usarla varias veces en algo así (x, _, _) = ..., mientras que tratar de vincular la misma variable varias veces sería un error.
hammar

12

En Python _es definitivamente aceptable. Sin embargo, puede entrar en conflicto con gettextalias _().

Otras convenciones comunes son dummy, unused; solo o como prefijo.

Algunas herramientas de análisis de código conocen estas convenciones y no emitirán advertencias de variables no utilizadas:

  • PyLint para _odummy
  • PyDev para cualquier variable que comience por _, unusedodummy

2
Además, el uso _de variables ficticias en python chocará con el _último valor devuelto. Por ejemplo, en el intérprete, si lo hace 5*5en la línea 1; entonces en la línea 2 _tendrá el valor 25. Sin embargo, si luego establece x,_ = (3,'not used'), encontrará que _ahora es en not usedlugar del último valor devuelto hasta usted del _. Probablemente no deberías usar el _último valor devuelto en código real; pero a menudo es útil en el intérprete al probar cosas nuevas.
dr jimbob

44
Bueno, _como último valor devuelto funciona solo en el shell interactivo.
vartec

Lo mismo vale para Lua. Usar _ es una práctica estándar
sylvanaar

11

Depende del ecosistema en el que va a vivir este código. Si _es un estándar aceptado para indicar "variable ficticia" / "salida no utilizada", entonces, por supuesto, quédese con él. Si no es así, averigüe qué es y úselo.

Algunos lenguajes de programación (por ejemplo, Haskell) incluso tienen este identificador 'especial' integrado en su sintaxis para los fines que usted menciona.


5

Cuidado, _ ya tiene un significado intrínseco en algunos idiomas

En Python:

9.6. Variables privadas y referencias locales de clase

ingrese la descripción del enlace aquí Las variables de instancia "privadas" a las que no se puede acceder, excepto desde el interior de un objeto, no existen en Python. Sin embargo, hay una convención seguida por la mayoría del código de Python: un nombre con un guión bajo (por ejemplo, _spam) debe tratarse como una parte no pública de la API (ya sea una función, un método o un miembro de datos) . Debe considerarse un detalle de implementación y estar sujeto a cambios sin previo aviso.

También hay otra mención en la PEP 8 (Guía de estilo para el código Python):

Descriptivo: Estilos de nombres

_single_leading_underscore: indicador débil de "uso interno". Por ejemplo, desde M import * no importa objetos cuyo nombre comience con un guión bajo.

Cía#:

Generalmente se usa para marcar variables privadas que tienen propiedades públicas / internas. Pero la práctica generalmente se desprecia en estos días .

En JavaScript:

Hay una biblioteca llamada underscore.js que usa el guión bajo como prefijo para las extensiones prototipo no estándar.

Ejemplo:

var object = { some:'stuff' };
var newObject = _.clone(object);

Lo que me lleva a mi punto. Lo que está mal con las convenciones de variables de marcador de posición clásico.

var i, j, k, l; // iterator placeholders
var x, y, z, xx, yy, zz // value placeholders
var foo, bar, bas, fixx, buzz, qux, etc... // demonstration placeholders

¿Por qué usar una convención personalizada que algunos pueden malinterpretar cuando ya hay muchas convenciones comunes disponibles?


En Scala: es el símbolo comodín / marcador de posición, pero como marcador de posición solo puede referirse a él una vez .
Rex Kerr

@RexKerr Interesante. Siéntase libre de editar eso en la respuesta si lo desea. Lo haría pero no estoy familiarizado con scala.
Evan Plaice

Un comentario debería hacer. Cualquiera que use Scala lo sabría, y cualquiera que no use Scala probablemente no tendría la compatibilidad de Scala en la parte superior de su lista de razones para / no hacer algo.
Rex Kerr

Creo que usar uno de esos marcadores de posición de "convención" para variables no utilizadas sería una mala práctica, ya que me haría pensar, primero, "¿por qué demonios este tipo no nombró esto mejor?" y después de un tiempo descubriría que fue porque la variable no se usa.
igorsantos07

@ igorsantos07 Estoy completamente de acuerdo. Mi preferencia sería dar un nombre descriptivo, incluso para variables temporales. El objetivo de esta respuesta es demostrar por qué el subrayado no es una buena opción para una convención de nomenclatura; debido a su significado preexistente en muchos idiomas.
Evan Plaice

2

Yo uso "ficticio" para ese tipo de cosas. O "basura", si solo estoy probando algo :) Nombre sus variables para describir cuáles son. Si son variables ficticias, no utilizadas, asígneles un nombre como tal.


0

Me parece una mala práctica porque

  • no deberías tener una variable invisible en tu código. Si cree que debería, probablemente se debata la razón.

  • el lenguaje Go usa esta palabra clave para indicar que ninguna variable es el destino de uno de los múltiples retornos de una función. Si su idioma no tiene múltiples retornos, no es necesario. Su convención de nomenclatura le hará daño el día que usará un idioma usando _ como notación de idioma estándar.

(No sé Python: ¿es realmente necesaria esta construcción?)


2
Si lo usa para filtrar múltiples retornos, es consecuente también usarlo para argumentos de función ficticia. De hecho, no hay mucha diferencia entre los dos: en los lenguajes funcionales de coincidencia de patrones, puede escribir let (a,b,_) = f(x,y,z)tan bien como let f(x,y,_) = (g(x),h(x),g(y)), o lo que sea. - Y, sí, a menudo es útil tener parámetros ficticios: no como la única definición de una función, sino para una función polimórfica o una con definiciones alternativas de patrones coincidentes, a menudo es lo más natural.
Leftaroundabout

1
Su segundo punto contradice su punto principal: en Go, eso significa esencialmente lo mismo que "No tengo ningún uso para este valor".
Casey Kuball

0

Puede ser sintácticamente válido y puede estar bien como parte de un estándar.

Dicho esto, es algo que le pediría a alguien que cambie en una revisión de código. Tampoco lo pondría en un estándar de codificación, y trataría de eliminarlo de uno existente. Es simplemente más difícil de leer, y no es muy significativo.


0

Creo que está mal porque:

1) Es más difícil de ver ya que no hay muchos píxeles.

2) Si hay más de uno _, ¿cómo sabes cuál? ¿O que un nuevo desarrollador ha "seguido las reglas" y ha mantenido su uso extremadamente local en su alcance?

3) Es una práctica que no es útil. Usar nombres de variables de una sola letra es muy antiguo (es decir, ¡mi educación original!) Los veré ... y luego veré comentarios agregados para decir lo que hace el código y esa es una mala práctica en el mundo de hoy. Utilizo nombres largos de variables tanto como sea posible para que todos, independientemente del nivel de programación o la familiaridad con el código, puedan "leerlo" casi como el inglés. Usar nombres de 1 letra es una práctica extremadamente común con código antiguo y con programadores más antiguos (nuevamente, me incluye a mí), pero eso no lo hace correcto.


99
"cómo sabes cuál" no sabes : ese es exactamente el punto, no usas la variable. Por lo tanto, tampoco importa si _ya se usa en un ámbito externo; ese será sombreado (o lo que sea que haga su idioma en tales casos), pero ninguno de ellos se usa de todos modos.
Leftaroundabout

0

Para evitar colisiones en el espacio de nombres y permitir la depuración, en caso de que el nombre de la variable sea su única pista, podría ser mejor llamarlo "join_ab_unused".

Inspirado por Birfl.


0

Sí, es una mala práctica por dos razones:

  1. Prefijar una variable no utilizada con un guión bajo no es un estándar ampliamente aceptado. Es probable que se ignore a los "no iniciados".
  2. He visto algunas personas prefijar variables de miembros privados con un guión bajo, y su estándar confundiría en gran medida a esas personas.

0

Lo que intenta hacer es codificar en una versión más bonita de SQL que no tenga el problema de obligarlo a inventar un nombre para algo inútil.

El guión bajo es casi invisible, por lo que parece que estás en ese idioma. Si solo se pudiera utilizar un espacio en blanco como identificador, sería perfecto, ¿verdad?

Pero no estás en un idioma diferente, y lo que estás haciendo no es una manera limpia de hacer una extensión de idioma.


0

Depende del idioma. En Java , sí, esto es malo y puede ser una tendencia peligrosa para agregar a su código, en gran parte porque las herramientas que usan la reflexión no manejan los guiones bajos muy bien, ya que están fuera de las convenciones de nombres variables de Java. En python , esto también es malo pero no tan malo. En clojure , está 100% bien, y de hecho, es idiomático usar _'s como marcadores de posición en una declaración let.

Recuerde que cada idioma tiene su propia sintaxis completa y un conjunto de expresiones idiomáticas, por lo que debe evaluar lo bueno / lo malo en términos de estas expresiones idiomáticas, en lugar de en términos absolutos.


55
No estoy de acuerdo con que esta sea una mala práctica en Python. Es una convención ampliamente entendida
Daenyth

0

Esto sería malo en perl, que usa $ _ (y a veces _) como una variable especial.

En general, me mantendría alejado de él solo porque el _ parece ser una variable específica del lenguaje. Si vi su código, estaría en la documentación buscando lo que era _, hasta que me di cuenta de que era solo un muñeco. No hay nada malo con DUMMY, $ DUMMY, lo que sea.


0

Evitaría los guiones bajos al comienzo de los vars a menos que esté seguro de que no tienden a indicar algo más en un idioma o marco dado en uso intensivo. Por ejemplo, en Python, un doble subrayado tiende a indicar una var. En JQuery y otras bibliotecas JS, un solo guión bajo tiende a indicar una var de reserva para sobrescribir espacios de nombres. También es una convención de nomenclatura popular para incluir archivos que a su vez tienden a transferirse al código que maneja las inclusiones en forma var.

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.