Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Regla 0x010Eh: Prescindí de identificadores genéricos con sufijo numérico o afijos (numero1, num_1, n_a, a_n)

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

0x010Eh: Prescindí de identificadores genéricos con sufijo numérico o afijos (numero1, num_1, n_a, a_n)

Enunciado normativo

NO DEBEN usarse identificadores genéricos seguidos de un número o combinados con afijos para distinguir instancias: numero1, numero2, num_1, n_a, a_n, var1, dato1. DEBE usarse un nombre que refleje el rol semántico o, si los elementos forman una colección, un arreglo.

¿Por qué existe esta regla?

El problema

Un sufijo numérico no aporta información: dice que hay un objeto “número 1” y otro “número 2”, pero no qué representan ni por qué son dos. El lector debe reconstruir la relación entre ellos leyendo el cuerpo del programa, y el autor queda a un intercambio de distancia de un bug: basta escribir numero2 donde iba numero1 para trocar dos valores sin que el compilador proteste. Los afijos transpuestos (n_a, a_n) agravan el problema porque ni siquiera sugieren un orden; son ruido. Si los objetos son parte de una misma colección, la representación correcta no es una familia de variables sino un arreglo con un índice.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Bug silenciosoConfundir numero1 con numero2 compila y produce resultados incorrectos.
LegibilidadEl lector no sabe qué relación guardan los objetos entre sí.
MantenibilidadAgregar un tercer valor obliga a inventar numero3 y repetir el código.
EscalabilidadUna colección modelada como variables sueltas impide iterar con un lazo.

Fundamento en el estándar y en la cátedra

ISO/IEC 9899:2011 §6.4.2 (Identifiers) permite cualquier nombre ASCII, así que técnicamente numero1 es válido; el problema no es sintáctico sino de diseño. La cátedra lo prohibe porque contradice 0x0101h: Los identificadores deben ser descriptivos: el nombre debe describir el rol. Cuando los elementos son una colección, la abstracción adecuada es el arreglo (§6.5.2.1) indexado por variable, y no una familia de identificadores numerados.

Alcance y excepciones

Aplica a variables, parámetros y campos nombrados con sufijo numérico o afijos intercambiables. No aplica a identificadores donde el número es parte del nombre técnico: float32_t, sha256, version2, matriz[2][2] (el literal es un índice, no parte del nombre), ni a constantes como MAX_LINEAS_V2. Tampoco alcanza a los contadores de iteración i, j, k, que ya están reservados para locales por 0x010Bh: Proporcionalidad en longitud de identificadores según su alcance.

Ejemplos exhaustivos

❌ Contraejemplo 1 — Familia de números

int numero1 = 10, numero2 = 2;
int resultado = numero1 / numero2;

Por qué falla: no se sabe qué representan numero1 y numero2 —¿dividendo y divisor?— y la declaración múltiple viola además 0x0002h: Una declaración de variable por línea. Intercambiar los nombres cambia el resultado sin error de compilación.

❌ Contraejemplo 2 — Afijos transpuestos

int n_a = 10;
int a_n = 2;
int total = n_a / a_n;

Por qué falla: n_a y a_n son el mismo conjunto de letras en otro orden; nadie recuerda cuál es cuál. El nombre no describe el rol y su similitud invita al error tipográfico.

✅ Ejemplo conforme 1 — Nombres con rol semántico

int dividendo = 10;
int divisor = 2;
int cociente = dividendo / divisor;

Por qué cumple: cada nombre declara su papel en la operación y no hay forma de confundir dos roles distintos; una declaración por línea conforme a 0x0002h: Una declaración de variable por línea.

✅ Ejemplo conforme 2 — Colección modelada como arreglo

#define CANTIDAD_VALORES 2

int valores[CANTIDAD_VALORES] = {10, 2};

for (size_t i = 0; i < CANTIDAD_VALORES; i++) {
    printf("%d\n", valores[i]);
}

Por qué cumple: cuando los objetos son una colección, el arreglo con índice variable los representa y permite iterarlos; no hay valor1 ni valor2. Interactúa con 0x010Fh: Prohibición de constantes numéricas mágicas en índices de arreglos (índices simbólicos) y 0x5001h: Los arreglos estáticos deben ser creados con un tamaño fijo en tiempo de compilación (tamaño fijo).

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cReporta identificadores que terminan en dígito o combinan afijos genéricos.
gcc / clanggcc -Wall -Wextra -std=c11 -c archivo.cNo reporta: es una regla de nomenclatura.
Revisión manualBuscar nombres que sólo se distingan por un número o por el orden de sus letras.

Checklist de autocontrol

Reglas relacionadas