Indentación estilo K&R y variantes

El estilo K&R, que también se llama «el único estilo verdadero de llaves» en la jerga de los hackers (abreviado como 1TBS ), se usa comúnmente en C, C ++ y otros lenguajes de programación de llaves. Era el estilo utilizado en el núcleo original de Unix, el libro de Kernighan y Ritchie, «The C Programming Language», así como el libro de Kernighan y Plauger , The Elements of Programming Style .

Al seguir K&R, cada función tiene su llave de apertura en la siguiente línea en el mismo nivel de indentado (sangría) que su encabezado, las declaraciones dentro de las llaves están indentadas y la llave de cierre al final está en el mismo nivel de indentado que el encabezado de la función en una línea propia.

Sin embargo, los bloques dentro de una función tienen sus llaves de apertura en la misma línea que sus respectivas declaraciones de control; las llaves de cierre permanecen en una línea propia, a menos que le siga una palabra clave else o while . Tales llaves no alineadas reciben el sobrenombre de «llaves egipcias» (o «paréntesis egipcios») por su parecido con los brazos en algunas poses de los antiguos egipcios.

indentKyRyvariantes01

El lenguaje de programación C no especifica explícitamente este estilo, aunque se sigue de manera consistente en todo el libro.

Extracto del libro:
La posición de las llaves es menos importante, aunque las personas tienen fuertes creencias sobre ello. Hemos elegido uno de varios estilos populares. Elige un estilo que se adapte a ti, luego úsalo de manera consistente.

En versiones anteriores del lenguaje C, los tipos de argumentos debían declararse en la línea siguiente (es decir, justo después del encabezado de la función):

indentKyRyvariantes02

 

Variante: 1TBS (OTBS)

Los defensores de este estilo a veces se refieren a él como «el único estilo de llave verdadero» (abreviado como 1TBS u OTBS ). Las dos diferencias principales con respecto al estilo K&R son que las funciones tienen llaves de apertura en la misma línea separadas por un espacio, y que las llaves no se omiten para una declaración de control con solo una declaración en su alcance.

En este estilo, las construcciones que permiten inserciones de nuevas líneas de código están en líneas separadas, y las construcciones que prohíben las inserciones están en una línea. Este principio se amplifica apoyando cada if, else, while, etc., incluyendo condicionales de una sola línea, de modo que la inserción de una nueva línea de código en cualquier lugar siempre sea segura (es decir, tal inserción no hará que el flujo de ejecución no esté de acuerdo con la sangría del código fuente).

Las ventajas sugeridas de este estilo son que la llave inicial no necesita una línea adicional sola; y la llave final se alinea con la declaración a la que pertenece conceptualmente. Un costo de este estilo es que la llave final de un bloque necesita solo una línea completa, que puede resolverse en parte en bloques if / else y bloques do / while:

indentKyRyvariantes03

Hay muchas menciones de The One True Brace Style por ahí, pero existe cierta confusión en cuanto a su verdadera forma. Algunas fuentes dicen que es la variación especificada anteriormente, mientras que otras lo señalan como otro término de «jerga hacker» para K&R.

Variante: Kernel de Linux

Una variante menor del estilo K&R es el estilo del kernel de Linux, conocido por su uso extensivo en el árbol fuente del kernel de Linux . Linus Torvalds recomienda encarecidamente a todos los contribuyentes que lo sigan. El estilo toma muchos elementos de K&R:

El estilo del núcleo utiliza tabulaciones (con las tabulaciones establecidas cada 8 caracteres) para el indentado. Al abrir llaves de una función, vaya al inicio de la línea que sigue al encabezado de la función. Cualquier otra llave de apertura va en la misma línea que la declaración correspondiente, separada por un espacio. Las etiquetas en una declaración de switch están alineadas con el bloque que lo encierra (solo hay un nivel de indentado). Un cuerpo de una sola declaración de una declaración compuesta (como if, while y do-while) no necesita estar rodeado de llaves. Sin embargo, si una o más de las subestimaciones en una declaración if-else requieren llaves, entonces ambas subestaciones deben estar envueltas dentro de llaves. La longitud de la línea está limitada a 80 caracteres.

