"// ..." comenta al final del bloque de código después de} - ¿bueno o malo? [cerrado]

18

A menudo he visto que se usan tales comentarios:

function foo() {
   ...
} // foo

while (...) {
   ...
} // while

if (...) {
   ...
} // if

y a veces hasta

if (condition) {
   ...
} // if (condition)

Nunca he entendido esta práctica y, por lo tanto, nunca la apliqué. Si su código es tan largo que necesita saber cuál es este final, }entonces tal vez debería considerar dividirlo en funciones separadas. Además, la mayoría de las herramientas de desarrollo pueden saltar al soporte correspondiente. Y finalmente, lo último es, para mí, una violación clara del principio DRY; si cambia la condición, también deberá recordar cambiar el comentario (o de lo contrario podría ser complicado para el mantenedor, o incluso para usted).

Entonces, ¿por qué la gente usa esto? ¿Deberíamos usarlo o es una mala práctica?

gablin
fuente
En PHP, uso la sintaxis alternativa para las estructuras de controlif(condition): ... else: ... endif;
systemovich
@Geoffrey van Wyk, ¿en serio? Nunca he visto a nadie usarlos fuera de los archivos de plantilla. Son extremadamente poco estándares, pero cada uno es suyo, supongo.
Craige
44
@Craige: Cualquier construcción de lenguaje soportada nativamente por PHP no es "Extremadamente no estándar": el intérprete de PHP define qué es "estándar".
Billy ONeal
Ada tiene marcadores específicos para el extremo de la mayoría de las construcciones: if ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;. Creo que ayuda a la legibilidad (y el compilador lo verifica, cuyos comentarios no lo son).
Keith Thompson

Respuestas:

32

Diría que si su código es tan largo que no puede seguir fácilmente sus llaves, su código necesita una refactorización, para la mayoría de los idiomas.

Sin embargo, en los lenguajes de plantillas (como PHP) podría ser válido, ya que podría tener un gran bloque de HTML que separa el principio y el final de la condición o la estructura del bucle.

Matt Ellen
fuente
55
Punto completamente válido para PHP, si está utilizando PHP mezclado con Html. 1 punto para Gryffindor.
3
Incluso con PHP como lenguaje de plantillas mezclado con HTML, aún puede aplicar sangría. Tampoco debe usar llaves cuando use PHP como lenguaje de plantillas, sino más bien las construcciones while(): endwhile;y foreach(): endforeach;etc.
Htbaa
99
Realmente no veo por qué no deberías refactorizar el PHP. Probablemente a otro idioma.
Tom Hawtin - tackline
@Htbaa: No puedo creer que haya estado usando PHP todo este tiempo y no supiera sobre eso. ¡Gracias! Con respecto a la sangría, prefiero mantener el HTML condicional sangrado igual que el resto de la página, en lugar de estar en línea con el PHP que lo está creando.
Matt Ellen
3
@ Tom: me reí, pero me siento culpable. : P
17

Es un olor a código y generalmente una resaca del estilo de código antiguo. Antes, la refactorización de IDEs decentes era más difícil y no tan común como lo es ahora, por lo tanto, los métodos eran más largos y estos comentarios estaban allí para ayudarlos a navegar mejor.

Alba
fuente
15

Esta es una práctica horrible hecha obsoleta por muchos factores.

  • Los IDE más modernos resaltan la llave correspondiente cuando el cursor está en cualquiera de los símbolos.
  • Si está codificando limpiamente, rara vez encontrará un lugar donde su método tenga más de 10 líneas.

Noto que muchos programadores de Java tienen esta mentalidad, y hace que el código de Java se vea realmente sucio y desvía la atención del código hacia los comentarios.

Muy recomendable en contra de usar esto.


fuente
44
Tengo un compañero de trabajo (desarrollador de Java) que hace esto. Excepto en lugar de // para y // si usa // rof y // fi. Me vuelve loco y lo hace en todas partes.
Jay
Sí, tuve uno que insistió en ello. AAAAAGHHHHH.
Plataforma
2
Esto realmente no tiene nada que ver con los programadores de Java o Java, y no es algo común o de hecho de hecho cuando se programa en Java.
Jesper
1
+1,000 por "es una práctica horrible".
scunliffe
6

El código se lee 10 veces más de lo que está escrito.

Si hace que sea más fácil de leer, hazlo.

También le sugiero a cualquiera que haga esto que busque otras formas de facilitar la lectura. Las técnicas de refactorización, corchetes en diferentes líneas, etc. que otras personas han mencionado son buenas. También es bueno dividir las cosas en diferentes funciones, métodos o clases para que el código se auto-comente. También hay formas de eliminar la mayoría de los "si" y poner bucles "for" en lugares obvios, eliminando así la necesidad de todo esto.

Pero, a veces las personas están aprendiendo. Si esto es algo que están haciendo, realmente está haciendo que el código sea más legible, aliéntelo y luego aliente también algunas otras prácticas. Las personas que están aprendiendo merecen y se beneficiarán del estímulo, independientemente de cómo empiecen. Decir "Esto es malo" no es tan útil como decir "Esta otra cosa es mejor".

