Skip to content

06. Evaluación con Rúbrica

La excelencia no es un acto, sino un hábito. En esta sección final, te presentamos un Reto Maestro que integra todas las habilidades de razonamiento que hemos cultivado.

Reto Maestro: El Gestor de Reservas de Cine

Section titled “Reto Maestro: El Gestor de Reservas de Cine”

El Escenario

Debes diseñar una aplicación para una sala de cine. El usuario elige entre 3 tipos de asientos e ingresa la cantidad. Tu aplicación debe cumplir con:

  1. Validación: Asegurar que la cantidad sea un número positivo.
  2. Regla de Oro: Aplicar un cargo extra del 15% si es una función de “Estreno”.
  3. Resultado: Mostrar un resumen detallado y el precio total final.

Precios base: General ($10) | VIP ($20) | 3D ($25)

Antes de programar, debes tener claras las respuestas a estas cuatro preguntas fundamentales. Usa el sistema de pilares MVCE:

Modelo

CerebroLógica

¿Dónde se calcula el precio final con el cargo de estreno?

Vista

CuerpoInterfaz

¿Qué componentes Swing son ideales para elegir?

Evento

NervioAviso

¿Qué Listener detecta el cambio en tiempo real?

Controlador

VínculoGestión

¿Cómo coordina la actualización cuando el Modelo cambia?

Antes de la rúbrica, identifica los “pecados arquitectónicos” en este flujo para el Gestor de Cine. Este diagrama está mal diseñado a propósito.

Tu Misión: No toques el teclado. Saca una hoja de papel y redibuja este flujo eliminando las dependencias prohibidas.

sequenceDiagram
    participant V as Vista (JComboBoxAsientos)
    participant M as Modelo (CalculosCine)
    
    Note over V,M: ERROR 1: Salto de capas directo
    V->>M: calcularTotal(txtCantidad)
    Note right of M: El modelo recibe el JTextField?
    M->>M: validarPositivo(txtCantidad.getText())
    M-->>V: showMessageDialog("Error en Cantidad")
    Note over V,M: ERROR 2: El Modelo maneja la UI

Reto 1: Completa los Planos (Gestor de Cine) 🎞️

Section titled “Reto 1: Completa los Planos (Gestor de Cine) 🎞️”

Aquí tienes los planos para el Gestor de Cine, pero el arquitecto anterior dejó huecos críticos. Tu tarea es identificar qué falta y qué está mal.

Identifica qué atributos y métodos faltan en el Modelo para procesar el “Cargo de Estreno” y las validaciones.

classDiagram
    class ReservaVista {
        +getTipoAsiento()
        +getCantidad()
    }
    class ReservaModelo {
        -tipo: String
        -cantidad: int
        +getPrecioBase()
        %% ¿Dónde está la lógica del 15%?
        %% ¿Dónde está la validación de cantidad?
        +calcularTotal() ?
    }
    class ReservaControlador {
        %% ¿A quién escucha?
        %% ¿A quién actualiza?
    }
    ReservaControlador --> ReservaVista
    ReservaControlador --> ReservaModelo

B. Diagrama de Secuencia (El Paso Perdido)

Section titled “B. Diagrama de Secuencia (El Paso Perdido)”

Este flujo intenta calcular el total, pero falta la orquestación del Controlador.

sequenceDiagram
    participant V as Vista
    participant C as Controlador
    participant M as Modelo
    
    V->>C: Evento: Botón click
    C->>V: getDatos()
    Note over C,M: ¡HUECO CRÍTICO!
    %% ¿Qué debería pasar aquí?
    M-->>C: totalCalculado
    C-->>V: mostrarResultado(total)

C. Planos Maestros (La Solución Correcta) 🏆

Section titled “C. Planos Maestros (La Solución Correcta) 🏆”

Una vez que hayas completado tus diagramas en papel, compáralos con la solución arquitectónica correcta. Esta es la meta que debes alcanzar:

