Código más bonito

Estilo de programación

¿Te imaginas el código fuente de Linux, sin comentar, con lineas y espacios a mansalva, y usando funciones que solo Dios sabe que hacen?
Proyectos grandes, y más los pequeños, se hacen difíciles de continuar por otras personas si el código no está lo suficientemente bonito como para leerlo. No hablamos de comentar el código, ya que he visto la exageración de comentar cada linea de código lo cual se torna en un infierno para leer xD.

Hablamos de crear “código para lectura”, no sólo hacer que funcione sino también hacer que pueda ser leido fácilmente por los programadores.

A veces nos acostumbramos a programar y a hacer código a la ligera, olvidando la importancia de mantener un orden inteligente a través de las tabulaciones, los espacios y los saltos de línea. Este orden debe hacerse costumbre para aquellos programadores que deseen alcanzar la perfección (juaz).

En este artículo hablaré exclusivamente de PHP ya que es uno de los lenguajes en el que más me molesta ver código mal formateado. Aunque como bien ustedes saben, se puede (se debe)(y frecuentemente es aplicado ) a otros lenguajes de programación similares como C y sus descendientes.

Haciendo código más bonito?

¿Por qué deberías embellecer tus creaciones?
Sin duda es un paso importante para entender tu código y poder leerlo a “simple vista”. No hablamos sólo comentar el código, sino también de crear una correcta indentación y formateo de nuestro código.

Los buenos codes se leen tan fácilmente como si fueran un libro para niños. (creo que estoy exagerando :grin: )

Embellecer el código es tan importante como escribirlo. Es más útil aún cuando trabajas en grupo, sobre todo cuando necesitas que algún compañero (más experto) “pueda ver tu código” y decirte donde está el error.

Se trata sobre todo de entender una manía que nos afecta a la mayoria de los programadores (incluyendome). No podemos leer un código (que no es nuestro) sin antes empezar a darle una indentacion correcta.

Es importante destacar, por si no sabias, que la indentación no es obligatoria ni necesaria para que un código funcione, ya que los compiladores rara vez le dan importancia a esto. Pero no por eso es menos importante.

¿Que es la indentación?

Según la wikipedia:

Por indentación se entiende mover un bloque de texto hacia la derecha insertando espacios o tabuladores para separarlo del texto adyacente.

Para dar un ejemplo, veamos un código no indentado, y uno correctamente indentado:

if(a == b){
echo "a y b son iguales";
}

El mismo código, pero aplicando indentación:

if(a == b){
    echo "a y b son iguales";
}

Se han creado “reglas” o “estándares” de código para “insertar esos espacios” en la derecha del código fuente ya que, si indentar supone solo agregar espacios a la derecha, cualquier diablo agregaria espacios a mansalva haciendo aún mas dificil la lectura de un código “indentado”.

Existen varios estilos mundialmente reconocidos, y propongo navegar por algunos de ellos para resaltar sus diferencias y poder elegir el que más nos guste.

Estilo K&R y BSD KNF

El estilo K&R es el más usado en el lenguaje C y PHP. Se trata de abrir la llave en la misma línea de declaración de la orden, indentando los siguientes pasos al mismo nivel que la llave y cerrando la llave en el mismo nivel que la declaración. Normalmente las tabulaciones en windows son de 4 espacios, cuando las tabulaciones tienen 8 espacios se trata del estilo BSD o KNF, muy usado en Linux.

Se entiende mejor con el siguiente ejemplo:

function saludar($val){
    if($val == 1) {
        echo "Hola!";
    } else {
        echo "Chau!";
    }
}

El código fuente del kernel de Unix y Linux está escrito en este estilo.

La ventaja de usar este estilo es que las llaves iniciales no necesitan ninguna línea extra para ellas solas, por lo que se ahorra espacio vertical de lectura.
La desventaja de este estilo es que las llaves de cierre si necesitan una línea exclusiva para ellas.
Resulta difícil identificar el comienzo de las llaves de un bloque. Sin embargo es fácil identificar el comienzo de un bloque debido a la indentación a la derecha.

Estilo Allman

Se trata de crear una nueva línea para las llaves, e identar el código debajo de ellas. La llave de cierre tiene el mismo identado que la de inicio.

function saludar($val)
{
    if($val == 1)
    {
        echo "Hola!";
    }
    else
    {
        echo "Chau!";
    }
}

Este estilo mantiene un código limpio y claro. Las llaves de inicio y fin coinciden en la misma columna, haciendo más fácil la identificación de cada bloque. Además, es más difícil olvidarse cerrar una llave cuando se identifica claramente la llave inicial.
Personalmente uso este estilo en mis creaciones 8) .

La desventaja de este estilo, es que las llaves ocupan enteramente una línea, ocupando más espacio vertical de lectura. En monitores con resoluciones bajas (24 líneas) resulta difícil leer código fuente con este estilo aunque esto poco afecta en monitores con resoluciones mas grandes.

