Nombramiento descriptivo vs. 80 líneas de caracteres [cerrado]

17

Frecuentemente escucho estas dos valiosas prácticas de programación: (1) las líneas de código deben tener 80 caracteres o menos y (2) usar nombres descriptivos para variables, métodos, clases, etc. Sin embargo, entiendo el razonamiento de estas dos palabras de consejo. , a menudo parecen ser compensaciones entre ellos. Si mantengo mi código por debajo de 80 caracteres / línea, termino usando nombres menos descriptivos (especialmente en Python en el que cada sangría cuenta como 4 caracteres) pero si uso nombres más descriptivos, termino con líneas de más de 80 caracteres.

Entonces, mi pregunta es cuál de estos dos consejos es más importante cumplir si se debe hacer la elección. Me pregunto esto como un programador independiente (aficionado), pero lo más importante desde la perspectiva de un ingeniero de software que trabaja para una empresa más grande.

mjgpy3
fuente
44
@BillyONeal Con pantallas grandes, 120 :)
B 18овић
44
Creo que necesito al menos 130
9dan
8
Prefiero 80, porque puedo abrir fácilmente 2 archivos uno al lado del otro en mi computadora portátil.
Honza Brabec
55
Las líneas de más de 80 caracteres tienden a volverse ilegibles. Entonces 80 es un buen límite. Descriptivo no necesita ser demasiado detallado. Y depende del alcance: nombres de variables cortas de alcance pequeño, nombres más largos de alcance grande. Y, por supuesto, evite las variables con gran alcance. Si está en ello, use un lenguaje funcional y divida su código en funciones más pequeñas cuando sangra demasiado profundo -> alcance muy pequeño == nombres de variables cortos. Los nombres de las funciones son similares pero generalmente un poco más largos porque su alcance es mayor.
Peer Stritzinger el
44
@ ott--: ¿Has visto un editor, que en realidad puede romper una línea larga, de acuerdo con la sintaxis de C ++, y presentar la continuación con sangría un nivel más que el principio? De lo contrario, tal sugerencia es inútil.
Jan Hudec

Respuestas:

34

Mantenga pocas sangrías, sus nombres descriptivos, y no tenga miedo de romper una línea.

Mantenga sus sangrías pocas.

A menudo, cuando me encuentro en una lucha entre sangrías y nombres descriptivos, doy un paso atrás y miro mi nivel de sangría. Si sangra más de 3 o 4 niveles (2 niveles es automático e inevitable en muchos casos. Lea: definición de método de clase), es posible que desee reestructurar su código, abstrayendo la funcionalidad a una función o método.

Tus nombres descriptivos

Siempre debe mantener sus nombres descriptivos. Los nombres descriptivos crean código autodocumentado. Puede intentar acortar los nombres en algunos casos, pero la legibilidad es lo primero.

No tengas miedo de romper una línea

Mierda pasa. Si superas los 80 caracteres y no ves de ninguna manera para reclamar ningún espacio en la línea, divídelo. La mayoría de los idiomas no se preocupan por los saltos de línea, así que divídalos en múltiples. No solo elijas una ubicación aleatoria. Mantenga las cosas agrupadas lógicamente y sangra otro nivel cuando rompa la línea.

Craige
fuente
3
Cabe señalar que los nombres descriptivos no son lo mismo que los nombres largos. Evitar la repetición de cosas que se pueden ver fácilmente desde el contexto y un puñado de abreviaturas cuidadosamente elegidas (solo para los conceptos muy comunes) pueden recorrer un largo camino hacia nombres descriptivos cortos.
Jan Hudec
18

¿Por qué no los dos?

En primer lugar, "descriptivo" y "detallado" no son lo mismo. Por ejemplo, si está escribiendo un bucle bastante local, ies un nombre de variable muy bueno para la variable del bucle; current_iteration_index, aunque podría decirse que es más descriptivo y definitivamente más detallado, es mucho peor y no agrega ninguna información, porque el uso de icomo una variable de bucle es bastante universalmente aceptado, y no hay otro significado ique eso.

Los buenos nombres de variables son descriptivos, ya que un programador familiarizado con el idioma del lenguaje y las convenciones de la base de código puede adivinar fácilmente cuál es su papel, pero también son lo suficientemente concisos como para mantener las cosas compactas.

