Regla 0x010Eh: Prescindí de identificadores genéricos con sufijo numérico o afijos (numero1, num_1, n_a, a_n)
Nomenclatura e identificadores (0x01XX)
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 consecuencia | Efecto concreto |
|---|---|
| Bug silencioso | Confundir numero1 con numero2 compila y produce resultados incorrectos. |
| Legibilidad | El lector no sabe qué relación guardan los objetos entre sí. |
| Mantenibilidad | Agregar un tercer valor obliga a inventar numero3 y repetir el código. |
| Escalabilidad | Una 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¶
Números técnicos:
float32_t,sha256,MAX_LINEAS_V2no son defectos.Índices literales:
matriz[2][2]usa números como índices; su tratamiento está en 0x010Fh: Prohibición de constantes numéricas mágicas en índices de arreglos.Coordenadas matemáticas:
x1/x2en una fórmula pueden tolerarse, aunque se prefierenextremo_inicial/extremo_final.Versiones de tipo:
struct punto_v2es aceptable si la versión es parte del dominio.Contadores locales:
i,j,ksiguen permitidos (0x010Bh: Proporcionalidad en longitud de identificadores según su alcance).
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Reporta identificadores que terminan en dígito o combinan afijos genéricos. |
gcc / clang | gcc -Wall -Wextra -std=c11 -c archivo.c | No reporta: es una regla de nomenclatura. |
| Revisión manual | — | Buscar nombres que sólo se distingan por un número o por el orden de sus letras. |
Checklist de autocontrol¶
Ningún nombre termina en un número que sólo sirva para enumerar.
Cada variable dice qué representa, no cuál es su posición.
Si son varios elementos, usé un arreglo en vez de
x1,x2,x3.No dejé afijos transpuestos como
n_a/a_n.Cada declaración va en su propia línea (0x0002h: Una declaración de variable por línea).
Reglas relacionadas¶
0x0101h: Los identificadores deben ser descriptivos — identificadores descriptivos.
0x0002h: Una declaración de variable por línea — una declaración por línea.
0x0102h: Los argumentos de función y las variables locales deben usar snake_case en minúsculas —
snake_caseen minúsculas.0x010Fh: Prohibición de constantes numéricas mágicas en índices de arreglos — índices simbólicos en lugar de magic numbers.
0x010Bh: Proporcionalidad en longitud de identificadores según su alcance — proporcionalidad del nombre según el alcance.