Estilo GNU

Parecido al estilo Allman, se trata de poner las llaves en una nueva línea. La diferencia es que las llaves, deben estar indentadas por 2 espacios, y el código dentro de ellas debe estarlo por 2 espacios más.

function saludar($val)
{
    if($val == 1)
      {
        echo "Hola!";
      }
    else
      {
        echo "Chau!";
      }
}

Algunas aplicaciones (como GNU Emacs) formatean el código a este estilo automáticamente. Es usado por los proyectos de software GNU debido a que se ha declarado un estándar dentro de esta comunidad.

¿Y tu, que estilo usas?

Comentanos cual es el estilo que usas para tu proyectos, y si tienes la mania (como yo) de indentar el código de otros a nuestro estilo :) .

Herramienta de indentación automática

Por suerte disponemos de una herramienta gratuita y online para indentar código en el estilo que más nos guste. Esta herramienta se puede encontrar en el siguiente enlace:
http://formatter.gerbenvv.nl/version3/index.php

Además de separar los bloques en nuestro estilo preferido, formatea el código agregando color, quitando comentarios y líneas vacías. Una herramienta que sin duda merece estar en nuestros favoritos.

Las opciones son muy intuitivas, aunque en breve voy a explicar que significa la opción “Comment after control structures”.

Otra herramienta para indentar código online, pero esta vez para HTML y CSS, puedes encontrarla aqui:
http://tools.arantius.com/tabifier

Cierres de bloques

En ocasiones tenemos estructuras de control muy grandes (verticalmente) tanto es asi que al leer el final de ellas, perdemos de vista el principio obligándonos a tener que subir y bajar la página para poder leer el código.
Por ello una buena costumbre es la de comentar al final de cada bloque, escribiendo en el comentario la misma declaración del inicio.

function saludar($val)
{
    if($val == 1)
    {
        echo "Hola!";
    }
    else
    {
        echo "Chau!";
    }//($val == 1)
}//function saludar($val)

Aunque esto es exagerado para bloques pequeños, es de extrema utilidad para bloques con un tamaño considerablemente grande.
La desventaja es que nos obliga a escribir el código dos veces (pero repito, solo es a modo de lectura, no afecta en nada el funcionamiento).

La opción “Comment after control structures” del indentador online, justamente realiza esta operación automáticamente con todas las estructuras de control.

Personalmente hago uso de estos comentarios cuando los if o bucles, son muy grandes y muy complicados.

¿Indentar seteo de variables?

Esto no es un estandar, mas bien es una recomendación personal, ustedes pueden decirme que les parece :) .

Antes:

$nombre_temporal = $_FILES['Filedata']['tmp_name'];
$tamano_de_archivo = $_FILES['Filedata']['size'];
$realname = $_FILES['Filedata']['name'];

Despues [Indentado]:

$nombre_temporal    = $_FILES['Filedata']['tmp_name'];
$tamano_de_archivo  = $_FILES['Filedata']['size'];
$realname           = $_FILES['Filedata']['name'];

Sin duda se lee mejor de la segunda manera, queda más bonito, y se distinguen mejor las variables.
También podemos hacer lo mismo con los parametros de funciones, cuando las lineas se repiten:

$site->set("descripcion", $descripcion);
$site->set("titulo"     , $titulo);
$site->set("enabled"    , $enabled);
$site->set("notenabled" , $notenabled);

Creando bloques de código

Otra recomendación mia, es la de usar bloques de código para identificar rápidamente el significado de unas lineas de proceso. En el siguiente ejemplo, se verifica si el usuario tiene los permisos para acceder a la pagina. Nótese como se han encerrado las lineas entre corchetes {} sin pertenecer estas, a un condicional.

{//Login Check
    if(!$login->logged() && !$login->isadmin())
    {
        $site->template('login');
        exit(0);
    }
}//End Login Check

Recomiendo hacer uso de esta técnica siempre que se pueda, ayuda bastante a la hora de leer el código. :)

¿Y tu como mejoras tu código?

Cúentanos que haces para poder leer mejor tus códigos, y si tienes sugerencias o manías como nosotros xD.

Bibliografía

Indentación automática (autotabulacion de código php): http://formatter.gerbenvv.nl/version3/index.php
http://en.wikipedia.org/wiki/Indent_style
http://es.wikipedia.org/wiki/Estilo_de_programación

mik says:

tremendo , mucgas gracias un codigo ordenado es como un libro bien escrito ;)

Sergio says:

Hola muy buenas. G

Gran aporte, estaba buscando información sobre los estílos de programación ya que la estructuración de mis codes me llevan loco y creo que esta web me a ayudado.

Hay algun sitio web que indente y estructure perfectamente código C?