El límite de 80 caracteres, aunque originalmente era una consecuencia de las limitaciones técnicas de los terminales de texto de la década de 1970, todavía es valorado por muchos hoy en día, y aunque todavía hay razones técnicas (longitudes máximas de línea en algunos protocolos de red, especialmente relacionados con el correo electrónico), Las razones más convincentes son las psicológicas y sociales. Resulta que las longitudes de línea alrededor de la marca de 66 caracteres hacen la experiencia de lectura más cómoda para la prosa en lenguaje natural (el tamaño de la fuente curiosamente no hace mucha diferencia y, en consecuencia, tampoco lo hace la pantalla o el tamaño del papel); Los límites de línea de 80 caracteres están bastante cerca de eso, pero dado que la mayor parte de un fragmento de código típico suele estar sangrado al menos uno o dos niveles (lo que significa entre 4 y 16 caracteres, dependiendo de la configuración de sangría),

Otro efecto de apegarse a las líneas de 80 caracteres es que es un buen indicador de cuándo las cosas son demasiado complicadas. Las líneas tan largas generalmente son causadas por uno de los siguientes:

  • Funciones con una larga lista de argumentos; Esto no es algo agradable, ya que impiden la legibilidad y pueden causar fácilmente errores sutiles, por ejemplo, cuando las personas intercambian el orden de los argumentos de una manera que el compilador no detecta.
  • Expresiones complejas, a menudo encontradas en condicionales (por ejemplo if ((user.isLoggedIn && user.hasPermission(page.getRequiredPermission()) && !user.isBanned) || page.getRequiredPermission() == null)); esto también suele ser bastante difícil de descifrar, y el código debe reescribirse en algo más estructurado. Lo más probable es que la expresión haga demasiado y debe factorizarse en un método o función.
  • Literales largos utilizados en llamadas a funciones o expresiones, por ejemplo print(translate(LANG_EN, LANG_ES, "This is the home page. Feel welcome to click around and see what we have."));. Mueve el literal a una variable o constante; aún puede exceder la longitud de la línea, pero si lo hace de manera consistente, el lector puede ignorar al menos con seguridad la parte invisible de la línea, suponiendo que solo siga el resto del literal. O mejor aún, mueva los literales fuera del código a un almacén de datos externo (archivo, base de datos, lo que sea).
  • Declaraciones profundamente anidadas, por ejemplo, seis niveles de ifdeclaraciones en un método de clase (son 32 columnas de sangría para configuraciones típicas). Una vez más, la anidación profunda crea un código complejo y difícil de leer, y debe evitarse como la peste: en pocas palabras, la anidación profunda desborda la pila del cerebro humano mientras lee.

Todos estos son, en última instancia, síntomas de cosas que preferiría no tener en su base de código a largo plazo, y hacer cumplir los límites de 80 caracteres es una manera simple y agradable que ayuda a mantener baja la complejidad y la legibilidad. (Eso no quiere decir que no pueda escribir código perfectamente ilegible en 80 columnas: los diversos concursos de código de algo ofuscado son un claro contraejemplo).

tdammers
fuente
1
+1: Gran respuesta, excepto que no estoy de acuerdo con alejar los literales del código. Cuando sabes qué literal estás buscando, puedes buscarlo en recursos o código igualmente bien, pero cuando trabajas con el código y necesitas modificar el literal, tener que buscarlo en un archivo separado es una gran distracción. También tenga en cuenta que todos los idiomas tienen alguna forma de dividir literales en varias líneas, que es lo que haría en ese caso.
Jan Hudec
Por supuesto, la oración utilizada como ejemplo de literal largo no tiene lugar en el código fuente. Cosas como esta van en las plantillas de página. Pero para cosas como los mensajes de error, prefiero mantenerlos con el código que los emite.
Jan Hudec
@ JanHudec: Claro, mover los literales a un archivo de datos no siempre tiene sentido. Sin embargo, estoy hablando de literales demasiado largos, y con ellos, rara vez he visto una ocasión en la que definirlos en otro lugar hubiera empeorado el código: la longitud del texto es perjudicial para la lectura, mientras que el significado podría ser fácilmente condensado en un nombre constante o variable, que luego define en otro lugar. Los mensajes de error son una llamada de juicio, supongo.
tdammers
16

La denominación descriptiva es MUCHO más importante. En la mayoría de las interfaces podemos desplazarnos para ver líneas más largas. En ningún caso el sistema puede ayudarlo a traducir variables y funciones mal nombradas.

