Guias de estilo: ¿tabs o espacios?

Ayer ya dije que 2 o 4 espacios es perfecto para programar. Hoy voy a explicar por qué espacios y no tabs.

Mi argumento a favor de los espacios, es que una vez has indentado un código con espacios, da igual en qué editor lo abras, da igual cual sea la configuración que tenga dicho editor, que siempre, siempre, se va a ver bien indentado.

Si indentas un código con tabuladores, y cada tabulador representa 4 espacios, y luego abres ese mismo archivo con otro editor, que tiene configurado que un tabulador son 8 espacios, verás como muchas partes del código están desalineadas. Lo mismo ocurre si lo abres con otro editor que tenga 2 espacios, todo se va a ver mal indentado.

Otro gallo cantaría, si por ejemplo los editores usaran tabuladores elásticos (elastic tabstops:a better way to indent and align code), que me parece una idea cojonuda y sencilla. De verdad, merece la pena echarle un vistazo a esa página:

Básicamente, si todos los editores usaran este otro método, entonces la mejor opción sería usar tabuladores, y daría igual cuantos caracteres se usaran para indentar, pues todos los programadores verían bien el código y de acuerdo a sus gustos personales. Pero como tampoco se trata de una idea que se haya extendido mucho, y no se implementa en casi ningún editor, mi opinión sigue siendo firme:

Hay que usar 2 espacios para indentar código. ¡¡Nunca Tabs!!

Enlaces de interés:

Trackback URL

, , , , , ,