Saludos compañeros.

Eduardo says:

Hola Sergio,
puedes revisar esta herramienta:
http://www.prettyprinter.de/

Es un formateador de código para PHP, Java, C++, C, Perl, JavaScript y CSS.

Espero que te haya servido.

Salu2.

¿Este comentario te ha servido? y colabora con el blog
Reply
Amir says:

Sergio:
Si usas linux, tienes el comando externo indent

creo que era así
$indent tufichero.c

un saludo

Sergio says:

Hola Eduardo y Amir, las dos herramientas son espectaculares. Utilizo Linux y el comando indent es potentísimo.

¿Existe algún parámetro para pasarle al comando para que indente segun el tipo deseado?

Es decir, estillo Allman, BSD, K&R…

Saludos y gracias.

Eduardo says:

Hola Sergio,
es buena tu pregunta, según estube investigando:
Con el parametro -gnu obtenemos la indentacion en estilo GNU (por default).
-kr para el estilo K&R.

Desafortunadamente no hay opción para el estilo Allman/BSD, hay que poner manualmente las opciones, pueden ser las siguientes:

-nbad -bap -nbc -bbo -bl -bli0 -bls -ncdb -nce -cp1 -cs -di16
-ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -nprs -psl -saf -sai
-saw -nsc -nsob

Me lei el manual para contestarte y eso es lo que salió. Si si, ok, no me odies a mi, odia al programita que no lo trae definido :D

Salu2

¿Este comentario te ha servido? y colabora con el blog
Reply
Sergio says:

Hola Eduardo:

Muy buena la info. Si, es mala suerte pues el estilo Allman es mucho más claro pero el estilo K&R es más bonito.

De todas formas, gracias por la base, ya buscaré yo con tiempo sobre ello, pero de momento me quedo con el estandar que utiliza indent y también el parámetro -kr para el K&R.

Saludos, enhorabuena por el blog, muy bueno.

Julio says:

En varias páginas de programación dicen que hay que escribir el código como si un psicópata que vive al frente de tu casa lo fuera a mantener.Buenos consejos y buena página también.

obelich says:

Hola yo utilizo el estilo Gnu hehehe no sabia que asi se llamaba es mas no sabia que tenia nombre gracias por tu articulo y a eso lo boy a implementar lo del indentado a mi me gusta el estilo limpio y legible ^_^, bueno tengo poco en la programacion ando con php sale gracias por el articulo.

Gracias por la herramienta PHP Formatter me ayudó mucho… tengo a mi socio que no le gusta identar el codigo que escribe, y como trabajamos juntos es necesario que yo lea su codigo y el el mio, pero ahora lo formateo cada vez que me lo manda y listo.

Muchas Gracias!

Jose says:

Mil gracias, la verdad es que no sabia que estilo de llaves utilizar y este artículo me ha aclarado las dudas ^^

Sergio Sam says:

Una que puede ayudar, si usas NetBeans para programar le das boton derecho al mouse en el codigo Formato y te ordena todo el codigo :-)

Para Eduardo: no hay una seccion de preguntas y respuestas para SexyLightbox?

Hace un tiempo vi una respuesta tuya de como hacer para que SexyLightbox se abra solo como un popup al iniciar una pagina y por mas que busque no encuentro la respuesta … veo como 5 preguntas similares sin respuestas… un Wiki o una seccion de FAQ estaria buena…

Squadron says:

Pues io uso el primer estilo para la indentacion, aunque para la mayoria que no este acostumbrado talvez sea un poco dificil identificar el comienzo del bloque con solo ver el final, pues io toy acostumbrado y no tengo ningun problema.

Normalmente me salen aveces codigo en un solo bloque que contienen muchas funciones y aveces muy largas que a primera vista uno no sabria exactamente que hace o que cosas hace (aveces hace mas de 1 cosa) por lo que suelo poner al inicio y final un comentario breve como titulo sobre lo que trata, y asi para cada funcion:

// === Inicio: Titulo ===
function saludar($val){
if($val == 1) {
echo “Hola!”;
} else {
echo “Chau!”;
}
}
// === Fin: Titulo ===

LP says:

yo uso un buen IDE q me idente el codigo automaticamente, aunke io siempre he tenido esa mania. Les recomiendo el netbeans 6.9 q identa bastantes lenguages, el php, javascript,html, etc …

phanter says:

un código bien identado y comentado es como escribir sin faltas de ortografía, yo uso la técnica allman, y siempre arreglo los códigos de otros a mi modo.

brokenwalls says:

La identación es mas importancia de la que se le suele dar, por mi parte utilizo allman, pero a mi estilo, es decir, dejo espacios. Pongo un ejemplo:

public void aplicacion ()
{
int a = 0;
int b = 0;

if ( a == 0 )
System.out.println ( “Son iguales” );
}