classDiagram
    class CineModelo {
      -String tipo
      -int cantidad
      -boolean esEstreno
      +setDatos(tipo, cant, estreno)
      +double calcularTotal()
      -double getPrecioBase()
    }
    class CineVista {
      +String getTipo()
      +int getCantidad()
      +boolean esEstreno()
      +setTotal(double total)
      +mostrarError(String msg)
    }
    class CineControlador {
      -CineModelo model
      -CineVista view
      +actionPerformed(ActionEvent e)
    }
    CineControlador --> CineModelo : Ejecuta Lógica
    CineControlador --> CineVista : Lee/Actualiza UI
sequenceDiagram
    participant V as Vista
    participant C as Controlador
    participant M as Modelo
    
    Note over V,C: El Usuario hace clic en "Calcular"
    V->>C: Cuerda de Evento (actionPerformed)
    C->>V: getTipo(), getCantidad(), esEstreno()
    C->>M: setDatos(tipo, cant, estreno)
    alt es válido
        C->>M: calcularTotal()
        M-->>C: totalCalculado
        C->>V: setTotal(totalCalculado)
    else error de validación
        C->>V: mostrarError("Dato inválido")
    end

Usa esta rúbrica para evaluar con honestidad tu nivel de respuesta ante el problema del cine.

Rúbrica de Razonamiento Arquitectónico MVCE

CriterioDAAAPANA
Diseño del Modelo (Lógica)
El cálculo del 15% de estreno y validaciones están encapsulados en el Modelo sin rastro de Swing.
La lógica está en el modelo, pero recibe directamente componentes de la Vista (como JCheckBox).
Calcula el total directamente en el actionPerformed del botón.
No sabe dónde colocar la regla del 15% de extra.
Estructura de la Vista (UI)
Elige componentes óptimos (JComboBox/ButtonGroup) y define getters claros para el Controlador.
Sabe qué componentes usar pero los accede directamente desde el evento (e.getSource).
Dibuja la vista pero no sabe cómo extraer los datos de forma limpia.
Mezcla lógica de cálculo dentro del diseño de la interfaz.
Dinámica de Eventos (Flujo)
Dibuja mentalmente un diagrama de secuencia donde el Evento solo 'avisa' y el Controlador 'ejecuta'.
El evento lee los datos y se los pasa al modelo saltándose al controlador.
El evento intenta hacer todo: leer, calcular y mostrar.
Confunde el evento con la lógica del modelo.
Orquestación (Controlador)
El Controlador orquesta la sincronización entre Modelo y Vista limpiamente.
El Controlador existe pero tiene demasiada lógica que debería estar en el Modelo.
El Controlador solo instancia las clases pero no gestiona el flujo.
No utiliza una clase controladora.
  • Mayoría DA (Destacado): Posees una visión de arquitecto. Tienes la disciplina para separar lo visual de lo lógico, permitiéndote escalar a arquitecturas modernas. Tu código en el Reto del Cine será limpio, testeable y profesional.
  • Mayoría AA (Aceptable): Dominas la técnica pero a veces la ansiedad por codificar te hace saltar pasos de diseño. Tu código funciona, pero la lógica aún tiene ligeras dependencias de la UI que dificultan el mantenimiento.
  • Mayoría PA (En Proceso): Comienzas a ver las capas, pero el “cableado” de eventos sigue siendo confuso. Practica redibujando los diagramas de secuencia; si el dibujo está mal, el código también lo estará.
  • Mayoría NA (No Alcanzado): Estás atrapado en un paradigma monolítico donde todo ocurre dentro del botón. Vuelve a la sección de Paradigma de Razonamiento y concéntrate en separar el “Cómo se ve” del “Qué hace”.

Para completar esta sección con éxito, prepara los siguientes materiales para presentar físicamente a tu profesor:

  1. Reto 0: Lista de los 3 pecados arquitectónicos identificados.
  2. Reto 1: Hoja de papel con el Diagrama de Clases completo y el Diagrama de Secuencia corregido (el “paso perdido”).
  3. Código Fuente: Los dos proyectos Java funcionales integrando la arquitectura MVCE:
    • Gestor de Cine: Implementación del Reto Maestro.
    • Laboratorio Calculadora: Implementación avanzada del módulo previo.
  4. Autoevaluación: Tu nivel final según la rúbrica interactiva (puedes mostrar la pantalla o capturar el resultado).

¡Presenta tus hojas al profesor para recibir tu evaluación final! 🚀