Introducción¶
Este documento establece un conjunto de reglas de estilo, diseñadas para que su código en C sea más claro, legible y menos propenso a errores. La programación en C ofrece una gran flexibilidad, pero ello también facilita la adopción de malas prácticas que pueden conducir a errores de difícil detección. Por este motivo, la adhesión a un conjunto de reglas claras es fundamental para mantener el código ordenado y seguro.
La idea detrás de estas reglas es que un código de calidad no solo debe ser funcional, sino también comprensible para cualquier profesional que deba leerlo, ya sea vos mismo en el futuro o un colega que se incorpore al proyecto. Un código limpio y bien organizará facilita la colaboración, ahorra tiempo en la fase de corrección y previene complicaciones durante la depuración o actualización del software.
Estas reglas abarcan desde la nomenclatura de variables y funciones hasta la estructuración de condicionales y lazos. Su observancia no solo contribuye a la coherencia del proyecto, sino que también resulta en un código más robusto y mantenible a largo plazo.
Al comenzar, la aplicación de reglas estrictas en un lenguaje flexible como C te proporciona un marco sólido. A medida que tu comprensión del lenguaje se profundice, podés adaptar estas reglas para desarrollar un estilo propio.
Apertura a Sugerencias y Debate¶
Estamos abiertos a debatir todas las reglas. Para ello, solo tenés que abrir un hilo en Discussions o un ticket en el Issue Tracker. Aceptamos propuestas de nuevas reglas, clasificaciones, explicaciones y potenciales excepciones.
Principios Clave¶
Claridad: El código debe ser fácil de leer.
Mantenibilidad: Debe ser sencillo de modificar y extender.
Consistencia: El uso de un estilo uniforme optimiza la colaboración.
Eficiencia: Se debe optimizar el rendimiento sin sacrificar la legibilidad.
Estructura de Clasificación de Reglas (Máscara de Bits)¶
Para facilitar la referencia cruzada y el análisis estático de las pautas de estilo, las reglas se encuentran organizadas en secciones temáticas progresivas bajo un esquema de máscara de bits de 16 bits (0xXXXX):
Sintaxis Básica y Nomenclatura (
0x00XX): Reglas visuales, espaciado, indentación y pautas de nombrado de variables y constantes.Estructuras de Control y Lazos (
0x10XX): Bloques condicionales, estructuras de iteración y flujos de ejecución de sentencias.Funciones y Modularización (
0x20XX): Diseño de interfaces de funciones, documentación de contratos, alcance y responsabilidades.Punteros y Gestión de Memoria (
0x30XX): Uso de indirecciones, alocación en el heap, gestión de punteros nulos y liberación segura de recursos.Gestión de Archivos y Errores (
0x40XX): Apertura/cierre de flujos de archivos, validación de E/S, gestión de errno y diagnóstico del sistema.Compilación y Buenas Prácticas de Ingeniería (
0x50XX): Configuración de alertas, guardas de cabeceras, robustez y estructuras de código estándar.
Sintaxis Básica y Nomenclatura¶
Sintaxis Básica y Nomenclatura (
0x00XX)Regla
0x0000h: La claridad y prolijidad son de máxima importanciaRegla
0x0003h: Siempre debés inicializar las variables a un valor conocidoRegla
0x0004h: Un espacio antes y después de cada operador binarioRegla
0x0006h: El asterisco de los punteros debe declararse junto al identificadorRegla
0x0007h: Los argumentos de función y las variables locales deben usarsnake_caseen minúsculasRegla
0x0008h: Las constantes (consto#define) deben nombrarse enMAYUSCULAS_SNAKE_CASERegla
0x0009h: Las líneas de código no deben exceder los 79 caracteresRegla
0x000Ah: Escribí comentarios que expliquen el “porqué”, no el “qué”
Estructuras de Control y Lazos¶
Estructuras de Control y Lazos (
0x10XX)Regla
0x1001h: Todas las estructuras de control deben utilizar llavesRegla
0x1002h: Evitá el uso descontrolado debreakycontinue; preferí lazos con bandera de controlRegla
0x1004h: Las condiciones complejas deben ser simplificadas o comentadasRegla
0x1007h: No utilizar el operador condicional (ternario)?:Regla
0x1008h: Toda instrucciónswitchdebe incluir un casodefault
Funciones y Modularización¶
Funciones y Modularización (
0x20XX)Regla
0x2003h: Todas las funciones deben incluir documentación completa y estructuradaRegla
0x2007h: Mantené el alcance de las variables al mínimo posibleRegla
0x2009h: Los ejercicios deben ser resueltos mediante funcionesRegla
0x200Ah: Los nombres de funciones y procedimientos deben usarsnake_caseen minúsculas
Punteros y Gestión de Memoria¶
Punteros y Gestión de Memoria (
0x30XX)Regla
0x3001h: Siempre verificá la asignación exitosa de memoria dinámicaRegla
0x3003h: No mezcles operaciones de asignación y comparación en una sola líneaRegla
0x3004h: Utilizátypedefpara definir tipos de estructuras con el sufijo_tRegla
0x3005h: Minimizá el uso de múltiples niveles de indirección (punteros a punteros)Regla
0x3006h: Documentá la propiedad de los recursos al utilizar punterosRegla
0x3008h: Los punteros nulos deben ser inicializados y comparados conNULL, no con0Regla
0x3009h: Documentá explícitamente los casos en que una función puede retornarNULLRegla
0x300Ah: Utilizácastexplícito al convertir tipos de punterosRegla
0x300Bh: Usá siempresizeofen las asignaciones de memoria dinámica, prefiriendosizeof(*ptr)Regla
0x300Ch: Verificá siempre los límites de los arreglos antes de acceder a sus elementosRegla
0x300Fh: Liberá la memoria en el orden inverso a su asignaciónRegla
0x3010h: Las variables que representan tamaños o índices de arreglos deben ser de tiposize_tRegla
0x0035h: Diseñá los Tipos de Datos Abstractos utilizando punteros opacosRegla
0x0036h: AsignáNULLal puntero tras liberar un recurso opaco en el ámbito del cliente
Gestión de Archivos y Errores¶
Compilación y Buenas Prácticas de Ingeniería¶
Compilación y Buenas Prácticas de Ingeniería (
0x50XX)Regla
0x5001h: Los arreglos estáticos deben ser creados con un tamaño fijo en tiempo de compilaciónRegla
0x5002h: Desarrollá y compilá siempre con todas las advertencias del compilador activadasRegla
0x5003h: Utilizá guardas de inclusión en todos los archivos de cabeceraRegla
0x5004h: Todas las operaciones con cadenas deben ser segurasRegla
0x5005h: Organizá la estructura de tus archivos.cde forma estándarRegla
0x5006h: Preferífgetssobregetsyscanfpara leer cadenas