Matt S
fuente
2
Esta. Deja de romper líneas en caracteres X, deja que el IDE se encargue de eso. De lo contrario, molesta a todos los demás usuarios (¡incluido el futuro!) Cuyas pantallas / IDE pueden manejar 2 * caracteres X con código que ya no cabe en una página.
Konerak
44
Sin embargo, la pregunta era implícita sobre nombres largos . Y no estoy de acuerdo con que los nombres sean largos, la mayoría de las veces deben ser cortos . ¡Los nombres largos y descriptivos pueden hacer que el código sea más difícil de leer que los nombres ligeramente menos descriptivos pero más cortos! (Las líneas demasiado largas son generalmente difíciles de leer.)
Konrad Rudolph
44
Estoy en desacuerdo. Si no puedo ver el código de una vez, es difícil de leer, sin importar cuán descriptivos sean los nombres.
Jan Hudec
4

80 caracteres por línea no es difícil de cumplir, incluso los nombres son largos porque hay muchas formas de dividir una sola línea de código largo en múltiples códigos cortos, por ejemplo, puedo dividir una declaración de condición en C en varias líneas para que quepan en menos de 40 caracteres,

if ( a == b || c == d  || d == e
    || c == e || c == a || c == k
    || c == l)

También puede dividir una línea de llamadas de funciones en varias líneas también.

Por lo tanto, ambas reglas de nomenclatura descriptiva y 80 líneas de caracteres no tienen contradicción, pueden coexistir para mejorar la legibilidad.

neo
fuente
2
¿80 caracteres realmente mejoran la legibilidad? ¿Qué pantalla no puede hacer 120 fácilmente en estos días?
Billy ONeal
77
@BillyONeal es más fácil escanear más de 80 de ancho que de más de 120
fanático del trinquete
2
el periódico se divide en columnas, y puede obtener más información en ux ux.stackexchange.com/questions/3618/…
neo
1
Romper una condición lógica mejora la legibilidad cuando los saltos de línea corresponden a la estructura de la condición, pero no necesariamente si solo corresponden a algún límite arbitrario.
mikołak
1
@BillyONeal: la mayoría de las pantallas pueden hacer 120, pero casi ninguna puede hacer 240. ¿O nunca compara las diferencias?
Hubert Kario el
0

El límite 80 es algo que debería haberse incrementado hace mucho tiempo. Tenga en cuenta que este límite se utiliza desde la edad en que la longitud de cada identificador se limitaba a 8 caracteres y solo una fuente en la pantalla / impresora. No hay posibilidad de cambiar el tamaño de fuente.

Dios, tenemos diferentes pantallas y tecnología de impresión ahora. Tenemos lenguajes de programación muy diferentes. Ya no hay razón para usar 80 caracteres. Aumentarlo a 120 caracteres al menos.

Incluso entonces no debería ser un límite difícil. ¿Vas un personaje por encima de la línea? Bueno, no pasa nada!

Editar:

Respuestas detalladas sobre la historia del límite de 80 caracteres

Caracteres por línea en Wikipedia

Un estudio en la Universidad Estatal de Wichita descubrió que la CPL solo tenía pequeños efectos sobre la legibilidad, incluidos los factores de velocidad y comprensión. Sin embargo, cuando se les pidió preferencias, el 60% de los encuestados indicó una preferencia por las líneas más cortas (35 CPL) o más largas (95 CPL) utilizadas en el estudio. Al mismo tiempo, el 100% de los encuestados seleccionó una de estas cantidades como la menos deseable.

Sulthan
fuente
44
No, el límite definitivamente no debe aumentarse. Debido a que no tiene nada que ver con la tecnología de la pantalla y la impresión, solo el hecho de que 80 caracteres por línea es aproximadamente el máximo del ojo humano puede escanear cómodamente (66 caracteres se consideran el ancho de línea óptimo, menos en la impresión de varias columnas). Lo que, por cierto, significa que la mayoría de los libros tienen un poco menos de 80 columnas para muestras de código.
Jan Hudec
3
@ JanHudec Tiene todo que ver con la tecnología de pantalla / impresión. Consulte programmers.stackexchange.com/questions/148677/… . La decisión de elegir 80 personajes es puramente histórica, no basada en estudios. ¿Podría agregar enlaces a los estudios para confirmar su opinión?
Sulthan
Otra pregunta ya tiene este enlace UX en sus comentarios; más referencias allí. Si bien el número 80 en sí mismo es una coincidencia histórica, se deriva aproximadamente del número de huelgas por línea en las máquinas de escribir, que se deriva más o menos del ancho común de la impresión de una sola columna y el promedio de 66 letras fue una tradición establecida desde hace mucho tiempo.
Jan Hudec