¿Existe algún método para diferenciar los comentarios informativos del código comentado?

38

Durante el transcurso de la programación, terminarás con algunos comentarios que explican el código y algunos comentarios que eliminan el código:

// A concise description 
const a = Boolean(obj);
//b = false;

¿Existe un buen método para analizar rápidamente cuál es cuál?

He jugado con el uso de 3 /y /** */para comentarios descriptivos.

También he usado un complemento VSCode para resaltar //TODO:y//FIXME:

As
fuente
2
Como nota, ///y /** ... */los comentarios también son utilizados por algunos generadores de documentación, como Doxygen o jsdoc. Si los usa o herramientas similares, es posible que no pueda usar ese tipo de comentarios para comentarios descriptivos que no pretenden ser parte de la documentación.
Justin Time 2 Restablece a Monica el
1
En javascript, la mayoría de las líneas de código probablemente terminarán con un punto y coma. A menos que sus comentarios lo hagan, eso parece bastante simple, y también puede escribir un script para verificarlo fácilmente;
Artemis Fowl

Respuestas:

189

Hay una solución muy simple para esto: eliminar el código comentado.

Realmente, solo hay dos buenas razones para comentar el código: para probar algo / hacer una solución, o para guardar el código que podría usar más adelante. Si está probando o arreglando algo, elimine el código comentado tan pronto como haya terminado con la prueba o la corrección. Si está guardando el código que podría usar más tarde, conviértalo en un código de primera clase y póngalo en algún lugar, como una biblioteca, donde se pueda utilizar.

Robert Harvey
fuente
108
Además, si el código se ha registrado: simplemente elimínelo. Si alguna vez lo necesita, el control de la fuente lo tiene cubierto
marzo
38
Cuando se elimina el código, nadie se da cuenta de que alguna vez existió. Eso hace que sea más difícil recuperarse. Hay un valor en dejar el código comentado, especialmente si parece probable que se use en el futuro.
usr
76
@ usr: cuando se elimina el código, nadie se da cuenta de que alguna vez existió , y según mi experiencia, en el 99% de los casos del mundo real eso es lo correcto. En el 1%, puede haber algún valor en las líneas comentadas, sin embargo, si el código comentado permanece durante varias semanas o meses (o más), hay muchas posibilidades de que ni siquiera se compile debido a las refactorizaciones del activo líneas de código El argumento del "valor ponderal para usos futuros" a menudo se usa como una excusa equivocada para las personas que tienen un problema emocional de quitar las cosas de la base de código para las que habían invertido algunas horas de trabajo mental.
Doc Brown
21
Nunca confirmo código comentado sin comentarios explicativos adicionales. Hay situaciones raras en las que es posible que desee recuperar el código en el corto plazo, pero cada una de ellas es excepcional y requiere una explicación para futuros desarrolladores (o futuros). El 90% de mis comentarios son "Eliminados porque parece no estar usado. Eliminar después de noviembre de 2021 si no hay problemas"
James Beninger,
31
Mi colega una vez dijo "Había código aquí que hacía X pero lo eliminé" cuando eliminamos alguna característica por el momento. Eso funcionó muy bien; sabías que estaba en el historial de origen de ese archivo, pero no te estaba molestando.
Erik
45

Agregando a la excelente respuesta de @ RobertHarvey, creo que solo hay una razón legítima que he encontrado para guardar el código comentado en el control de origen, incluso temporalmente: en caso de código de reemplazo no obvio que no debería o no puede usarse en este momento por alguna razón . Incluso entonces, la mayor parte del comentario debería ser la explicación, no el código de reemplazo. Esto podría ser un error o una característica del lenguaje que aún no se considera estable. Podría verse más o menos así:

# TODO: Replace with `foo = frobnicate(bar)` once <link.to/bug> is fixed
foo = [some complex workaround]

En este caso, el trabajo ya se ha realizado, pero aún no puede aprovecharlo, por lo que eliminarlo significa que alguien tendría que redescubrirlo más tarde. Lo mismo ocurre con soluciones subóptimas que pueden parecer superiores a primera vista o compensaciones conscientes contra soluciones similares .

