Regla 0x0017h: Agrupá sentencias relacionadas y separá bloques lógicos
Sintaxis y formato visual (0x00XX)
0x0017h: Agrupá sentencias relacionadas y separá bloques lógicos¶
Enunciado normativo¶
Dentro de cada función, las sentencias que colaboran en una misma tarea DEBEN agruparse en párrafos, y los párrafos que cumplen tareas distintas DEBEN separarse con una línea en blanco. NO DEBE escribirse un muro continuo de sentencias sin estructura visual.
¿Por qué existe esta regla?¶
El problema¶
El ojo humano segmenta por espacios en blanco. Un bloque de treinta líneas sin separación se percibe como una masa uniforme donde no se distinguen las etapas. Con párrafos, el lector ve de un vistazo cuántos pasos tiene la función y dónde empieza cada uno.
Agrupar y separar también revela oportunidades de refactorización: si un párrafo tiene nombre propio, probablemente merezca una función (0x2015h: No dupliques lógica: extraé una función).
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Lectura | El lector no distingue las fases del algoritmo. |
| Depuración | Es difícil poner un punto de corte “entre etapas”. |
| Mantenimiento | Insertar código nuevo se vuelve arriesgado sin fronteras claras. |
| Refactorización | No se ve la estructura de responsabilidades. |
Fundamento en la cátedra¶
Es una aplicación directa de 0x0001h: La claridad y prolijidad son de máxima importancia (prolijidad) a la organización vertical del cuerpo. El uso consistente de líneas en blanco es una de las señales de código cuidado más fáciles de aplicar.
Alcance y excepciones¶
Aplica al cuerpo de las funciones y a los bloques de control. No se exige línea en blanco entre cada sentencia. Las funciones de tres líneas no necesitan particionarse. Un comentario de sección puede reemplazar a la línea en blanco cuando además explica la intención (0x0201h: Escribí comentarios que expliquen el ‘porqué’, no el ‘qué’).
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Muro de sentencias¶
int procesar(const int v[], size_t n)
{
int suma = 0;
int maximo = v[0];
for (size_t i = 0; i < n; i++) {
suma += v[i];
if (v[i] > maximo) {
maximo = v[i];
}
}
double promedio = (double)suma / (double)n;
printf("promedio=%f\n", promedio);
printf("maximo=%d\n", maximo);
if (promedio > maximo / 2) {
return 1;
}
return 0;
}Por qué falla: cálculo, formato y decisión están pegados; no se distingue dónde termina el cómputo y dónde empieza la presentación.
❌ Contraejemplo 2 — Separación arbitraria¶
int suma = 0;
int i = 0;
while (i < n) {
suma += v[i];
i++;
}Por qué falla: separar cada sentencia destruye la agrupación lógica; el párrafo del lazo pierde cohesión y el archivo crece sin aportar claridad.
✅ Ejemplo conforme 1 — Párrafos con propósito¶
int procesar(const int v[], size_t n)
{
/* Calculo */
int suma = 0;
int maximo = v[0];
for (size_t i = 0; i < n; i++) {
suma += v[i];
if (v[i] > maximo) {
maximo = v[i];
}
}
/* Presentacion */
double promedio = (double)suma / (double)n;
printf("promedio=%f\n", promedio);
printf("maximo=%d\n", maximo);
/* Decision */
if (promedio > (double)maximo / 2.0) {
return 1;
}
return 0;
}Las tres etapas se distinguen a simple vista y cada bloque podría convertirse en su propia función si creciera.
✅ Ejemplo conforme 2 — Separación sin comentarios¶
double promedio(const int v[], size_t n)
{
int suma = 0;
for (size_t i = 0; i < n; i++) {
suma += v[i];
}
return (double)suma / (double)n;
}La única línea en blanco separa el cómputo del retorno; es suficiente y no necesita comentario.
⚠️ Casos límite¶
Párrafos de una línea: agrupar una sola sentencia con línea en blanco es válido si representa una etapa genuina.
Consistencia: si se separa un tipo de etapa, deben separarse todas las del mismo tipo; no alternar caprichosamente.
Dentro de un lazo: la línea en blanco no debe partir al cuerpo del lazo de su condición.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
giger | métricas por función | Funciones densas sin líneas en blanco. |
gaff | gaff check archivo.c | Reglas 0x0001h y 0x0002h. |
Checklist de autocontrol¶
¿Se distinguen las etapas de la función a simple vista?
¿Agrupé las sentencias de cada etapa?
¿Separé los párrafos con exactamente una línea en blanco?
¿El uso de líneas en blanco es consistente?
Reglas relacionadas¶
0x0001h: La claridad y prolijidad son de máxima importancia — claridad y prolijidad.
0x0002h: Una declaración de variable por línea — una declaración por línea.
0x2015h: No dupliques lógica: extraé una función — extraer a función cuando un párrafo tiene nombre.
0x0201h: Escribí comentarios que expliquen el ‘porqué’, no el ‘qué’ — comentarios de intención que rotulan los párrafos.