14 Comments on "Guias de estilo: ¿tabs o espacios?"

  1. ddg
    09/12/2008 at 3:33 am Permalink

    :set ts=2

    ;)

  2. Pietro Zuco
    09/12/2008 at 3:39 am Permalink

    Tienes toda la razón, si se usaran espacios el código se vería siempre igual independientemente de la configuración del editor.

    Pero un punto me parece necesario hacer notar.
    Con tabuladores, aunque tengamos muchas veces el coñazo de tener que ver formateadas las cosas de una forma u otra dependiendo del editor, obtenemos algo que los espacios no proporcionan: Flexibilidad.
    Tener el sangrado tabulado permite que el formato se ajuste a las necesidades de cada uno. Cada quien configura su editor como más le guste y un tab es un tab donde sea por lo que podemos reemplazarlo por 4, 8 o cuantos espacios queramos. En cambio cuatro espacios son cuatro vayan donde vayan y esa fexibilidad desaparece.

    Si por ejemplo, usas cuatro espacios pero otra persona prefiere ver ocho, le quitas la posibilidad de poder formatear el código como más le convenga.

    Un saludo.

  3. Hector
    09/12/2008 at 9:13 am Permalink

    entonces la razón es puramente estetica, yo siempre me habia preguntado si el interprete leeria más rapido con una u otra.

  4. Pau Sanchez
    09/12/2008 at 9:26 am Permalink

    Hola Pietro,
    Creo que tu razonamiento es bastante acertado en prácticamente todo lo que has dicho, sin embargo olvidas un punto muy importante. Me explico.

    Imagina el siguiente ejemplo en C, donde [tab] representa un tabulador:
    void function (void)
    {
    [tab] int i;
    [tab] for (i = 0; i < 10; i++) {
    [tab][tab] print (“iteration %d\n”, i);
    [tab] }
    }

    Si te fijas en ese ejemplo, lo que tu comentas se cumple, es decir, si yo tengo configurado mi editor para que interprete cada tab en 2 caracteres, se me quedará formateado como si hubiese puesto 2 espacios, y si tu lo tienes con 4, entonces tu también lo verás bien. Hasta aquí no hay discusión ninguna, y tu razonamiento es coherente. Sin embargo, mira el siguiente fragmento de código:

    void function (void)
    {
    [tab] int i, var, variable, variable_larga;
    [tab] i [tab][tab] = 1;
    [tab] var [tab][tab] = 1;
    [tab] variable [tab] = 1;
    [tab] variable_larga [tab] = 1;
    }

    No se si ves lo que intento hacer arriba, pero básicamente intento que los “= 1″ queden alineados. De hecho, si yo lo he alineado usando tabs de 8 espacios, tu con tabs de 6 espacios puede que lo veas bien, pero si tu editor interpreta los tabs como 4 o 2 espacios ciertamente harían falta más tabs en las variables “i” y “var” para que lo vieras alineado. Y justo el caso contrario, imagina que yo lo alineo usando tabs de 2, entonces cuando otra persona lo abra con sus tabs de 4, vería que el primer = 1 se va un poco lejos. No se si ves por donde voy.

    Llegados a este punto me puedes decir: “es que para indentar hay que usar tabs, pero para alinear hay que usar espacios”, entonces yo te contestaría que tienes toda la razón, que si mezclas tabs y espacios de esta manera se ve siempre bien y no importa a cuanto esté configurado el editor de cada uno.

    Pero nuevamente yo te preguntaría ¿y no es más sencillo usar siempre espacios, que siempre se ve bien, y no hay que andar mezclando cosas?

    Finalmente, no se si has visto lo de los elastic tabs, pero si los editores interpretaran los tabs tal y como se comenta en esa página, entonces sí tendría sentido usar tabs siempre, y daría igual todo.

    Un saludo!

  5. Pietro Zuco
    09/12/2008 at 3:09 pm Permalink

    Hola Pau

    Pues tienes toda la razón. Cuando he tenido que alinear, por ejemplo elementos de una matrix, etc he usado espacios. Los tab solo los he usado al principio para sangrar el texto. Siempre he usado los dos.

    Actualmente no todos los editores implementan los elastic tab, así creo que no hay más remedio que hacer una mezcla de las dos cosas. Más que nada por dos razones. Primero, la ratio con la que se usan tabs es muchísimo mayor que la ratio con la que se usan espacios para alinear valores dentro de variables o matrices. La segunda razón deriva de la primera. Si queremos alinear con espacios, dependiendo del editor, podemos hacer que cada tab en lugar de introducir un tab introduzca espacios (por ejemplo con el vi) Pero si introduces por ejemplo, 4 espacios por tab, al final cuando vas a alinear valores en variables o matrices, igualmente no podrás usar la configuración previa. Vas a tener que hacerlo a mano metiendo los espacios necesarios para que sea legible sino tendrías el mismo problema que has explicado previamente.

    Por lo tanto si usas tabs y combinas espacios tendrá cada quien el sangrado que quiera y las variables ordenadas en el modo correcto. Digo correcto, porque en temas de sangrado pueden haber opiniones pero en tema de ordenar los valores en una lista de variables, impera el sentido común.

    Comentabas esta pregunta:
    >¿y no es más sencillo usar siempre espacios, que siempre se ve bien,
    > y no hay que andar mezclando cosas?

    Depende. Si usas solo espacios, tendrás todo formateado de forma que lo que tu ves en tu editor es lo que yo veo en el mio. El único inconveniente que le veo a esto es que la mayoría de la gente tiene “gustos” en cuanto a sangrado pero no en cuanto a ordenar una lista de valores.

    Por ejemplo, tomando tu código de arriba:

    void function (void)
    {
    [tab] int i, var, variable, variable_larga;
    [tab] i = 1;
    [tab] var = 1;
    [tab] variable = 1;
    [tab] variable_larga = 1;
    }

    En el navegador no se puede apreciar por el tipo de fuente. Si lo pegamos en un simple editor, los 1 quedarían alineados manteniendo los tabs a la izquierda.
    Personalmente creo que la alineación de los valores es deseada por todos pero el sangrado es una cosa de gustos. Si usas solo espacios, el que desee ver un sangrado diferente no podrá.

    De todas formas creo que un código por más buen sangrado y alineación que tenga, si no está bien comentado y no usa una lógica clara al final acaba siendo más difícil de seguir el mejor formateado :)

    Actualmente usas solo espacios, mezclas los dos o solo tabs?

    Un saludo.

    PS: Por cierto muy interesante el blog, lo pillé por twitter :)

  6. Pau Sanchez
    10/12/2008 at 4:54 am Permalink

    Actualmente uso sólo espacios, y siempre uso la tecla TAB para indentar :)

    El problema de tabs y espacios, no es a nivel estético, porque está claro y estoy de acuerdo contigo (como ya dije en el otro comentario) en que da igual la configuración que se tenga, que se va a ver bien. El problema que si usas tabs y espacios de la forma descrita, tienes que andar usando la tecla tab sólo para indentar, y el espacio para alinear. Si lo piensas, verás que es mucho más cómodo usar siempre la tecla tab, incluso para alinear, porque el editor ya alinea por ti, con lo cual te ahorras tiempo.

    Nuevamente, y quitando de enmedio a los elastic tabs, si los editores implementaran un modo mixto (mejor llamemoslo modo inteligente, que queda más elegante), en el que cuando uses el TAB realmente se escriba un tabulado, pero sólo a principio de linea, y cuando se escriba cualquier otra cosa, los tabs se interpretaran como espacions, entonces y sólo entonces vería más cómodo usar tabs, porque la tecla de TAB sería “inteligente”, y sabría que si has hecho 3 tabs, y escribes algo, a partir de ese punto, en esa linea, los tabs son X espacios alineandose en múltiples de X (donde X es preferiblemente 2 o 4).

    PD: gracias por tus comentarios, me gustan las discusiones sanas ;)

  7. Pietro Zuco
    10/12/2008 at 5:41 am Permalink

    No estoy seguro pero lo último que comentas (El tab inteligente) creo que se podría implementar en vi o emacs. No conozco ni uso otros editores. Le echaré un vistazo. Si te enteras de como hacerlo, pasa el dato :)

    Un saludo.

  8. Pau Sanchez
    10/12/2008 at 10:06 am Permalink

    No creo que sea demasiado difícil de implementar, la lógica es muy sencilla.
    Si me entero de algo ya avisaré.

Trackbacks

  1. [...] de los dos artículos reflexionando sobre la indentación y sobre si los espacios son mejor que los tabs a ...

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe to Comments