Sesión 12
Unidad 2 · Escalado iterativo: menú continuo, registros múltiples y reportes estadísticos
Navegación: ← → · Home / End · F pantalla completa · Táctil: desliza
Unidad 2 · Escalado iterativo: menú continuo, registros múltiples y reportes estadísticos
Navegación: ← → · Home / End · F pantalla completa · Táctil: desliza
| Dimensión | Entrega 1 (Unidad 1) | Entrega 2 (Unidad 2) |
|---|---|---|
| Ciclo de vida | Ejecución única, flujo secuencial, termina tras mostrar la salida. | Ciclo continuo: el sistema vive mientras el usuario no decida salir. |
| Datos procesados | Variables atómicas (un cliente, un pedido, una operación). | Colecciones de N registros almacenados en List<T>. |
| Salida | Resultado de una sola operación. | Reportes estadísticos sobre el conjunto completo de registros. |
| Robustez | Opcional / básica. | Validación estricta obligatoria con TryParse y guardas defensivas. |
| Criterio | Indicador evaluado | Error que invalida |
|---|---|---|
| Ciclo de control | Menú implementado con do-while funcional. | Menú implementado con while(true) sin bandera ni condición semántica. |
| Almacenamiento | Registros múltiples en arreglo o List<T>. | Variables atómicas reutilizadas: el registro anterior se sobreescribe sin guardarse. |
| Reportes | Métricas calculadas con ciclos explícitos sobre la colección. | Cálculos acumulados dentro del ciclo de carga (confunde las dos fases). |
| Robustez | Cero colapsos ante entradas inválidas. | Uso de Parse sin manejo de excepción. |
| Legibilidad | Nombres semánticos, sin números mágicos, commits descriptivos. | Variables x, temp1, aux2. |
TryParse opera como primera guardia (¿es parseable?). La condición de dominio opera como segunda guardia (¿cumple la regla de negocio?). Ambas capas son independientes y obligatorias.
Responsabilidad única: capturar un dato, validarlo y añadirlo a la colección. No debe calcular métricas. No debe iterar sobre datos históricos. Solo agrega y confirma.
Anti-patrón: Acumular la suma dentro del bloque de registro para "ahorrar" el ciclo del reporte. Esto obliga a reinicializar acumuladores manualmente y rompe la lógica si el usuario elimina o edita registros.
Responsabilidad única: recorrer la colección y producir métricas desde cero. Sus acumuladores internos son variables locales temporales que nacen y mueren en cada invocación del reporte.
Este patrón es directamente transferible a funciones en la Unidad 3: cada bloque de switch se convierte en un método con una firma clara.
Adecuada cuando cada registro es un valor numérico simple (medición, precio, calificación). El sistema produce estadísticas sobre ese único campo.
Permite guardar texto libre (nombres, categorías) para luego filtrar o mostrar en reportes. Puede combinarse con una List<double> paralela indexada.
Un error común es implementar un ciclo separado por cada métrica (uno para suma, uno para máximo, uno para contar condición). Esto genera complejidad O(k·N) siendo k el número de métricas.
La solución óptima combina todas las métricas en un único recorrido: cada iteración actualiza simultáneamente acumulador, extremos y contadores condicionales.
Cada commit debe representar un estado funcional y coherente del sistema, no un archivo a medias. Una buena estrategia de commits para la Entrega 2:
Cada bloque del switch que hoy escriben como código incrustado se convertirá en un método estático con firma explícita:
Si cada bloque de case tiene menos de 20 líneas y una responsabilidad clara, la refactorización en Unidad 3 será trivial.
Si un bloque supera las 40 líneas con lógica entremezclada, la modularización se vuelve una cirugía costosa.
Escribir código modularizable no requiere funciones todavía; requiere disciplina de responsabilidad única desde el principio.
Punto de partida obligatorio: El esqueleto base (slide 6) debe estar en su repositorio con un primer commit antes de agregar cualquier lógica.