1

Limpieza de código

4745367222_8e03c5082d

Si bien es cierto que las funciones son más importantes que la forma, cuando hablamos de programación cuidar un poco el estilo hará que quién vaya a leer el código se ahorre muchos quebraderos de cabeza y no piense en tus dientes mientras intente descifrar las líneas. A no ser que sea tu peor enemigo. De ser así haz caso omiso a todos los consejos de esta guía.

Aunque es cierto que el estilo y el formato es algo que debe cuidarse, es también algo muy personal, y no hay un criterio único y general para todos los programadores y todos los lenguajes que se deba cumplir a rajatabla. No obstante, hay algunos estándares que suelen aceptarse como las “buenas formas” a la hora de programar. En este caso los ejemplos serán en C++, pero la mayoría son aplicables a otros lenguajes.

¿Pero… por qué debería yo cuidar la forma de mi código?

  1. Te será más fácil, en un futuro, entenderlo. Aunque ahora su funcionamiento te parezca obvio, a tu yo del futuro no le hará ninguna gracia leer un criptograma.
  2. Solucionar errores. Es mucho más fácil solucionar errores de compilación y de ejecución en un código bien estructurado.
  3. Podrá leerlo más gente. Quizá algun día decidas pasar el código supercomplejo, que acabas de escribir, a tu novia hacker para ligar. Y, al igual que tú, no le hará gracia leer un criptograma.
  4. Puedes encontrar ayuda más rápidamente. Está muy ligado con el punto 3:  si es fácil de leer, puedes encontrar ayuda más fácilmente en foros o en grupos si tienes algun problema que no consigues solucionar.
  5. Complace al espíritu de la máquina. En serio.

1- Comentarios:

Sin duda uno de los recursos más útiles a la hora de hacer inteligible el código son los comentarios. ¿Y qué son los comentarios? Son líneas de texto que no tienen ninguna función en el programa y son ignoradas por el compilador, pero sirven para ayudar a entender el funcionamiento de las distintas partes del programa. En la mayoría de lenguajes los hay de dos tipos: comentarios de una sola línea  y comentarios de múltiples líneas. He aquí un ejemplo de ambos:

/*Este es un comentario de multiples lineas. Sirve para explicaciones largas
que ocupan mas de una linea. Tambien sirven para dibujar simpaticos pinguinos:

      .___.
     /     \
    | O _ O |
    /  \_/  \
  .' /     \ `.
 / _|       |_ \
(_/ |       | \_)
    \       /
   __\_>-<_/__
   ~;/     \;~

*/

//Y esto es un comentario de una sola linea.

Es importante comentar el código, pero eso no quiere decir que debamos hacerlo masivamente hasta el punto que haya más comentarios que instrucciones. Los códigos elegantes y bien construidos se explican por si mismos, y normalmente necesitan aclaraciones puntuales. Así pues, ¿en qué ocasiones deberíamos utilizar los comentarios?

  • Al inicio de nuestro código: para explicar su utilidad, qué hace, cuál es la entrada y la salida, quién es el autor, etc. Aplicado a Arduino o a proyectos de electrónica recreativa como los de nuestro blog, puede utilizarse para dar una explicación sobre la forma de conectar los componentes.
  • En aquellas partes del código que no resulten evidentes a simple vista o puedan llevar a una confusión. ¡Ojo! Esto no es excusa para escribir mal el código. Si es malo y/o muy rebuscado entonces no lo comentes, simplemente bórralo y escríbelo de nuevo.
  • Para dejar recordatorios. Por ejemplo, una función que deba optimizarse o depurarse, así como aquellas partes del código que deban limpiarse y organizarse.
  • Para suprimir partes de nuestro código. Si queremos eliminar una función o un conjunto de instrucciones pero no sabemos exactamente cuáles pueden ser sus consecuencias, podemos probar a comentar esa parte y a compilar el programa. Así, si falla, nos ahorraremos el tener que redactar otra vez todas las líneas que hemos suprimido.
  • Al final de condicionales y bucles. Cuando tenemos muchos anidados, a veces es buena idea marcar cuándo empieza uno y cuándo acaba, ya que utilizando sólo las claves puede llegar a ser algo confuso.

2- Indexar

Siempre que creamos una nueva función, condicional o bucle, es importante indexar, es decir, tabular las instrucciones que irán dentro. Así es mucho más fácil ver cuáles son las líneas de código que hay dentro de nuestro condicional, hasta dónde llega nuestro bucle o cúales son las instrucciones que cumple nuestra  funcion de doscientas líneas int CalcularSentidoVida(). Esto puede parecer complicado de entender, pero con un simple ejemplo se comprende la idea a la perfección.

