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 0x0111h: Nombrá en positivo y evitá las dobles negaciones

Nomenclatura e identificadores (0x01XX)

Universidad Nacional de Río Negro

0x0111h: Nombrá en positivo y evitá las dobles negaciones

Enunciado normativo

Los identificadores DEBEN formularse en positivo. NO DEBE usarse una negación en el nombre seguida de una negación en la condición (if (!no_hay_error)). Cuando exista una forma positiva natural, DEBE preferirse.

¿Por qué existe esta regla?

El problema

Cada negación en un nombre obliga a invertir mentalmente su significado en cada lectura. Dos negaciones —una en el nombre y otra en el operador— exigen dos inversiones, y el error de una de ellas produce justamente la condición contraria con el mismo aspecto visual.

Un nombre positivo describe un estado afirmativo del mundo; un nombre negativo describe la ausencia de un estado y arrastra la carga de la excepción.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Bug lógicoif (!no_listo) se interpreta al revés con facilidad.
LegibilidadEl lector hace gimnasia mental en cada condición.
MantenimientoAgregar una negación más multiplica la confusión.
RevisiónEl docente no puede validar la condición de un vistazo.

Fundamento en la cátedra

Es una aplicación de 0x0101h: Los identificadores deben ser descriptivos al problema específico de la polaridad. Se combina con 0x0110h: Los booleanos se nombran con prefijo interrogativo, que ya pide nombres afirmativos para los booleanos.

Alcance y excepciones

Aplica a variables, funciones y campos. Se conservan las construcciones idiomáticas del lenguaje (NULL, EOF, false) y las constantes de error negativas, que no son nombres de estado. Cuando la negación es inevitable, se prefiere una palabra positiva (sin_datos antes que no_hay_datos).

Ejemplos exhaustivos

❌ Contraejemplo 1 — Doble negación en la condición

bool no_hay_error = verificar();

if (!no_hay_error) {
    reportar_fallo();
}

Por qué falla: la condición se lee “si no (no hay error)” = “si hay error”, pero el lector tarda y puede equivocarse. La variable y la condición niegan dos veces lo mismo.

❌ Contraejemplo 2 — Nombre negativo con lógica positiva

bool invalido = validar(entrada);

if (invalido) {
    usar(entrada);      /* parece un error, pero es el camino feliz */
}

Por qué falla: el nombre sugiere que el bloque maneja el error, pero en realidad se ejecuta cuando la entrada es válida. Un revisor cansado leerá lo contrario.

✅ Ejemplo conforme 1 — Positivo directo

bool es_valido = validar(entrada);

if (es_valido) {
    usar(entrada);
}

La condición coincide con el nombre; no hay inversión que recordar.

✅ Ejemplo conforme 2 — Guarda con negación legible

bool es_valido = validar(entrada);

if (!es_valido) {
    reportar_error();
    return;
}

usar(entrada);

La única negación es la de la guarda, sobre un nombre positivo; es la forma aceptada de expresar el caso de error (0x2001h: Las funciones deben usar cláusulas de guarda y retornos anticipados para reducir la anidación profunda).

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
Revisión manualIdentificadores con no_, sin_, des_ combinados con !.
gaffgaff check archivo.cRegla 0x0101h (nombres descriptivos).

Checklist de autocontrol

Reglas relacionadas