Precaución: no ensucies tu código con soluciones alternativas. Cada tarea se puede hacer de infinitas maneras diferentes, y no es rentable explorar este espacio durante mucho tiempo para cada cambio. Las revisiones de código pueden ser un buen lugar para descubrir esos comentarios faltantes, cuando su colega sugiere una mejora que ya ha descubierto que no es óptima.

l0b0
fuente
2
La otra cara de esto es que a veces necesitas explicar por qué no estás usando frobnicate(bar), para que nadie venga e intente "arreglar" tu código "poco elegante". Entonces les demuestras que sabes que en un mundo perfecto, la frobnicatefunción sería el camino a seguir, pero sabes por experiencia dolorosa que no funciona correctamente. Puede no haber ninguna expectativa de que el tercero lo considere un error, y mucho menos vale la pena arreglarlo; aún necesita dejar un comentario a los futuros programadores (incluido usted mismo) sobre por qué no adoptó el enfoque obvio.
Monty Harder
3
Una situación relacionada es que puede haber dos formas de hacer algo, una de las cuales procesará datos válidos mucho más rápido que la otra, y una de las cuales ofrecerá diagnósticos más útiles si, por alguna razón, recibe datos no válidos. Si el programa es parte de un proceso que solo debe alimentar datos que están "garantizados" para ser válidos, pero algo en el proceso no funciona correctamente, tener disponible una versión que es más lenta, pero ofrece mejores diagnósticos, puede hacerlo mucho más fácil determinar qué está pasando mal.
supercat
20

Hmm, leí esta pregunta un poco diferente de Robert, quien afirma correctamente que el código comentado debería eliminarse.

Sin embargo, si está buscando una convención para marcar el código para su posterior eliminación, un viejo favorito mío es:

//b = false; //TODO: remove

Algunos //TODO:comentarios de bandera del IDE o se les puede enseñar. Si no, generalmente es una cadena de búsqueda. Es mejor seguir cualquier convención que su tienda haya establecido porque esto se puede hacer de varias maneras. Cada código base debe hacer esto de una manera. Lo mantiene investigable.

analizar rápidamente cuál es cuál?

Sin esa marca, la forma automática de hacerlo es con el compilador. Si quitar el comentario produce un código que se compila, debe haber sido un código comentado. Escribir un complemento IDE que compruebe que no sería difícil. Pero dejará atrás el código comentado con errores.

Es por eso que es mejor marcar simplemente el código comentado como código en el momento en que lo comenta. Esto le permite trabajar de manera no destructiva mientras decide si realmente quiere que desaparezca. Como todos somos interrumpidos y somos algo olvidadizos, no se sorprenda si algunas líneas se registran mientras están en ese estado. Si lo hacen, es bueno que al menos estén claramente marcados y se puedan buscar. Las macros de teclado me han ayudado con esto en el pasado. Es difícil que te interrumpan en medio de esto si puedes hacerlo con una sola pulsación de tecla.

Puede llevar esto hasta el punto de consagrar la marca en sus pruebas de integración continua. Vaya, estoy tratando de registrarme con TODO pendientes nuevamente.

naranja confitada
fuente
En lugar de ver si los comentarios se compilan para etiquetarlos como código, puede ejecutar los comentarios a través de un procesador de lenguaje natural y etiquetar los que se analizan como una oración o frase nominal en el idioma que habla su equipo.
TheHansinator
3
@TheHansinator eso suena bien, pero mi experiencia con la relación de autocorrección de mis teléfonos celulares con mi jerga del codificador me hace cauteloso.
candied_orange
Me imagino que la PNL utilizada para analizar los comentarios de código sería mucho mejor que la PNL que permite la autocorrección, simplemente porque la computadora tiene toda la oración para trabajar y no está tratando de corregir los errores ortográficos. Sin mencionar que el falso negativo también es mejor aquí: siempre que un humano pueda revisar el comentario antes de eliminarlo, solo puede volver a escribir el comentario, en lugar de no ser alertado de inútil gobbledygook.
TheHansinator
3
wrt parsing: double buffer (flip on)-> C prototype or ultra-terse English? no se puede decir sin contexto, no es una construcción completa correcta en ninguno de los dos idiomas. Algunos falsos positivos y negativos son inevitables, cuando los comentarios por su naturaleza no limitan la forma de su contenido en ninguna dirección.
Leushenko
8