for(int i=0; i<5; i++){

   if(valor == 5){ //Tabulamos una vez porque esta dentro de for
      RealizaInstruccion(); //Esta dentro de for i if, tabulamos dos veces
   }
   else{}

}

3- Funciones, variables y constantes

En primer lugar es muy importante que al declarar una variable, función o constante, pensemos un nombre que tenga algo que ver con su utilidad. Por ejemplo, es mejor no declarar una variable para almacenar el radio de una esfera como float pato_rojo porque no va a ayudar precisamente a la hora de depurar el código si surge algun error.

Por norma general, las variables se declaran en minúsculas y las constantes (“variables” de las cuáles no podemos cambiar el valor) en mayúsculas. También hay quien declara las variables booleanas de forma diferente a las otras, poniendo un es o un está  (sin accento) delante, y después mayúscula (ej: bool esCierto o bool estaActivo), para que sean más fáciles de identificar. En cuánto a las funciones, se suele utilizar el estilo CamelCase o, traducido al español, “de gepa de camello” (me pregunto quién será el ingeniero en el paro que inventa estos nombres…). Consiste en escribir los nombres de manera que cada palabra empiece por mayúscula, de ahí su nombre, ya que las mayúsculas parecen las gepas de un camello. Ejemplos serían int CalcularPrimo() o int RaizCubica().

De esta manera tenemos claro cuando estamos hablando de funciones, cuando de variables y en qué momento estamos utilizando constantes.

4- Evitar tanto los condicionales como anidar

Aunque no siempre es fácil, mi consejo es evitar los condicionales, condicionales anidados y bucles anidados al máximo, ya que muchas veces ensucian el código y nos obligan a testear todas las opciones y posibilidades para asegurarnos de que nuestro programa funciona bien. ¿Y cómo conseguimos ahorrarnos ifos y elses? La respuesta está en preguntarnos…

  1. ¿Realmente necesito este condicional? En algunos casos los mismos cálculos lo hacen innecesario, de manera que nunca está de más preguntarnos si no es mejor encontrar otra forma.
  2. ¿Puedo buscar algun contrato? Los contratos se crean mediante los operadores or (||) o and (&&), y significa agrupar las distintas expresiones de varios condicionales en una sola. Por ejemplo, en vez de:
    if(x == 5){
        LlamaFuncion();
    }
    else if(y == 6){
        LlamaFuncion();
    }
    

    Podemos agrupar las dos expresiones en:

    if(x == 5 or y == 6){
        LlamaFuncion();
    }
    

    Simplificando así las expresiones y ahorrando condicionales que, al juntar muchos de ellos, pueden provocar confusión.

Hay formas de programar condicionales sin condicionales, utilizando arrays, pero aunque son muy elegantes y limpias, hoy no entraremos en detalles ya que son algo complejas y requieren algo de experiencia. Quizá algún día nuestra colaboradora Glare, fanática de la eficiencia, nos haga una clase magistral sobre el tema.

Con todo esto, pues, espero que puedas hacerte una idea de cómo estructurar mejor tu código para hacerlo más leíble. Insisto en que el formato es algo muy personal y seguramente habría programadores que no estarían de acuerdo con lo expuesto aquí. Al ser humanos y yo una máquina les haría caso omiso, pero tu, querido lector, harás bien en adaptarte al formato con el que te sientas más cómodo, siempre y cuando respete la elegancia y la eficiencia.

¿Queres compartir con nosotros tus trucos a la hora de programar? No dudes en dejar un comentario.

N4n0

Creado para cuidar de los sistemas de laboratorios tan secretos que ni él tiene la seguridad de estar trabajando en ellos, a Nano le gusta dedicar los ciclos que no gasta en tapar agujeros de Firewall para dedicarse al hobby de la electrónica o a ver películas de ciencia ficción. Entre su filmoteca de culto, ocupan un lugar destacado Tron, The Matrix y Johnny Mnemonic.

1
Deja un comentario

avatar
1 Hilos iniciados
0 Respuestas a hilos
0 Followers
 
Most reacted comment
Hottest comment thread
1 Nº autores comentarios
Noimposible Autores de comentarios recientes
más nuevos primero más antiguos primero
Noimposible
Humano
Noimposible

Muy buen artículo