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 0x1017h: Escribí condiciones afirmativas y directas

Estructuras de control y flujo (0x10XX)

Universidad Nacional de Río Negro

0x1017h: Escribí condiciones afirmativas y directas

Enunciado normativo

Las condiciones de control DEBEN formularse en forma afirmativa y directa. Cuando una condición negativa sea necesaria, DEBE reescribirse el bloque para expresar el caso afirmativo, o aislarse en una variable con nombre positivo.

¿Por qué existe esta regla?

El problema

Una condición negativa obliga a razonar sobre la ausencia de un estado, que es más difícil que razonar sobre su presencia. Si además la condición mezcla varios términos negados, el lector debe aplicar las leyes de De Morgan mentalmente para saber cuándo se ejecuta el bloque.

Las condiciones afirmativas describen el camino que sí interesa; las negativas describen todo lo demás y dejan el caso principal para el else.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
Bug lógicoEs fácil olvidar una negación al editar la condición.
LegibilidadEl lector reconstruye la condición como su complemento.
AnidaciónEl camino principal queda dentro de un else innecesario.
RevisiónComparar dos condiciones negadas es propenso al error.

Fundamento en la cátedra

Complementa 0x1004h: Las condiciones complejas deben simplificarse o comentarse (simplificar condiciones) y 0x1013h: Detector de expresiones booleanas complejas sin paréntesis aclaratorios (paréntesis aclaratorios). La meta es que toda condición se lea como una frase en voz alta.

Alcance y excepciones

Aplica a if, while y a las condiciones de guarda. Se admiten negaciones simples y claras (if (!es_valido)) sobre un nombre ya positivo; lo que se evita es encadenar negaciones o negar expresiones compuestas.

Ejemplos exhaustivos

❌ Contraejemplo 1 — De Morgan implícito

if (!(hay_datos && es_valido && !esta_vacio)) {
    return;
}

procesar();

Por qué falla: la condición niega un && de tres términos, uno de ellos ya negado. Entender cuándo se retorna exige aplicar De Morgan y dos inversiones.

❌ Contraejemplo 2 — Caso principal en el else

if (n <= 0 || v == NULL) {
    /* error */
} else {
    /* el caso normal, indentado un nivel de mas */
    double promedio = calcular_promedio(v, n);
    /* ... */
}

Por qué falla: el camino que interesa queda relegado al else; conviene guardar el error y seguir con el flujo principal al ras.

✅ Ejemplo conforme 1 — Guardas afirmativas primero

if (hay_datos && es_valido && !esta_vacio) {
    procesar();
}

La condición describe exactamente cuándo se procesa; la negación única (!esta_vacio) es legible.

✅ Ejemplo conforme 2 — Error temprano y caso principal directo

if (n <= 0 || v == NULL) {
    reportar_error();
    return;
}

double promedio = calcular_promedio(v, n);
mostrar(promedio);

El caso de error se atiende y se sale; el camino principal queda al ras, sin indentación extra (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 manualCondiciones con ! sobre expresiones compuestas.
gaffgaff check archivo.cReglas 0x1004h y 0x1013h.

Checklist de autocontrol

Reglas relacionadas