Lunivore
fuente
66
Esto es malo Incluso los libros de texto de nivel principiante no hacen esta atrocidad. "El código se lee 10 veces más de lo que está escrito" ... razón más para no perder el tiempo del lector con este código.
Thomas Eding
@trinithis ¿Qué sucede si tiene una declaración de cambio de 20 casos? A veces es necesario admitir 20 opciones diferentes, y es mejor reunirlas en un solo lugar que "refactorizarlas" en algún esquema de toma de decisiones de varios niveles.
quant_dev
Creo que esta es una práctica de codificadores que subestiman a sus compañeros :) que otros no son lo suficientemente inteligentes como para leer el código a menos. En general, estoy en contra de esta práctica, pero está bien si alguien lo hace porque hay una jungla de cosas que lo hace difícil de leer. No hago eso de todos modos!
WinW
1
@trinithis No se trata de si es malo o no, se trata de formas efectivas de ayudar a las personas a mejorar para que puedan crecer. Ser efectivo> tener razón. También es una cosa perfectamente sensata si, por ejemplo, está refactorizando el código heredado que es aún más complicado. A veces, las cosas malas pueden dar mejores pasos provisionales y conducir a algo aún mejor que eso.
Lunivore
1
@trinithis Lo siento, no puedo entender a qué te refieres cuando todo está en una línea como esa. Creo que mencioné que también hay otras formas de refactorizar el código que los desarrolladores que hacen esto podrían aprender.
Lunivore
4

Tengo una base de código grande (C ++) llena de este tipo de cosas:

int Class::AccessorMethod(void)
{
    return privateValue;
}//end AccessorMethod

Para algo tan pequeño, diría que esto va más allá del "olfato del código" al "hedor del código". Especialmente en un IDE donde puedo hacer coincidir la llave de cierre con una pulsación de tecla para encontrar la llave de apertura. Dado un método más largo, aún tomaré la combinación de llaves sobre el comentario del terminal. Tales comentarios me distraen, y tiendo a pensar en ellos como ruido.

PSU
fuente
Um, supongo que no obtengo algo del formato en este sitio; cada abrazadera debe estar en su propia línea, al igual que el cuerpo del método.
PSU
En C ++, aunque a menudo abriré un espacio de nombres anónimo en la parte superior para cosas de implementación ocultas. Luego, en algún momento, cierro esta llave y es útil saber qué significa aquí.
CashCow
4

En C ++ hay dos remanentes en los que esto sigue siendo útil y el consejo de "dividir el código" no es necesario:

  1. Para espacios de nombres. Un espacio de nombres puede abarcar un archivo completo, y ese último corchete a veces puede desanimar a las personas, por lo que agregar un comentario para indicar que el corchete es el cierre de un espacio de nombres es útil. Para el estilo de codificación particular en mi empresa, esto es importante porque no sangramos espacios de nombres, ya que se decidió que dicha sangría solo desperdiciaría espacio en un archivo.

  2. Para pares #ifdef / #endif. A veces hay mucho código allí para la compilación condicional, puede ser desagradable con la anidación, y el editor que usamos a menudo "con ayuda" elimina la sangría, por lo que los comentarios son útiles durante una descripción general rápida.

Joris Timmermans
fuente
+1 para el comentario del espacio de nombres y las razones. Esa es la única vez que hago esto y por la misma razón
JohnB
+ declaraciones de cambio largas.
quant_dev
1

Para mí, el código tiene que ser confuso para agregar un comentario como el que especificó.

Si solo dice // Declaración IF. Entonces tienes que preguntarte por qué está allí en primer lugar.

TéBeberGeek
fuente
Estoy de acuerdo, parece una línea que ha sido comentada, en lugar de una vieja escuela//endif
StuperUser
1

La alternativa a ver qué está cerrando su aparato ortopédico es tener el que se abre en la misma columna que el que está cerrado. Me parece mucho más claro y más legible.

El comentario es útil cuando normalmente sería difícil de rastrear porque la apertura ocurrió hace mucho tiempo. Esto normalmente debería ocurrir solo para un espacio de nombres (particularmente el anónimo en C ++, usado para detalles de implementación en la unidad de compilación). En la mayoría de los otros casos, debería ser obvio lo que está cerrando.

CashCow
fuente
1

Esto es en gran parte un remanente de los viejos tiempos de trabajar en ventanas de terminal de 80x24 caracteres, especialmente si estaba usando un editor de ventanas como EVE. Incluso ahora, hago la mayor parte de mi trabajo en una sesión de terminal usando vim, y puedo dividir la sesión en tres o cuatro subventanas, por lo que solo puedo ver algunas líneas a la vez.

Dicho esto, nunca me entusiasmó la convención, a pesar de que me hubiera salvado el tocino en más de una ocasión. Solo lo veo como ruido. Si sus bucles o condicionales se están haciendo tan grandes, sí, es posible que desee considerar la refactorización.

John Bode
fuente
0

Básicamente, da todas las razones válidas para no usar esto Todo programador decente debería aplicarlos. Entonces, ¿por qué la gente lo usa? Porque lo están haciendo mal y no lo saben mejor.

stijn
fuente
erm, explique el voto negativo por favor. No solo inventé esta respuesta, surge de una experiencia de la vida real: mi colega que está sentado a un par de metros a mi lado ha estado programando para más de 10 oídos así y no tenía idea de por qué esto está mal hasta que le expliqué .
stijn
¿Posiblemente se usó en algún libro de texto para que un montón de personas salieran de la universidad usándolo? Podría tener un lugar en un texto introductorio. También razonablemente válido en un preprocesador, especialmente en # ifdef / endif incluye guardias
Martin Beckett