Perro viejo comentando

Querido Ndugu,

Parece ser que decía Marcel Proust que

La sabiduría no nos viene dada, sino que debemos descubrirla por nosotros mismos, después de un viaje que nadie puede ahorrarnos o hacer por nosotros.

Creo que en gran medida tiene razón pero hay ocasiones en las que otros que han hecho ya el camino pueden indicarnos “atajos” que hayan encontrado en su duro paseo, y como “recoger la sabiduría de otros, también es de sabios”, he pensado en compartir dos trucos que mi lento transcurrir por el mundo de la programación me han dejado.

Se trata de dos usos de comentarios que no he leído/encontrado en ningún sitio, que en algún momento “inventé” o mejor “descubrí”, y que no sé hasta qué punto otros viejos programadores de C++ (o en general de lenguajes con comentarios del tipo /* ... */) tienen en su repertorio. Por si resultan no estar extendidos, los grito aquí a los cuatro vientos para que cualquier teclario que los vea pueda aprovecharse de ellos y extenderlos por el mundo.

Mientras se programa, muchas veces estamos haciendo pruebas y queremos activar y desactivar trozos de código. Cuando el código ocupa poco (una o dos líneas), es rápido comentarlas utilizando los comentarios de una única línea. Lo incómodo llega cuando la sección ocupa un número de líneas considerable; en ese caso, es mucho mejor utilizar los comentarios de bloque, /* ... */.

Sin embargo, activar y desactivar una sección de código utilizando esta técnica requiere “visitar” el principio y el final del bloque, para poner o quitar los dos símbolos, el de apertura y el de cierre del comentario.

Y aquí va mi primer “truco”. Ya he comentado anteriormente que no lo he visto en ningún sitio, aunque sí he leido algo similar en el manual de LUA. Consiste en terminar la sección de código que queremos poder activar y desactivar rápidamente con un comentario multilinea vacío, es decir, con /**/. La peculiaridad de este comentario vacío es que puedes antecederlo con otra apertura de comentario multilínea, de tal forma que quede algo como /* ... /**/. El analizador léxico ignorará la segunda apertura, por encontrarse dentro de una sección comentada.

Por tanto, gracias al sencillo paso de colocar el comentario vacío al final de la sección, nos basta con abrir el comentario al principio de la misma para desactivarla:


/*
.... sección larga de código
.... que queremos activar y
.... desactivar fácilmente
/**/

Para volver a activar la sección, basta con borrar esa primera apertura, aunque yo aconsejo a su vez comentarla con un //, ya que de esta forma se sabe en qué sección concreta estaba el programador pensando cuando colocó el /**/.


///*
.... sección larga de código
.... que queremos activar y
.... desactivar fácilmente
/**/

Considero que esta sencilla técnica por sí sola es ya lo suficientemente útil como para darla a conocer a todos aquellos que no hubieran llegado a ella por ellos mismos. Sin embargo, puede darse una vuelta de tuerca más, para obtener otro método también útil en otras circunstancias.

Se da a veces que, siguiendo con la misma idea, tenemos dos secciones de código seguidas y excluyentes con las que queremos hacer pruebas, de tal forma que unas veces queremos compilar la aplicación con la sección de arriba, y otras veces con la de abajo. Por ejemplo:


// Sección 1
CMapLoder::Init();
CMapLoader::LoadMap("mapa1.map");
/**/
/*
// Sección 2
map = new CMap();
map->addEntity(creaEntornoVacio());
/**/

Tenemos dos secciones, una que construye un mapa utilizando un cargador de disco, y otra que lo crea desde código. Una veces queremos utilizar una y otras veces la otra. En este caso, debemos “activar” una sección y “desactivar” otra en cada prueba. Siguiendo con el truco anterior, eso puede hacerse cómodamente poniendo al final de ambas secciones el ya explicado /**/, pero no deja de ser algo pesado, ya que hay que quitar y poner dos aperturas de comentario (en el ejemplo anterior, habría que poner el /* al principio de la sección 1, y quitarlo en el de la sección 2).

Para evitarlo, y este es el segundo truco que quería contar, basta con:

  • Colocar un /**/ al final de la última sección.
  • Colocar un /*/ entre las dos secciones.

De esta forma, para elegir una u otra alternativa, basta con abrir o no abrir un comentario multilínea al principio de la primera sección, aprovechando que el /*/ que aparece entre ambas secciones unas veces hace de inicio de comentario multilinea y otras veces hace de cierre.

Como ejemplo, a continuación aparece el código con la sección 1 comentada y la sección 2 activa (observar que el /*/ del centro sirve de cierre de comentario multilinea):


/*
// Sección 1
CMapLoder::Init();
CMapLoader::LoadMap("mapa1.map");
/*/
// Sección 2
map = new CMap();
map->addEntity(creaEntornoVacio());
/**/

Y para cambiarlo y activar la sección 1, basta con quitar la apertura inicial (o comentarla con un comentario de línea); en ese caso, el /*/ sirve para iniciar un comentario multilinea que se cierra al final de la sección 2:


///*
// Sección 1
CMapLoder::Init();
CMapLoader::LoadMap("mapa1.map");
/*/
// Sección 2
map = new CMap();
map->addEntity(creaEntornoVacio());
/**/

Probadlo, y veréis lo cómodo que es…

4 Responses to “Perro viejo comentando”

  1. El Beclario Says:

    Muchas gracias por los comentarios sobre los comentarios (metacomentarios?). Creo que usaré bastante la primera versión y puede que también la segunda, pero a ésta última le veo un problema: Si no tienes un editor con resaltado de sintaxis el esfuerzo mental de “ver” qué sección está comentada es superior a tener que poner los comentarios arriba y abajo.

    Por otro lado, ya todos usamos editores con resaltado salvo en ocasiones especiales o frikis que prefieren usar el vi, pero esos están acostumbrados a que duela y no quieren atajos que les faciliten la vida :)

  2. El Mogur Says:

    Desde luego; sin resaltado de sintáxis es bastante difícil de ver; de hecho tenía miedo de que se entendiera mal el post debido a eso…

    La segunda versión, definitivamente, se utiliza menos, ya que no es tan habitual querer seleccionar una sección de código entre dos que van consecutivas, pero te garantizo que cuando ocurre, es muy cómoda ;)

  3. Elina Tonekawa Says:

    Muy buen, tio :)

    Estaba yo pensando que… ejem… yo suelo marcar un bloque de código, dar al botón derecho y luego con el izquierdo pedirle al Eclipse que comente ese fragmento.

    Sí… lo sé. Los “ratoneros” estamos a años luz en cuestión de velocidad con respecto a los que usáis el teclado (ya que hasta eso mismo que digo también se hace más rápido con teclado)… pero qué queréis que le haga? :-P

    Deberíamos hacer unos cursillos de escritura/programación rápida, al igual que del uso optimizado de editores de texto, entornos como Eclipse, etc. Y no lo digo de coña, es el pan nuestro de cada día y algunos seguimos perdiendo del orden de segundos en operaciones que realizamos miles (millones??) de veces… :(

  4. Abdul Alhazred Says:

    Esta bien, es bastante ingenioso. Yo normalmente lo comento o lo descomento a mano, y cuando estoy harto hago un

    ejecutar = true
    if ejecutar
    codigo
    end

    Pero esto esta muy bien y funciona con cosas como CSS y asi. Gracias!

Leave a Reply

You must be logged in to post a comment.