Cómo resolver el problema de los comentarios anidados


23

Aparece no solo en un idioma que los comentarios no se pueden anidar. ¿Tienes una buena solución para este problema? Una solución alternativa en C / C ++ y Java es usar solo el comentario de una sola línea, pero resulta imposible comentar un bloque más grande. Estoy enfrentando algo como esto:

</li><!--
                <li><!-- Save -->

Entonces debo revisar y editar los comentarios manualmente. ¿Puede aconsejar cómo debemos manejar esto, en muchos idiomas? No estoy seguro, pero ¿quizás Python tiene una solución para esto con la '''forma en que podría incluir un #comentario en Python? ``


44
Creo que solo los editores pueden ayudarlo allí. Sin embargo, IDLE bloqueará los comentarios en Python IIRC.
Erik Reppen

77
Python no tiene comentarios de bloque . Los '''y """son literales de cadena . Sucede que el intérprete los evaluará durante la compilación (para bytecode) y reconocerá los literales de cadena como no-ops (por lo tanto, no ralentizan el tiempo de ejecución / carga de bytecode). Las cadenas de documentos, es decir, los literales de cadena justo después de un defpero antes del cuerpo, no se eliminan, ya que el intérprete supone que proporcionan documentación para la función.
Bakuriu

77
En C / C ++ si desea eliminar secciones grandes, use #if 0<code> #endif. Así que esto no es realmente un problema. Usar comentarios para hacer esto es la herramienta incorrecta.
Martin York

1
Cambié a usar solo comentarios de línea hace mucho tiempo (siempre y cuando no esté forzado, por ejemplo, Javadoc). Por supuesto, necesita soporte del editor (o al menos modo columna).
ziggystar

Respuestas:


46

La mejor solución es, obviamente, simplemente no anidar sus comentarios. Los comentarios anidados suelen ser una señal de que está utilizando comentarios incorrectos. El ejemplo más común es el código comentado que contiene comentarios en sí, y la solución es eliminar el código en lugar de comentarlo.

Dicho esto, muchos lenguajes de programación tienen más de un tipo de sintaxis de comentarios, y puede usar este hecho para anidar al menos un nivel de profundidad. Por ejemplo, en Java:

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

Además, en muchos idiomas, al menos un tipo de comentario es anidable; en lenguajes tipo C, los comentarios de línea dentro de los comentarios de línea se ignoran:

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

La mayoría de los IDE admiten comentar bloques completos de código con comentarios de línea en una sola acción, y manejan este tipo de estilo de comentario correctamente. El mismo ejemplo en Python:

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

A menudo, los estándares de codificación para un proyecto en particular tienen reglas sobre qué estilo de comentario usar cuando; una convención común es usar comentarios de bloque ( /* */) para la documentación del método y la clase, y comentarios en línea ( //) para comentarios dentro de los cuerpos de los métodos y tales, por ejemplo:

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

Con tal estilo, es poco probable que alguna vez necesite anidar /* */comentarios (si tiene que deshabilitar temporalmente métodos o clases completos, renombrarlos funcionará igual de bien, si no mejor); y //los comentarios hacen nido, al menos con un poco de ayuda de su IDE.

Finalmente, para deshabilitar el código, tiene otras opciones en muchos lenguajes de programación; por ejemplo, en C, puede aprovechar el preprocesador:

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

En lenguajes dinámicos, a menudo puede usar simplemente ifdeclaraciones regulares en su lugar:

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

Sin embargo, a diferencia del ejemplo de CPP, esta estrategia requiere que el archivo fuente en su conjunto sea sintácticamente válido, por lo que no es tan flexible.

Y finalmente, hay al menos algunos idiomas que permiten comentarios anidados. En caso de que le interese, wikipedia tiene una buena tabla de comparación .


2
¿alguna variante de SQL permite comentarios anidados?
Xavier Combelle

3
+1 para// And now for something completely different...
Vorac

1
@Vorac: me alegra que te guste la referencia: D
tdammers

18

C y C ++ tienen comentarios de bloque anidados:

#if 0
#endif

Muchos editores destacados lo entienden como un comentario y muchos otros al menos lo resaltarán como cualquier otro código condicionalmente deshabilitado.

En muchos otros idiomas debe confiar en el soporte del editor. Para los idiomas que solo tienen comentarios basados ​​en líneas (perl, python, ruby, shell ...), es bastante simple anteponer el carácter del comentario a todas las líneas en un rango, por lo que la mayoría de los editores pueden hacer esto. Todavía puede decir cuáles fueron los comentarios antes de comentar todo el bloque porque el carácter del comentario se duplica; hacerlo simplemente es una ventaja aquí.

XML y SGML es probablemente el mayor dolor, su definición de comentarios es simplemente estúpida. Los comentarios habrían sido triviales para anidar, pero no solo no, sino que está completamente prohibido tener --comentarios internos. Desafortunadamente, no sé qué editores tienen un buen soporte para comentar en SGML / XML.


2
Nunca pensé en usar esas directivas de preprocesador como comentarios reales. Interesante, también para C #, pero en ese caso, tendrías que hacer algo como lo #if _que funciona bien y se atenúa en mi VS con Re #. Buen consejo!
Mueca de desesperación

2

Si bien no es una solución general, y ciertamente no es la ideal, una forma de abordar este problema en particular es usar el lenguaje de procesamiento de plantillas del lado del servidor para hacer comentarios de bloque para elementos de comentarios de código anidados. Esto deja el contenido esencialmente intacto, pero evita enviarlo al navegador del cliente.

Eso no ayuda mucho si el archivo es de otro modo contenido puro y directo que no requiere otro procesamiento del lado del servidor. En ese caso y en el caso más general de comentarios anidados, pregunte por qué quiere hacer eso. En la mayoría de esos casos, uno podría encontrar que la mejor manera de manejarlo es no manejarlo todo. En otras palabras, si desea eliminar una sección, elimínela y deje que el control de versiones se encargue de recordar las diferencias si esa sección como un artefacto alguna vez necesita resucitar.


0

En el caso de HTML / XML puede usar una instrucción de procesamiento no existente: vea mi respuesta en SO

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>

0

Swift admite comentarios anidados, por lo que "parece que no solo en un idioma los comentarios no pueden anidarse" ya no es una declaración verdadera. Si no está satisfecho con la falta de soporte para comentarios anidados en su lenguaje de programación, le sugiero que pruebe Swift.

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

Lenguaje de programación rápido: los fundamentos


0

El lenguaje de programación D tiene comentarios anidados integrados en:

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

En otras palabras, /+y los +/comentarios anidan.

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.