Utilizo directivas de preprocesador para eliminar código, no comentarios en absoluto:

//comment
active_code();
#if FALSE
inactive_code();
#endif

Esto hace que sea muy fácil de buscar, y mi resaltador de sintaxis lo trata como un comentario. Incluso puedo colapsarlo en una sola línea:#if FALSE(...)

Puede ampliar esa idea para tener varias opciones:

#if OPTION == 0
code_for_option_0();
#elif OPTION == 1
code_for_option_1();
#else
code_for_all_other_options();
#endif

Y comprobación de errores en tiempo de compilación:

#if FOO >= 5
#error FOO should be less than 5!
#endif

Por supuesto, no quiere exagerar en esto, o se hace difícil saber qué se está compilando realmente y qué no. Pero se entiende la idea, y de todos modos es el mismo problema que para el código comentado ... siempre que solo lo use estáticamente. Si sus condiciones son dinámicas, es peor.


Para determinar cuál es cuál en una base de código existente que no consideró este problema en absoluto, no creo que haya una solución universal. Tendrá que buscar patrones usted mismo y probablemente codificar una expresión regular para encontrarlos.

AaronD
fuente
¿Para qué sería bueno esto? ¿Necesitas compilar múltiples versiones?
Tvde1
@ Tvde1 Esa es una posibilidad, y una pesadilla potencial si no lo manejas realmente bien. Pero la alternativa es posiblemente peor. Si tiene varias copias de casi el mismo código, una para cada variación de un tema común, debe mantenerlas por separado y mantenerlas sincronizadas.
AaronD
Hay varias formas de hacer esto, pero todas tienen alguna variación del problema de configuración compleja o del problema de copia independiente: ¿Está seguro de que una corrección de error llegó a todas las copias independientes? ¿Qué pasa si no, y se agrega otra función, que luego se rompe por la corrección de errores que se conocía antes de la función pero que no se ha portado hasta ahora?
AaronD
3
Eso sólo funciona si usted tiene una etapa de pre-procesamiento como C. La cuestión es sobre javascript. Podría hacer un preprocesamiento, pero va a ampliar las capacidades del sistema de compilación y tampoco es estándar. Si no tiene un sistema de compilación o el sistema de compilación no admite el análisis y la ejecución de código, no podrá implementar esta solución. Finalmente, ni siquiera aborda la pregunta: el código comentado no es estrictamente equivalente al código que se activa condicionalmente. Podría ser un sobrante que no está destinado a ser habilitado.
VLAZ
La activación condicional es solo una extensión de la respuesta y no la respuesta en sí. De lo contrario, lo editaría para incluir los comentarios que lo extienden aún más.
AaronD
4

Estoy de acuerdo con la respuesta que indica que el código antiguo debe eliminarse en lugar de comentarse cuando sea posible, sin embargo, he observado una convención para las pocas ocasiones en que se necesita un código comentado.

