Sesión 3
Diseñar decisiones: correcto, verificable y mantenible
Meta: controlar flujo (si / si-no / selección)
Nivel: bordes + prioridad de reglas
Salida: decisión + trazas + C# mínimo
Navegación: ← → · Pantalla completa: F
Objetivos
- Traducir reglas en condiciones sin huecos ni solapes.
- Aplicar prioridad cuando varias reglas pueden activarse.
- Verificar por casos borde (boundary testing).
- Implementar la decisión en C# de forma incremental (if/else, switch).
Nivel universitario: no basta con “funciona con un ejemplo”.
Recordatorio: condición y borde
Una condición debe ser verdadera o falsa.
edad >= 18
consumo > 200
(hora >= 18) AND (hora <= 23)
Bordes típicos
- Valores exactos del umbral (18, 200, 23).
- Justo debajo y justo encima (17/18/19).
- Entradas mínimas (0) y máximas (si existe tope).
Regla: si el enunciado no especifica, tú defines y lo dejas escrito.
Tabla de decisión (herramienta)
Sirve para evitar reglas contradictorias y para asegurar cobertura de casos.
Condiciones → C1 C2 Acción
---------------------------------------------------------
Caso 1: true true A1
Caso 2: true false A2
Caso 3: false true A3
Caso 4: false false A4
Si no puedes escribir la tabla, probablemente tu regla está incompleta.
Prioridad de reglas (cuando se pisan)
Regla de oro: define el orden de aplicación.
Ejemplo (envío):
1) Si subtotal >= 100000 → envío = 0 (prioridad alta)
2) Si no, si ciudad == "Cali" → envío = 12000
3) Si no → envío = 18000
Esto no es “estilo”: cambia el resultado.
Ejemplo guiado (reglas)
Problema: calcular total de compra con envío y cupón.
- Entrada: subtotal, ciudad, tieneCupon (S/N).
- Descuento: si tieneCupon y subtotal ≥ 80.000 → 8% sobre subtotal.
- Envío: si subtotal ≥ 100.000 → 0; si no, Cali 12.000; otras 18.000.
- Salida: total.
Aquí hay condiciones compuestas + prioridad (envío gratis gana).
Pseudocódigo (limpio y verificable)
Leer subtotal
Leer ciudad
Leer tieneCupon
// 1) Descuento (se define primero)
aplicaCupon = (tieneCupon == "S") AND (subtotal >= 80000)
Si aplicaCupon Entonces
descuento = subtotal * 0.08
Si no
descuento = 0
FinSi
// 2) Envío (prioridad)
Si subtotal >= 100000 Entonces
envio = 0
Si no
Si ciudad == "Cali" Entonces
envio = 12000
Si no
envio = 18000
FinSi
FinSi
total = (subtotal - descuento) + envio
Escribir total
Observa: cada variable crítica queda asignada en todas las ramas.
Primer C# (incremental, sin “frameworks”)
decimal subtotal = ...;
string ciudad = ...; // "Cali" u otra
bool tieneCupon = ...; // true/false
bool aplicaCupon = tieneCupon && (subtotal >= 80000m);
decimal descuento = aplicaCupon ? subtotal * 0.08m : 0m;
decimal envio;
if (subtotal >= 100000m) envio = 0m;
else if (ciudad == "Cali") envio = 12000m;
else envio = 18000m;
decimal total = (subtotal - descuento) + envio;
Esto es suficiente para la Entrega 1 del proyecto: leer, decidir, calcular, probar.
Prueba de escritorio (cobertura)
Caso | subtotal | cupon | ciudad | descuento | envio | total | motivo
---- | ------- | ----- | ------ | -------- | ----- | ----- | ------
1 | 120000 | S | Cali | ? | ? | ? | envío gratis
2 | 90000 | S | Cali | ? | ? | ? | cupón aplica
3 | 79000 | S | Medellín | ? | ? | ? | borde cupón (no aplica)
Exigencia: al menos 1 caso por regla + 1 caso borde por umbral.
Actividad central (25–30 min)
Trabajo individual: inicia tu Proyecto (Entrega 1, diseño).
- Elige tu contexto (1–5) y define 6–10 parámetros (umbrales/tarifas).
- Escribe 8 reglas (con prioridad) y conviértelas a pseudocódigo.
- Diseña 6 casos de prueba (mínimo 2 bordes).
Entregable en clase: reglas + pseudocódigo + matriz de pruebas (borrador).
Reto (opcional, sin nota)
Auditoría de reglas: escribe 2 casos “trampa” que rompan soluciones ambiguas.
- Ejemplo: dos reglas aplican a la vez, ¿cuál gana?
- Ejemplo: entrada inválida (hora=27, subtotal negativo), ¿qué haces?
Si lo haces, obtienes retroalimentación extra (no calificación).
Ticket de salida (5 min)
- Escribe 1 borde que hoy aprendiste a probar (con valores).
- Escribe 1 regla con prioridad y cómo la aplicas.
- ¿Qué variable booleana (aplicaX) usarías para legibilidad en tu proyecto?
Meta: que tu algoritmo sea defendible, no solo “parecido”.