En programación informática , el estilo de indentación es una convención o estilo que rige la indentación de las líneas de código fuente . Un estilo de indentación generalmente especifica un número consistente de espacios en blanco antes de cada línea de un bloque, de modo que las líneas de código parezcan estar relacionadas, y determina si se deben usar espacios o tabulaciones como carácter de indentación.
Descripción general
Este artículo se centra principalmente en los estilos de lenguajes de programación de formato libre . Como su nombre indica, el código de estos lenguajes no necesita seguir un estilo de indentación. La indentación es una notación secundaria que suele tener como objetivo reducir la carga cognitiva del programador para comprender la estructura del código. La indentación puede aclarar la separación entre el código ejecutado según el flujo de control .
Los lenguajes estructurados, como Python y occam , utilizan la indentación para determinar la estructura en lugar de llaves o palabras clave; esto se conoce como la regla de indentación lateral . En estos lenguajes, la indentación es relevante para el procesador del lenguaje (como el compilador o el intérprete ). Un programador debe ajustarse a las reglas de indentación del lenguaje, aunque puede elegir libremente el tamaño de la indentación.
Este artículo se centra en lenguajes que utilizan llaves (que delimitan bloques con llaves, también conocidas como corchetes ) y, en particular , en lenguajes de la familia C , pero una convención utilizada en un lenguaje puede adaptarse a otro. Por ejemplo, un lenguaje que utiliza BEGINpalabras ENDclave `<br>` en lugar de llaves puede adaptarse tratando BEGIN`<br>` como la llave de apertura, y así sucesivamente.
El estilo de sangría solo se aplica a los lenguajes basados en texto. Los lenguajes de programación visual generalmente no utilizan la sangría de la misma manera.
Investigación
A pesar del uso generalizado de los estilos de indentación, se ha realizado poca investigación sobre su valor. Los primeros experimentos, realizados por Weissman en 1974, no mostraron ningún efecto. [ 1 ] En 2023, un experimento de Morzeck et al. [ 2 ] mostró un efecto positivo significativo para iflas sentencias anidadas donde el código sin indentación requirió en promedio un 179 % más de tiempo de lectura que el código con indentación. Un experimento de seguimiento de Hanenberg et al. [ 3 ] confirmó un gran efecto (aunque en ese experimento el código sin indentación solo tomó un 113 % más de tiempo de lectura) y reveló que las diferencias en los tiempos de lectura pueden explicarse por el código que se puede omitir (para el código con indentación). En otro experimento sobre objetos JSON [ 4 ] el código sin indentación tomó incluso un 544 % más de tiempo de lectura.
Estilos de colocación de los brackets
La siguiente tabla ilustra cómo interactúan los diferentes estilos de colocación de llaves con la indentación en las estructuras de control. Para mayor coherencia, el tamaño de la indentación en el código de ejemplo es de 4 espacios, aunque esto varía según la convención de codificación.
Estilos de C/C++
Los atributos de C , C++ y otros lenguajes de programación con estilo de codificación mediante llaves incluyen, entre otros:
- Colocación de las llaves en relación con otros elementos del código.
- Uso de tabulaciones o espacios
- Envolver bloques de una sola instrucción entre llaves. Quienes defienden esta práctica señalan la ventaja de que el código resultante es más seguro, ya que la inserción de una instrucción no puede generar un flujo de control que contradiga la indentación. Una desventaja mencionada es que el código es más largo, puesto que se necesita una línea para la llave de cierre de un bloque (excepto para la
else ifconstrucción y undo{}whilebloque).
K&R
El estilo Kernighan & Ritchie (K&R) se usa comúnmente para código C y C++ y es la base de muchos estilos derivados. Se utiliza en el núcleo original de Unix, en el libro de Kernighan y Ritchie , The C Programming Language , así como en el libro de Kernighan y Plauger , The Elements of Programming Style .
Aunque el lenguaje de programación C no define explícitamente este estilo, lo sigue de forma consistente. Del libro:
La posición de los brackets es menos importante, aunque la gente tiene opiniones muy firmes al respecto. Hemos elegido uno de los estilos más populares. Escoge el que mejor te quede y úsalo con regularidad.
En este estilo, una función tiene sus llaves de apertura y cierre en líneas separadas y con la misma sangría que la declaración, mientras que las instrucciones en el cuerpo de la función tienen una sangría adicional. Sin embargo, un bloque de varias instrucciones dentro de una función tiene su llave de apertura en la misma línea que su cláusula de control, mientras que la llave de cierre permanece en su propia línea a menos que vaya seguida de una palabra clave como elseo while.
Código de ejemplo:
int main ( int argc , char * argv []) { while ( x == y ) { hacer_algo (); hacer_algo_algo_otro (); if ( algún_error ) corregir_el_problema (); // bloque de una sola instrucción sin llaves else continuar_como_siempre (); } cosa_final (); }aparatos de ortodoncia egipcios
Los tirantes no alineados de los bloques de varias líneas reciben el apodo de "tirantes egipcios" (o "corchetes egipcios") por su parecido con los brazos en algunas poses fantasiosas de los antiguos egipcios. [ 5 ] [ 6 ] [ 7 ]
Declaraciones individuales
Un bloque de una sola instrucción no tiene llaves, lo que provoca errores fáciles de pasar por alto, como el error goto fail .
Un verdadero soporte
El estilo de corchetes único verdadero [ 8 ] (abreviado 1TBS u OTBS [ 9 ] ) es una variante del estilo K&R donde no se omiten los corchetes para un bloque de una sola instrucción. [ 10 ]
bool is_negative ( int x ) { if ( x < 0 ) { return true ; } else { return false ; } }Aunque no es obligatorio en lenguajes como C/C++, el uso de llaves para bloques de una sola instrucción garantiza que la inserción de una nueva instrucción no dé como resultado un flujo de control que no coincida con la indentación, como se ve, por ejemplo, en el infame error goto fail de Apple .
Algunas fuentes discrepan sobre el significado de One True Brace Style: podría tener ligeras diferencias según el estilo más frecuente en un idioma determinado, [ 11 ] [ 12 ] algunos autores podrían declarar un estilo muy distinto como OTBS según sus preferencias subjetivas, [ 13 ] mientras que otros lo señalan como "jerga hacker" para K&R. [ 14 ]
núcleo de Linux
El árbol de código fuente del kernel de Linux tiene un estilo similar al de K&R. [ 15 ] Linus Torvalds aconseja a los colaboradores que lo sigan. Los atributos incluyen:
- Utiliza caracteres de tabulación para la sangría (no espacios) y asume que hay tabulaciones cada 8 espacios.
- La disposición de las llaves coincide con la de K&R, con las llaves de las definiciones de funciones en líneas separadas y la llave de apertura de las sentencias compuestas en la misma línea que la cláusula de control, separadas por un espacio.
- Las etiquetas dentro de una
switchinstrucción están alineadas con el bloque que las contiene (solo hay un nivel de sangría). - La longitud máxima de línea es de 100 caracteres, aunque se prefiere el límite anterior a 2020 de 80 caracteres. [ 16 ]
- El cuerpo de una instrucción compuesta (como if, while y do-while) no necesita ir entre llaves. Sin embargo, si una o más subinstrucciones de una
if-elseinstrucción requieren llaves, entonces ambas subinstrucciones deben ir entre llaves:
int potencia ( int x , int y ) { int resultado ;if ( y < 0 ) { resultado = 0 ; } else { resultado = 1 ; while ( y -- > 0 ) resultado *= x ; } return resultado ; }Java
Una cantidad significativa de código Java utiliza una variante del estilo K&R en la que la llave de apertura se encuentra en la misma línea no solo para los bloques dentro de una función, sino también para las declaraciones de clases o métodos. Este estilo está muy extendido principalmente porque las guías de estilo originales de Sun Microsystems [ 17 ] [ 18 ] [ 19 ] utilizaban esta variante de K&R y, como resultado, la mayor parte del código fuente estándar de 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 .
Stroustrup
Bjarne Stroustrup adaptó el estilo K&R para C++ en sus libros, tales como Programming: Principles and Practice using C++ y The C++ Programming Language . [ 20 ]
A diferencia de las variantes anteriores, Stroustrup no utiliza un "cuddled else". Por lo tanto, Stroustrup escribiría [ 20 ]
if ( x < 0 ) { puts ( "Negativo" ); negative ( x ); } else { puts ( "No negativo" ); nonnegative ( x ); }Stroustrup amplía el estilo K&R para las clases, escribiéndolas de la siguiente manera:
clase DoubleVec { public : // construye un DoubleVec DoubleVec ( int s ) : elem ( new double [ s ]), sz ( s ) { } // acceso a elementos: indexación double & operator []( int i ) { return elem [ i ]; } int size () { return sz ; } private : // puntero a los elementos double * elem ; // número de elementos int sz ; };Stroustrup no aplica sangría a las etiquetas public:y private:. Además, en este estilo, mientras que 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 indentación 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 Directrices básicas modernas de C++ . [ 21 ]
BSD KNF
Los sistemas operativos de la distribución de software de Berkeley (BSD) utilizan un estilo que a veces se denomina "forma normal del núcleo" (KNF). Aunque está destinado principalmente al código del núcleo, también se utiliza ampliamente en el código del espacio de usuario . Esencialmente, es una variante exhaustivamente documentada del estilo K&R, tal como se utiliza en el código fuente de Unix versiones 6 y 7 de Bell Labs . [ 22 ]
El núcleo y el espacio de usuario de SunOS utilizan un estilo de indentación similar. [ 22 ] Al igual que KNF, este también se basó en documentos de estilo AT&T y a veces se denomina Bill Joy Normal Form. [ 23 ] La guía de SunOS se publicó en 1996; se analiza brevemente ANSI C. La corrección de la indentación de una lista de archivos fuente se puede verificar con el programa cstyle escrito por Bill Shannon. [ 22 ] [ 23 ] [ 24 ]
En este estilo, el tabulador rígido (ts en vi ) se mantiene en ocho columnas, mientras que un tabulador flexible (sw en vi) suele definirse como auxiliar y se establece en cuatro. Los tabuladores rígidos se utilizan para indentar bloques de código, mientras que un tabulador flexible (cuatro espacios) de indentación adicional se utiliza 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 instrucciones nativas del lenguaje C, como if, while, do, switchy returnsí lo hacen (en el caso de que returnse use con paréntesis). Las funciones que no declaran variables locales en su bloque de nivel superior también deben dejar una línea en blanco después de su llave de apertura de bloque.
Ejemplos:
mientras ( x == y ) { algo (); algo_más (); } cosa_final ();if ( data != NULL && res > 0 ) { if ( JS_DefineProperty ( cx , o , "data" , STRING_TO_JSVAL ( JS_NewStringCopyN ( cx , data , res )), NULL , NULL , JSPROP_ENUMERATE ) != 0 ) { QUEUE_EXCEPTION ( "¡Error interno!" ); goto err ; } PQfreemem ( data ); } else { if ( JS_DefineProperty ( cx , o , "data" , OBJECT_TO_JSVAL ( NULL ), NULL , NULL , JSPROP_ENUMERATE ) != 0 ) { QUEUE_EXCEPTION ( "¡Error interno!" ); goto err ; } }static JSBool pgresult_constructor ( JSContext * cx , JSObject * obj , uintN argc , jsval * argv , jsval * rval ) {EXCEPCIÓN_DE_QUEEA ( "La clase PGresult no es instanciable por el usuario" );return ( JS_FALSE ); }Allman
El estilo Allman recibe su nombre de Eric Allman . A veces también se le denomina estilo BSD, ya que Allman escribió muchas de las utilidades para BSD Unix (aunque esto no debe confundirse con el estilo "BSD KNF"; véase más arriba).
Este estilo coloca la llave asociada a una instrucción de control en la siguiente línea, con la misma sangría que la instrucción de control. Las instrucciones dentro de las llaves se indentan al siguiente nivel. [ 14 ]
mientras ( x == y ) { algo (); algo_más (); }cosa_final ();Este estilo es similar a la indentación estándar utilizada por los lenguajes Pascal y Transact-SQL , donde las llaves son equivalentes a las palabras clave beginy end.
(* Ejemplo de estilo de indentación de código Allman en Pascal *) procedure dosomething ( x , y : Integer ) ; begin while x = y do begin something () ; something_else () ; end ; end ;Las consecuencias de este estilo son que el código indentado se distingue claramente de la instrucción contenedora mediante líneas que son casi todas espacios en blanco , y la llave de cierre se alinea en la misma columna que la de apertura. Algunos consideran que esto facilita la búsqueda de llaves coincidentes. El estilo de bloqueo también delimita el bloque de código de la instrucción de control asociada. Comentar o eliminar una instrucción de control o un bloque de código, o refactorizar el código , reduce la probabilidad de introducir errores de sintaxis debido a llaves colgantes o faltantes. Además, es coherente con la colocación de llaves en el bloque de función externo.
Por ejemplo, lo siguiente sigue siendo sintácticamente correcto:
// mientras (x == y) { algo (); algo_más (); }Tal y como es esto:
// para (int i=0; i < x; i++) // mientras (x == y) si ( x == y ) { algo (); algo_más (); }Incluso así, con compilación condicional:
int c ; #ifdef HAS_GETCH while (( c = getch ()) != EOF ) #else while (( c = getchar ()) != EOF ) #endif { hacer_algo ( c ); }Variante: Allman-8
Allman-8 utiliza tabulaciones con sangría de 8 espacios y un límite de 80 columnas, características de la variante K&R del kernel de Linux. Se supone que este estilo mejora la legibilidad en proyectores. Además, el tamaño de la sangría y la restricción de columnas facilitan la identificación de bloques de código excesivamente anidados. Estas ventajas, en conjunto, ofrecen a los desarrolladores principiantes y a quienes están aprendiendo una guía implícita para gestionar la complejidad del código.
Herreros
El estilo Whitesmiths, también conocido como estilo Wishart, se utilizó originalmente en la documentación del primer compilador C comercial, el compilador Whitesmiths . También fue popular en los inicios de Windows, ya que se empleó en tres influyentes libros de programación para Windows: Programmer's Guide to Windows de Durant , Carlson y Yao , Programming Windows de Petzold y Windows 3.0 Power Programming Techniques de Norton y Yao.
Según Jargon File , en 1991 los estilos de refuerzo Whitesmiths, junto con Allman , eran los más comunes , con una popularidad aproximadamente igual en ese momento. [ 14 ] [ 25 ]
Este estilo coloca la llave asociada a una instrucción de control en la siguiente línea, con sangría. Las instrucciones dentro de las llaves se indentan al mismo nivel que las llaves.
Al igual que en el estilo Ratliff, la llave de cierre se indenta igual que las instrucciones dentro de las llaves. [ 26 ]
mientras ( x == y ) { algo (); algo_más (); }cosa_final ();Las ventajas de este estilo son similares a las del estilo Allman . Los bloques se distinguen claramente de las instrucciones de control. La alineación de las llaves con el bloque subraya que, conceptual y programáticamente, el bloque completo constituye una única instrucción compuesta. La indentación de las llaves enfatiza su subordinación a la instrucción de control. La llave de cierre ya no se alinea con la instrucción, sino con la llave de apertura.
Un ejemplo:
if ( data != NULL && res > 0 ) { if ( ! JS_DefineProperty ( cx , o , "data" , STRING_TO_JSVAL ( JS_NewStringCopyN ( cx , data , res )), NULL , NULL , JSPROP_ENUMERATE )) { QUEUE_EXCEPTION ( "¡Error interno!" ); goto err ; } PQfreemem ( data ); } else if ( ! JS_DefineProperty ( cx , o , "data" , OBJECT_TO_JSVAL ( NULL ), NULL , NULL , JSPROP_ENUMERATE )) { QUEUE_EXCEPTION ( "¡Error interno!" ); goto err ; }else ifse tratan como una instrucción, muy parecida a la #elifinstrucción del preprocesador.
ÑU
Al igual que los estilos Allman y Whitesmiths , el estilo GNU coloca las llaves en una línea aparte, con una sangría de dos espacios, excepto al abrir la definición de una función, donde no se les aplica sangría. [ 27 ] En ambos casos, el código contenido se indenta con dos espacios a partir de las llaves.
Popularizado por Richard Stallman , el diseño puede estar influenciado por su experiencia escribiendo código Lisp . [ 28 ] En Lisp, el equivalente a un bloque (un progn) es una entidad de datos de primera clase, y darle su propio nivel de indentación ayuda a enfatizarlo, mientras que en C, un bloque es solo sintaxis. Este estilo también se puede encontrar en algunos libros de texto de lenguajes de programación ALGOL y XPL de las décadas de 1960 y 1970. [ 29 ] [ 30 ]
Aunque no se trata de una sangría propiamente dicha, el estilo de codificación GNU también incluye un espacio después del nombre de una función , antes del paréntesis izquierdo de una lista de argumentos. [ 27 ]
static char * concat ( char * s1 , char * s2 ) { while ( x == y ) { something (); something_else (); } final_thing (); }Este estilo combina las ventajas de Allman y Whitesmiths , eliminando así la posible desventaja de Whitesmiths de que las llaves no sobresalgan del bloque. Una desventaja es que la llave final ya no se alinea con la instrucción a la que pertenece conceptualmente. Otra posible desventaja es que podría desperdiciar espacio al usar dos niveles visuales de sangría para un solo nivel conceptual, pero en realidad esto es improbable porque, en sistemas con sangría de un solo nivel, cada nivel suele tener al menos 4 espacios, igual que 2 * 2 espacios en el estilo GNU.
Los estándares de codificación de GNU recomiendan este estilo, y casi todos los responsables del mantenimiento del software de los proyectos GNU lo utilizan.
El editor de texto GNU Emacs y el comando de indentación del sistema GNU reformatearán el código según este estilo por defecto. [ 31 ] Quienes no utilicen GNU Emacs, o editores similares extensibles/personalizables, podrían encontrar que la configuración de indentación automática de su editor no es útil para este estilo. Sin embargo, muchos editores que por defecto usan el estilo KNF se adaptan bien al estilo GNU cuando el ancho de tabulación se establece en dos espacios; de igual manera, GNU Emacs se adapta bien al estilo KNF simplemente estableciendo el ancho de tabulación en ocho espacios. En ambos casos, el reformateo automático destruye el espaciado original, pero la indentación automática de línea funcionará correctamente.
Steve McConnell , en su libro Code Complete , desaconseja el uso de este estilo: marca un ejemplo de código que lo utiliza con un icono de "Horror de la codificación", que simboliza código especialmente peligroso, y afirma que dificulta la legibilidad. [ 26 ] La documentación sobre el estilo de codificación del kernel de Linux también desaconseja este estilo, instando a los lectores a quemar una copia de los estándares de codificación de GNU como un "gran gesto simbólico". [ 32 ]
Horstmann
La edición de 1997 de Computing Concepts with C++ Essentials de Cay S. Horstmann adapta el método de Allman colocando la primera instrucción de un bloque en la misma línea que la llave de apertura. Este estilo también se utiliza en los ejemplos del Pascal User Manual and Report de Jensen y Wirth . [ 33 ]
while ( x == y ) { something (); something_else (); //... if ( x < 0 ) { printf ( "Negativo" ); negative ( x ); } else { printf ( "No negativo" ); nonnegative ( x ); } } final_thing ();Este estilo combina las ventajas del estilo Allman , al mantener la alineación vertical de las llaves para facilitar la lectura y la identificación de los bloques, con el ahorro de una línea del estilo K&R. Sin embargo, la edición de 2003 utiliza ahora el estilo Allman en todo el texto. [ 34 ]
Pico
Este es el estilo más utilizado en el lenguaje Pico por sus diseñadores. Pico carece de sentencias de retorno y utiliza puntos y comas como separadores de sentencias en lugar de terminadores. Produce esta sintaxis: [ 35 ]
cosas(n): { x: 3 * n; y: hacer_cosas(x); y + x } Las ventajas y desventajas son similares a las de ahorrar espacio en pantalla con el estilo K&R. Una ventaja adicional es que las llaves de apertura y cierre son consistentes en su aplicación (ambas comparten espacio con una línea de código), a diferencia del estilo K&R, donde una llave comparte espacio con una línea de código y la otra ocupa una línea propia.
Ratliff
En el libro Programmers at Work , [ 36 ] C. Wayne Ratliff, el programador original de los populares lenguajes de programación de cuarta generación dBase -II y -III , analizó un estilo similar a 1TBS, pero donde la llave de cierre se alinea con la sangría del bloque anidado. Indicó que este estilo fue documentado originalmente en material de Digital Research Inc. Este estilo a veces se denomina estilo banner , [ 37 ] posiblemente por su parecido con una pancarta colgada de un poste. En este estilo, que es a Whitesmiths lo que K&R es a Allman, el control de cierre tiene la misma sangría que el último elemento de la lista (y, por lo tanto, pierde prominencia correctamente). [ 26 ] Este estilo puede facilitar la lectura visual para algunos, ya que los encabezados de cualquier bloque son lo único que se extiende a ese nivel (la teoría es que el control de cierre del bloque anterior interfiere con el flujo visual del encabezado del siguiente bloque en los estilos K&R y Allman). Kernighan y Plauger utilizan este estilo en el código Ratfor en Software Tools . [ 38 ]
// En C for ( i = 0 ; i < 10 ; i ++ ) { if ( i % 2 == 0 ) { hacer_algo ( i ); } else { hacer_algo_algo_otra ( i ); } }Estilos de lenguaje C derivados
Los siguientes estilos pueden considerarse estilos C "derivados", en el sentido de que reciben una influencia significativa de los estilos de indentación de otros lenguajes distintos de C. Podrían aplicarse a código C escrito como parte de un proyecto desarrollado principalmente en alguno de estos otros lenguajes, donde mantener una apariencia coherente en el código principal del proyecto prevalece sobre la conveniencia de utilizar un estilo C más convencional.
Estilo Lisp
Si bien el estilo GNU a veces se caracteriza como código C indentado por un programador de Lisp, incluso se podría llegar a insertar llaves de cierre juntas en la última línea de un bloque. Este estilo hace que la indentación sea la única forma de distinguir bloques de código, pero tiene la ventaja de no contener líneas irrelevantes. Podría denominarse fácilmente estilo Lisp, ya que es muy común en el código Lisp. En Lisp, la agrupación de llaves idénticas al final de los árboles de expresiones indica que el usuario no tiene que seguir visualmente los niveles de anidamiento, sino únicamente comprender la estructura del árbol.
La variante tradicional de Lisp de este estilo prefiere niveles de indentación extremadamente estrechos (normalmente dos espacios) porque el código Lisp suele anidarse muy profundamente, ya que Lisp solo presenta expresiones , sin una clase distinta de sentencias ; los argumentos de las funciones se indentan en su mayoría al mismo nivel para ilustrar su estatus compartido dentro de la expresión que los contiene. Esto también se debe a que, aparte de las llaves, Lisp es convencionalmente un lenguaje muy conciso, que omite incluso formas comunes de código repetitivo simple por considerarlo poco informativo, como la elsepalabra clave en un bloque, y en su lugar la representa uniformemente como .if : then | else(if expr1 expr2 expr3)
// C for ( i = 0 ; i < 10 ; i ++ ) { if ( i % 2 == 0 ) { hacer_algo ( i );} else { hacer_algo_más ( i ); hacer_tercera_cosa ( i );}}
;; Lisp ( hacer veces ( i 10 ) ( si ( = ( rem i 2 ) 0 ) ( hacer-algo i ) ( progn ( hacer-algo-más i ) ( hacer-tercera-cosa i ))))Nota: prognes un procedimiento para evaluar secuencialmente múltiples subexpresiones en busca de efectos , descartando todos los valores de retorno excepto el último (enésimo). Si se desean todos los valores de retorno, valuesse utilizaría el procedimiento.
Estilo Haskell
El diseño de Haskell puede hacer que la colocación de llaves sea opcional, aunque las llaves y los puntos y comas están permitidos en el lenguaje. [ 39 ] Los dos segmentos siguientes son igualmente aceptables para el compilador:
sin llaves = hacer texto <- obtenerContenidos dejar primeraPalabra = cabeza $ palabras texto palabraGrande = mapear aPrimeraPalabra ponerStrLn palabraGrandebraceful = do { text <- getContents ; let { firstWord = head $ words text ; bigWord = map toUpper firstWord } ; putStrLn bigWord }En Haskell, el estilo puede reemplazar las llaves. Por lo general, las llaves y los puntos y comas se omiten para las secciones procedimentalesdo y el texto del programa en general, pero el estilo se usa comúnmente para listas, registros y otros elementos sintácticos compuestos por algún par de paréntesis o llaves, que se separan con comas o puntos y comas. [ 40 ] Si el código que sigue a las palabras clave where, let, o ofomite llaves y puntos y comas, entonces la indentación es importante. [ 41 ]
Estilo APL
Como ejemplo de lo conciso que suele ser APL, aquí está la implementación de la función paso a paso para el Juego de la Vida de Conway :
vida ← { ⊃ 1 ⍵ ∨ . ∧ 3 4 =+ / + ⌿ ¯1 0 1 ∘. ⊖ ¯1 0 1 ⌽ ¨ ⊂ ⍵ }El estilo C de APL se asemeja al estilo conciso del código APL y se usa comúnmente en sus implementaciones. [ 42 ] Este estilo fue creado por Arthur Whitney y se usa ampliamente en la implementación de K , el proyecto del propio Arthur. El lenguaje de programación J también se implementa con este estilo. Cabe destacar que no todas las implementaciones de APL usan este estilo de C, a saber: GNU APL y Dyalog APL.
Además de la indentación estilo APL C, normalmente los nombres se acortan a uno o dos caracteres: para reducir la cantidad de indentación y las expresiones que abarcan varias líneas. [ 43 ]
Tamaño de la indentación
Normalmente, los programadores utilizan el mismo ancho de espacio en blanco para indentar cada bloque de código, aunque los anchos más comunes varían de 1 a 4 espacios.
Un experimento realizado en 1983 con código PASCAL reveló que el tamaño de la sangría afectaba significativamente la comprensibilidad. Se demostró que los tamaños de sangría entre 2 y 4 caracteres eran óptimos. [ 44 ]
Si bien ambos afectan la disposición general del código, el tamaño de la sangría es independiente del estilo de sangría que se analiza aquí.
Tabulador vs. espacio
Normalmente, un programador utiliza un editor de texto que proporciona tabulaciones a intervalos fijos (un número determinado de espacios) para mantener el espaciado entre caracteres según un estilo específico. Este intervalo se denomina ancho de tabulación . A veces, el programador almacena el código con caracteres de tabulación ( uno por cada pulsación de la tecla Tab) o bien almacena una secuencia de espacios cuyo número es igual al ancho de tabulación.
Almacenar caracteres de tabulación en el código puede provocar una desalineación visual al visualizarlo en diferentes contextos, lo que contrarresta el valor del estilo de indentación.
Los programadores no llegan a un consenso sobre cómo almacenar los caracteres de tabulación. Quienes defienden el almacenamiento de caracteres de tabulación argumentan que facilita la escritura y reduce el tamaño de los archivos de texto, ya que un solo carácter de tabulación cumple la función de varios espacios. Quienes se oponen, como Jamie Zawinski , afirman que usar espacios en su lugar aumenta la portabilidad entre plataformas . [ 45 ] Otros, como los autores de los estándares de codificación de WordPress , sostienen lo contrario: que las tabulaciones fijas aumentan la portabilidad. [ 46 ] Un estudio de los 400 000 repositorios más importantes de GitHub reveló que los espacios son más comunes. [ 47 ]
Muchos editores de texto, como Notepad++ , TextEdit , Emacs , vi y nano , se pueden configurar para almacenar los caracteres de tabulación al introducirlos con la tecla Tab o para convertirlos en espacios (según el ancho de tabulación configurado), de modo que no se añadan caracteres de tabulación al archivo al pulsar dicha tecla. Algunos editores pueden convertir caracteres de tabulación en espacios y viceversa.
Algunos paginadores de archivos de texto , como less , permiten configurar el ancho de las tabulaciones. Algunas herramientas, como expand / unexpand, permiten realizar conversiones sobre la marcha mediante filtros.
Automatización de estilos
Una herramienta puede automatizar el formato del código según un estilo de indentación, por ejemplo, el comando de Unixindent .
Emacs proporciona comandos para modificar la indentación, incluyendo presionar Taben una línea determinada. M-x indent-regionindentar código.
Las tabulaciones elásticas son un estilo de tabulación que requiere compatibilidad con el editor de texto, donde bloques completos de texto se mantienen alineados automáticamente cuando cambia la longitud de una línea en el bloque.
Perder la noción de los bloques
En código más complejo, el programador puede perder la noción de los límites de los bloques al leer el código. Esto suele ocurrir en secciones extensas de código que contienen muchas sentencias compuestas anidadas en varios niveles de indentación. A medida que el programador se desplaza hacia el final de un conjunto enorme de sentencias anidadas, puede perder el contexto , como la estructura de control en la parte superior del bloque.
Las sentencias compuestas largas pueden ser un indicio de código excesivamente complejo, lo cual se puede solucionar mediante la refactorización .
Los programadores que se basan en contar las llaves de apertura pueden tener dificultades con estilos de indentación como K&R, donde la llave inicial no se separa visualmente de su instrucción de control . Los programadores que se basan más en las indentaciones se beneficiarán más de los estilos verticalmente compactos, como K&R, porque los bloques son más cortos.
Para evitar perder el control de las instrucciones de control, como for, se puede usar una sangría grande, como una tabulación de 8 unidades, además de dividir las funciones grandes en funciones más pequeñas y legibles. Linux se hace de esta manera, utilizando el estilo K&R.
Algunos editores de texto permiten al programador saltar entre las dos llaves correspondientes de un bloque. Por ejemplo, `vi` salta a la llave que encierra el mismo bloque que el que está bajo el cursor al presionar la %tecla. Dado que la tecla del cursor de texto next(es decir, la ntecla) conservaba información de posicionamiento direccional (si la tecla upo se había presionado previamente), la macro de punto (la tecla) podría usarse para colocar el cursor de texto en la siguiente llave, [ 48 ] siempre que se utilizara un estilo de codificación adecuado. En cambio, se puede inspeccionar los límites del bloque usando la tecla para imponer un estándar de codificación.down.%
Otra forma de mantener la noción de bloque es usar comentarios después de la llave de cierre. Por ejemplo:
para ( int i = 0 ; i < total ; i ++ ) { foo (); } //para (i)if ( x < 0 ) { bar (); } //if (x < 0)Una desventaja es tener que mantener el mismo código en varias ubicaciones , tanto encima como debajo del bloque.
Algunos editores ofrecen funciones para mantener la visibilidad de los bloques. Un editor plegable puede ocultar (plegar) y mostrar (desplegar) bloques según el nivel de indentación. Algunos editores resaltan las llaves coincidentes cuando el cursor se sitúa junto a una.
Véase también
Referencias
- ↑ Weissman, Laurence Mark (1974). Una metodología para estudiar la complejidad psicológica de los programas informáticos . CSRG-37 (Informe técnico). Grupo de Investigación de Sistemas Informáticos, Universidad de Toronto . OCLC 1085612768. technicalreportc37univ – vía Internet Archive .
- ↑ Morzeck, Johannes; Hanenberg, Stefan; Werger, Ole; Gruhn, Volker (2023). Indentación en el código fuente: un ensayo controlado aleatorio sobre la legibilidad de los flujos de control en código Java con grandes efectos . Actas de la 18.ª Conferencia Internacional sobre Tecnologías de Software - ICSOFT. Roma , Italia. pp. 117–128 . doi : 10.5220/0012087500003538 . ISBN 978-989-758-665-1– vía Stefan Hanenberg en Google Drive (preimpresión).
- ↑ Hanenberg, Stefan; Morzeck, Johannes; Gruhn, Volker (9 de agosto de 2024). "Sangría y tiempo de lectura: un ensayo controlado aleatorio sobre las diferencias entre sentencias if generadas con y sin sangría" . Ingeniería de software empírica . 29 (5): 134. doi : 10.1007/s10664-024-10531-y . ISSN 1573-7616 .
- ↑ Hanenberg, Stefan; Morzeck, Johannes; Werger, Ole; Gries, Stefan; Gruhn, Volker (2024). "Sangría y tiempo de lectura: un experimento controlado sobre las diferencias entre objetos JSON generados con y sin sangría" . En Fill, Hans-Georg; Domínguez Mayo, Francisco José; van Sinderen, Marten; Maciaszek, Leszek A. (eds.). Tecnologías de software . Comunicaciones en informática y ciencias de la información. Vol. 2104. Cham: Springer Nature Switzerland. pp. 50–75 . doi : 10.1007/978-3-031-61753-9_4 . ISBN 978-3-031-61753-9.
- ↑ "Guía de estilo de Java" . Archivado del original el 12 de julio de 2018.
Se acepta el uso de llaves egipcias o llaves de estilo C.
- ↑ "Corchetes egipcios" . Foldoc .
Un término humorístico
[
sic
]
para el estilo de sangría K&R, que se refiere a la postura de "una mano arriba delante, una abajo detrás".
- ↑ "Guía de estilo de JavaScript de Google" .
Las llaves siguen el estilo de Kernighan y Ritchie ("corchetes egipcios") para bloques no vacíos y estructuras similares a bloques.
- ↑ Darwin, Ian F. (1988). Checking C programs with Lint . California: O'Reilly and Associates. p. 51. ISBN 9780937175309.
- ↑ "1TBS" .
- ↑ "Estilo artístico" . Consultado el 4 de agosto de 2025 .
- ↑ "Estilos de llaves y JavaScript" . 7 de enero de 2013. Consultado el 8 de noviembre de 2018 .
- ↑ "ESLint estilo de corchetes" . Consultado el 24 de febrero de 2026 .
- ↑ "El único estilo de tirantes verdadero: Ailanto" . 6 de abril de 1998. Consultado el 4 de agosto de 2025 .
- 1 2 3 "The Jargon File" . 4.4.7. 29 de diciembre de 2003. Consultado el 18 de agosto de 2014 .
- ↑ En kernel.org se ofrece una descripción detallada del estilo.
- ↑ Larabel, Michael. "El kernel de Linux desaconseja el estilo de codificación de línea de 80 caracteres" . Phoronix . Phoronix Media . Consultado el 1 de mayo de 2022 .
- ↑ Reddy, Achut (30 de marzo de 2000). "Guía de estilo de codificación Java" (PDF) . Sun Microsystems. Archivado del original (PDF) el 28 de febrero de 2006. Recuperado el 30 de mayo de 2008 .
- ↑ "Convenciones de código Java" (PDF) . Sun Microsystems. 12 de septiembre de 1997. Archivado del original (PDF) el 13 de mayo de 2008. Consultado el 30 de mayo de 2008 .
- ↑ "Convenciones de código para el lenguaje de programación Java" . Sun Microsystems. 20 de marzo de 1997. Consultado el 30 de mayo de 2008 .
- ^ Stroustrup , Bjarne (septiembre de 2010). "Guía de estilo PPP" (PDF) .
- ^ Stroustrup, Bjarne. "Pautas básicas de C++" . GitHub . Consultado el 3 de noviembre de 2018 .
- 1 2 3 Shannon, Bill (19 de agosto de 1996). "Estilo C y estándares de codificación para SunOS" (PDF) . 1.8. Sun Microsystems, Inc. Recuperado el 15 de junio de 2019 .
- 1 2 Gregg, Brendan. "Guía de estilo de DTraceToolkit" . Recuperado el 6 de febrero de 2015 .
- ↑ Shannon, Bill (9 de septiembre de 1998). "cstyle.pl" . illumos-gate . 1.58. Sun Microsystems, Inc. Recuperado el 6 de febrero de 2015 .
- ↑ "The Jargon File (Versión 2.4.3)" . 2.4.3. 23 de enero de 1991. Consultado el 14 de mayo de 2024 .
- 1 2 3 McConnell, Steve (2004). Code Complete: A practical handbook of software construction . Redmond, WA: Microsoft Press. pp. 746–747 . ISBN 978-0-7356-1967-8.
- 1 2 "Formato de su código fuente" . Estándares de codificación GNU . Consultado el 6 de junio de 2016 .
- ↑ Stallman, Richard (28 de octubre de 2002). "Mis experiencias con Lisp y el desarrollo de GNU Emacs (Transcripción del discurso en la Conferencia Internacional de Lisp)" . Recuperado el 6 de junio de 2016 .
- ↑ Baumann, Richard [en alemán] ; Feliciano, Manuel; Bauer, Friedrich Ludwig ; Samelson, Klaus (1964). Introducción a ALGOL: una introducción para el no especialista, que enfatiza los usos prácticos del lenguaje algorítmico . Serie de Computación Automática. Englewood Cliffs, Nueva Jersey, EE. UU.: Prentice-Hall, Inc. ISBN 0-13-477828-6. LCCN 64-10740 . ark:/13960/t6qz35p37 . Consultado el 23 de octubre de 2022 .
{{cite book}}: Incompatibilidad de ISBN/Fecha ( ayuda ) - ↑ WM McKeeman, JJ Horning y DB Wortman, Un generador de compiladores , 1970, https://archive.org/details/compilergenerato00mcke
- ↑ Probado en el código fuente de ejemplo anterior en Ubuntu 18.04 con GNU indent 2.2.11 y GNU Emacs 25.2.2 iniciado con
emacs --no-init-file. - ↑ "Estilo de codificación del kernel de Linux" . Consultado el 1 de enero de 2017 .
- ^ Jensen, Kathleen; Wirth, Niklaus (1974). Manual de usuario e informe de PASCAL . Springer-Verlag.
- ↑ Guía de estilo de Horstmann
- ↑ Ohno, Asako (2013). "Una metodología para enseñar un estilo de codificación ejemplar considerando las fluctuaciones en las características del estilo de codificación de los estudiantes". 2013 IEEE Frontiers in Education Conference (FIE) . pp. 1908–1910 . doi : 10.1109/fie.2013.6685167 . ISBN 9781467352611. S2CID 28385526 .
- ↑ Lammers, Susan (1986). Programmers at Work . Microsoft Press. ISBN 978-0-914845-71-3.
- ↑ Pattee, Jim. "Estilo artístico 2.05 Documentación" . Estilo artístico . Consultado el 24 de abril de 2015 .
- ↑ Kernighan, Brian W.; Plauger, PJ (1976). Herramientas de software . Addison-Wesley. ISBN 9780201036695.
- ↑ "El informe Haskell 98" . haskell.org . Consultado el 3 de marzo de 2016 .
- ↑ Lipovača, Miran. "Creando nuestros propios tipos y clases de tipos" . learnyouahaskell.com . Consultado el 3 de febrero de 2016 .
- ↑ Informe Haskell 1.2 (1992), pág. 131 B.4 "Diseño"
- ↑ «El Incunable J» . jsoftware.com . Consultado el 19 de mayo de 2022 .
- ↑ "El código fuente de J" . github.com . Consultado el 12 de septiembre de 2024 .
- ↑ Miara, Richard J.; Musselman, Joyce A.; Navarro, Juan A. y Shneiderman, Ben (noviembre de 1983). "Sangría y comprensibilidad del programa" (PDF) . Communications of the ACM . 26 (11): 861– 867. doi : 10.1145/182.358437 . S2CID 11767796. Recuperado el 3 de agosto de 2017 .
- ↑ Zawinski, Jamie (2000). "Tabulaciones versus espacios: una eterna guerra santa" . Recuperado el 6 de junio de 2016 .
- ↑ "Estándares de codificación de WordPress" . Consultado el 6 de junio de 2016 .
- ↑ Hoffa, Felipe (26 de julio de 2017). "400.000 repositorios de GitHub, 1.000 millones de archivos, 14 terabytes de código: ¿Espacios o tabulaciones?" . Medium . Consultado el 9 de julio de 2019 .
- ↑ Lamb, Linda (1998). Aprendiendo a usar el editor vi . O'Reilly. ISBN 9781565924260.
Enlaces externos
- Estilo C: Estándares y directrices: Definición de estándares de programación para programadores profesionales de C , Prentice Hall, ISBN 0-13-116898-3/ ISBN 978-0-13-116898-5(El texto completo también está disponible en línea). Straker, David (1992).
- Sangría contextual
- Estándares de codificación GNU
Tabulaciones y espacios
- Tabulaciones contra espacios: Una eterna guerra santa, por Jamie Zawinski
- Por qué prefiero no usar tabulaciones en el código fuente, por Adam Spiers
- Por qué me encanta tener pestañas en el código fuente (archivado)
- Tabulaciones elásticas: la solución al problema de las tabulaciones frente a los espacios.
- guerras de software
- Características del editor de texto
- Código fuente