(Mi base es C # pero esto se puede aplicar a cualquier lenguaje de sintaxis C, por ejemplo, Java)

// An explanatory comment has a space between the comment marker and the content.

// The following lines are commented out code so do not have the space (except where indented).
//var a = something();
//if(a==2) {
//   doSomethingElse();
//}
IanF1
fuente
2
Esto depende totalmente del estilo: cuando comento el código, generalmente agrego el //a la primera columna, y dado que prácticamente todo el código está sangrado, el resultado es casi siempre que el comentario comienza con algunas pestañas. Los comentarios normales no obtienen un espacio inicial de mi parte, a menos que ya haya otros comentarios con un espacio principal en la vecindad. Entonces, su método fallaría abismalmente en los comentarios que produje, y cualquier método diseñado para reconocer mis patrones de comentarios fallaría abismalmente en los suyos.
cmaster
@cmaster Ah, ya veo, creo que entendí mal la pregunta. Proporcioné una forma simple de formatear los comentarios de tal manera que puedan analizarse fácilmente para el tipo, que no es lo que se solicitó.
IanF1
2

Todavía estoy interpretando la pregunta de manera diferente, pensando que quieres encontrar el código comentado.

El código de estilo C seguramente tendrá punto y coma, mientras que es poco probable que los comentarios tengan punto y coma. Entonces, para el código comentado de una sola línea, puede usar esta expresión regular:

\s*\/\/[\s\S]*;

Para el código comentado de varias líneas, podría ser

\/\*[^\;]*;[^\;]*\*\/

Tenga en cuenta que Visual Studio es un poco peculiar sobre los saltos de línea en las expresiones regulares, no cuentan como espacios en blanco, debe especificar un \ n explícito.

Martin Maat
fuente
2

Si usa un editor con un compilador que se ejecuta en segundo plano (como Xcode y Clang), puede intentar compilar el texto del comentario. Por ejemplo, "una descripción concisa" da errores, "b = falso;" no. A continuación, puede utilizar diferentes resaltados de sintaxis.

Un método más simple sería un complemento IDE que use algunas heurísticas, como palabras múltiples en una fila que no sean palabras clave, puntos para comentarios, coincidencia con punto de rizado para código, etc.

gnasher729
fuente
1

Otras respuestas han cubierto variaciones sobre el tema "no comentar código". Pero a veces todavía lo quieres como referencia.

Si realmente necesita el código para quedarse, una mejor solución es rodear el código con "#if 0 ... #endif", idealmente con un comentario para decir por qué. Esta es la estrategia recomendada de varios estándares de codificación, incluido MISRA.

Graham
fuente
-3

Simple, al menos para mí, y en C / C ++. Los comentarios incluidos en / * * / son informativos. El código de prueba que se elimina temporalmente se comenta con //.

Y hay buenas razones para dejar el código de prueba en el archivo pero comentado, al menos en el tipo de trabajo que hago. Tarde o temprano, alguien querrá hacer un cambio, que necesitará ese código. Descomentar un bloque toma un comando de editor, al igual que volver a comentarlo cuando haya terminado.

jamesqf
fuente
También hay #ifdef __DEBUG ... #endif, o cualquier definición personalizada que quieras usar. __DEBUGSin embargo, es bueno, porque a menudo solo tiene que cambiar la configuración del proyecto para obtenerlo. Pero la mayoría de los IDE también le permiten definir sus propias configuraciones, lo que puede brindarle cualquier cosa en ese lugar.
AaronD
¿Qué quiere decir con "código de prueba"? Pruebas unitarias? Esos no deberían comentarse en absoluto, sino mantenerse en el conjunto de pruebas y ejecutarse con la mayor frecuencia posible, independientemente de si alguien cree que es necesario. Claro, es fácil volver a dejar de comentar un fragmento de código, pero es aún más fácil no hacer nada en absoluto y tener el conjunto de pruebas ya en funcionamiento para hacerlo ...
Leftaroundabout
1
Argh, no hagas eso. Al comentar el código "para probar algo" funcionará perfectamente bien 99 de cada 100 veces ... y en el único caso, se olvidará de eliminarlo (si ya no es necesario) o, lo que es peor, se olvide de descomentarlo ( si es necesario) y las cosas pueden ponerse feas.
CharonX
@leftaroundabout: No, me refiero a cosas como las declaraciones printf puestas para verificar los valores.
jamesqf
@jamesqf nunca deberías necesitar ese tipo de cosas, para eso está el depurador. Pero incluso si usa printf/ couto similar para obtener el código recién escrito correctamente (lo cual admitiré que lo he hecho en el pasado), realmente no es muy efectivo dejarlos allí. Si alguien quiere hacer cambios y sabe sobre qué variables necesita información, es rápido y fácil escribir los printfmensajes de nuevo, mientras que si ese desarrollador no sabe lo que se necesita y simplemente descomenta todas esas printfdeclaraciones, entonces la gran franja de texto en la terminal probablemente tampoco los ayudará.
Leftaroundabout