El estilo del kernel de Linux especifica que «si solo una rama de una declaración condicional es una sola declaración … use llaves en ambas ramas»:

indentKyRyvariantes04

Variante: llaves obligatorias

Algunos abogan por llaves obligatorias para las declaraciones de control con una sola declaración en su alcance, es decir, preparando cada si, si no, mientras que, etc., incluyendo condicionales de una sola línea, para que la inserción de una nueva línea de código en cualquier lugar siempre sea segura ( es decir, tal inserción no hará que el flujo de ejecución no esté de acuerdo con la indentación del código fuente).

El costo de este estilo es que se necesita una línea completa adicional para el último bloque (excepto los bloques intermedios en los bloques if / else if / else y do / while).

Variante: Java

Si bien Java a veces se escribe en otros estilos, un cuerpo significativo de código Java utiliza una variante menor del estilo K&R en el que la llave de apertura está en la misma línea no solo para los bloques dentro de una función, sino también para las declaraciones de clase o método. Este estilo está ampliamente extendido porque las guías de estilo originales de Sun Microsystems usaron esta variante K&R, y como resultado la mayor parte del código fuente estándar para la API de Java está escrito en este estilo. También es un estilo de indentación popular para ActionScript y JavaScript , junto con el estilo Allman .

Variante: Stroustrup

El estilo Stroustrup es la adaptación de Bjarne Stroustrup del estilo K&R para C ++, como se usa en sus libros, como Programming: Principles and Practice usando C ++ y The C ++ Programming Language .

A diferencia de las variantes anteriores, Stroustrup no utiliza un «else abrazado». Por lo tanto, Stroustrup escribiría

indentKyRyvariantes05

Stroustrup extiende el estilo K&R para las clases, escribiéndolos de la siguiente manera:

indentKyRyvariantes06

Stroustrup no indenta las etiquetas public: y private:. Además, en este estilo, mientras la llave de apertura de una función comienza en una nueva línea, la llave de apertura de una clase está en la misma línea que el nombre de la clase.

Stroustrup permite escribir funciones cortas en una sola línea. El estilo Stroustrup es un estilo de indentado con nombre disponible en el editor Emacs . Stroustrup fomenta un diseño de estilo derivado de K&R con C ++ como se indica en sus modernas Pautas básicas de C ++ .

Variante: BSD KNF

También denominado Kernel Normal Form , esta es la forma de la mayoría del código utilizado en los sistemas operativos Berkeley Software Distribution (BSD). Aunque está destinado principalmente al código del kernel, también se usa ampliamente en el código de usuario . Es esencialmente una variante completamente documentada del estilo K&R como se usa en el código fuente de Unix de Bell Labs Versión 6 y 7.

El kernel y los usuarios de SunOS usan un estilo de indentado similar. Al igual que KNF, esto también se basó en documentos de estilo de AT&T y eso a veces se denomina Bill Joy Normal Form. La directriz SunOS se publicó en 1996; ANSI C y allí se discute brevemente. La corrección de indentado de una lista de archivos fuente puede ser verificada por el programa cstyle escrito por Bill Shannon.

En este estilo, el tabulador rígido (ts en el editor vi ) se mantiene en ocho columnas, mientras que un tabulador blando a menudo se define como un ayudante también (sw en vi) y se establece en cuatro. Los tabuladores duros se usan para indentar bloques de código, mientras que un tabulador blando (cuatro espacios) de indentación adicional se usa para todas las líneas continuas que deben dividirse en varias líneas.

Además, las llamadas a funciones no usan un espacio antes del paréntesis, aunque las declaraciones nativas del lenguaje C como if , while , do , switch y return do (en el caso de que return se use con parens). Las funciones que declaran que no hay variables locales en su bloque de nivel superior también deben dejar una línea vacía después de su llave de bloque de apertura.

Aquí siguen algunas muestras:

indentKyRyvariantes07

indentKyRyvariantes08

indentKyRyvariantes09