Unidad III · Proyecto Disponible

Proyecto: modelar un problema real

Analice un problema, diseñe sus clases con el método de seis pasos, impleméntelo en Python, verifíquelo y compare las decisiones con Java y C++.

Objetivo de aprendizaje

Al concluir el proyecto, el estudiante será capaz de:

  1. Analizar el enunciado de un problema y traducirlo en clases, atributos y comportamientos con criterios explícitos (método de seis pasos).
  2. Diseñar una solución orientada a objetos con fichas CRC, relaciones es-un y tiene-un, y los invariantes que debe proteger.
  3. Implementar el diseño en Python con herencia, encapsulamiento, un contrato y polimorfismo, y documentar el código para que sea fácil de seguir.
  4. Probar la solución con escenarios derivados de los requisitos y comparar lo anticipado con lo observado.
  5. Comparar las decisiones de diseño con las de Java y C++ y justificar los compromisos.

El producto que se entrega

El análisis y diseño (tabla de candidatos, fichas CRC, diagrama de clases e invariantes), un programa en Python documentado, un informe (de tres a cinco páginas) y la evidencia registrada en esta página: el resultado del verificador de requisitos, la tabla comparativa y la autoevaluación. Todo se exporta en un solo archivo desde el espacio de trabajo de la sección 7.


1. Planteamiento inicial

Al comenzar la unidad, la manera natural de abordar un problema era «empezar a escribir código». El proyecto sirve para comprobar si ese hábito cambió.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


2. Elija un problema

Elija uno de los tres enunciados (su docente puede asignarlos). Los tres son de tamaño comparable y tienen, deliberadamente, algunas decisiones discutibles que deberá argumentar en su informe.

Opción A. El estacionamiento de la facultad

A1. El estacionamiento tiene 40 lugares numerados. A2. Cada vehículo se identifica por su placa (que no puede estar vacía) y es un automóvil o una motocicleta. A3. Una motocicleta paga 10 pesos por hora y un automóvil, 20. A4. Cuando un vehículo entra, se le asigna el primer lugar libre y se registra la hora de entrada; si no hay lugares libres, se rechaza. A5. Al salir, se calcula el importe por las horas transcurridas (cada fracción de hora se cobra completa) y se libera el lugar. A6. Se desea saber en cualquier momento cuántos lugares libres hay y qué vehículo ocupa cada lugar.

Opción B. La cafetería escolar

B1. El menú tiene platillos y bebidas; todo artículo tiene un nombre y un precio base. B2. Los platillos tienen un tiempo de preparación en minutos. B3. Las bebidas pueden ser frías o calientes; las calientes se sirven en tres tamaños (chico, mediano y grande), y el tamaño aumenta el precio base en 0, 5 y 10 pesos. B4. Un pedido agrupa los artículos que pide una persona y no puede confirmarse si está vacío. B5. Quien presenta credencial recibe un 10 % de descuento sobre el total del pedido. B6. El total de un pedido se calcula a partir de sus artículos. B7. Al cierre del día, la persona encargada consulta cuántos pedidos se confirmaron y cuánto se vendió.

Opción C. El gimnasio universitario

C1. Los socios tienen un número, un nombre y una membresía, que puede ser mensual o anual. C2. Una membresía anual recibe un 10 % de descuento sobre doce cuotas mensuales de 300 pesos. C3. El gimnasio ofrece clases (por ejemplo, yoga o spinning), cada una con un cupo máximo y un horario. C4. Un socio puede inscribirse en una clase si hay cupo y su membresía está vigente; en caso contrario, se rechaza la inscripción. C5. Una clase no admite a la misma persona dos veces. C6. Se desea consultar las clases con lugares disponibles y las clases en las que está inscrito cada socio. C7. Un socio con membresía vencida no puede inscribirse en ninguna clase.

Nota: las decisiones discutibles son parte del ejercicio. Por ejemplo, en A, ¿automóvil y motocicleta son clases distintas o un atributo de Vehiculo? En B, ¿cómo se modela el tamaño de la bebida caliente? En C, ¿la membresía es un atributo del socio o una clase? No hay una respuesta única: lo que se evalúa es la argumentación.


3. Análisis y diseño (pasos 1 a 5 del método)

Aplique el método de seis pasos del tema 3.0 al problema elegido. Registre sus productos en la libreta con los siguientes bloques.

Paso Producto que debe registrar
1. Delimitar Requisitos numerados y lo que queda fuera del alcance
2. Identificar candidatos Lista de sustantivos y verbos del enunciado
3. Decidir su papel Tabla: candidato → clase, atributo, cálculo o fuera del modelo, con la razón
4. Asignar responsabilidades Una ficha CRC por clase
5. Relacionar y proteger Diagrama de clases (puede ser texto) e invariantes

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: no pase al código antes de tener la tabla de candidatos y las fichas CRC. Un programa construido sin análisis suele terminar en una clase todopoderosa.


4. La actividad: el programa

Escriba, en su entorno de desarrollo, un programa en Python que implemente su diseño y que cumpla lo siguiente.

Requisito Qué debe contener el programa
1. Clases Al menos tres clases que resulten de su análisis
2. Herencia Al menos una clase que herede de otra clase propia y sobrescriba un método (el constructor no cuenta)
3. Encapsulamiento Un atributo interno (con guion bajo inicial) y un método que valide con raise para proteger un invariante
4. Contrato Una clase abstracta (ABC con @abstractmethod) o un método que lance NotImplementedError
5. Polimorfismo Un ciclo for que invoque un método definido en dos o más clases
6. Documentación Al menos cuatro comentarios que expliquen decisiones de diseño (no lo obvio del código)
7. Escenarios El programa se ejecuta sin errores y muestra al menos cuatro líneas de salida que documenten los escenarios de prueba

Nota: el verificador de la sección 6 solo admite el subconjunto de Python estudiado en el curso (clases, herencia, super(), propiedades, excepciones, abc y dataclasses). Si su programa usa otras construcciones o importaciones, el verificador lo indicará: conserve su versión y escriba una reducida para el verificador.

Cómo documentar su código para que sea fácil de seguir. Esta es la pauta que se utilizó en los apuntes de la unidad:

  • Un comentario encima de cada clase que diga su responsabilidad (la frase de la ficha CRC).
  • Un comentario junto a cada decisión no obvia: por qué un atributo es interno, por qué esta clase hereda y aquella usa composición, qué invariante protege cada validación.
  • Los escenarios al final, cada uno precedido por un comentario con el requisito que comprueba.
  • Nombres de clases en singular y con mayúscula inicial, nombres de métodos que sean verbos o consultas.

5. Siga la ejecución de su programa

Antes de verificar, ejecute su programa paso a paso en la corrida de escritorio siguiente. Escriba o pegue su programa y active la predicción de la salida y del método que se ejecuta: anticipe lo que ocurrirá antes de verlo. Observe las tarjetas de las clases, los objetos y las referencias entre ellos.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


6. Verifique los requisitos

El verificador analiza su programa, lo ejecuta y comprueba cada requisito. El resultado se registra en su libreta como evidencia.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: el verificador comprueba la estructura (por ejemplo, que exista un ciclo que invoca un método definido en varias clases), pero no puede juzgar si su análisis es acertado ni si su explicación es correcta. Esa es la finalidad del informe y de la revisión de su docente.


7. Diagnóstico comparado: Python, Java y C++

La unidad se estudia con tres lenguajes. Cada uno toma decisiones distintas sobre los mismos elementos de la programación orientada a objetos. Complete la tabla con lo que cree que hace cada lenguaje y compare con la referencia.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: las respuestas de Java y C++ son una referencia didáctica y están simplificadas. Se utilizan para razonar sobre compromisos, no como descripción exhaustiva de los lenguajes.


8. Planeación y redacción del informe

El informe no es un resumen de lo que se hizo, sino un argumento: explica qué se decidió, por qué y cómo se comprobó. Algunas pautas:

  • Use el método. Organice el informe según los pasos del tema 3.0 y haga visible la trazabilidad: de cada requisito a una o más clases, y de cada requisito a un escenario.
  • Justifique las decisiones discutibles. Una decisión sin razón es una suposición. Compare al menos dos alternativas.
  • Presente evidencia. En lugar de «la clase valida el invariante», muestre el escenario que lo comprueba y su resultado.
  • Incluya sus predicciones. Anote qué anticipó y si coincidió; las discrepancias son lo más informativo.
  • Nombre los compromisos. Cada decisión de diseño favorece algo y cuesta algo.

Ejemplo de una justificación pobre: «Motocicleta hereda de Vehiculo porque así se ahorra código». Ejemplo de una justificación sólida: «Motocicleta y Automovil son subclases de Vehiculo porque difieren en un comportamiento (la tarifa por hora) y el estacionamiento debe tratarlos de manera uniforme; la prueba “una motocicleta es un vehículo” es verdadera en todos los requisitos. Si la única diferencia fuera un dato, habría bastado un atributo tipo».

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: lo que registra en esta página solo vive en su navegador. Si cambia de equipo o borra los datos de navegación, lo perderá. Exporte el archivo con frecuencia y conserve una copia.


9. Autoevaluación y contraste

Antes de entregar, valore su proyecto con la rúbrica.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Contraste con el planteamiento inicial

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


10. Libreta y lista de verificación para la entrega

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Antes de entregar, compruebe que:

  • Eligió un problema y numeró sus requisitos; declaró lo que queda fuera del alcance.
  • Su tabla de candidatos justifica el papel de cada uno, sobre todo las decisiones discutibles.
  • Tiene una ficha CRC por clase, un diagrama de clases e invariantes identificados.
  • Su programa cumple los siete requisitos del verificador y está comentado según la pauta.
  • Cada requisito del enunciado tiene al menos un escenario de prueba, con su predicción y su resultado.
  • Completó la tabla comparativa y revisó las explicaciones de las diferencias.
  • Las siete secciones del informe tienen contenido y evidencias.
  • Hizo la autoevaluación y atendió los criterios más bajos.
  • Exportó el informe y conservó una copia del archivo y de su programa.
  • Puede explicar con sus propias palabras cada decisión de su trabajo.

11. Preguntas de reflexión

  1. ¿Qué parte del método de seis pasos le resultó más difícil de aplicar y por qué? ¿Qué haría distinto?
  2. Describa un cambio en el enunciado (una regla nueva) y diga qué partes de su diseño tendría que modificar. ¿Qué dice eso sobre la calidad del diseño?
  3. ¿Qué decisión de diseño de Python le facilitó el trabajo y cuál se lo dificultó? ¿Cómo la habría resuelto en Java o en C++?
  4. Si otra persona leyera solo su código, ¿podría reconstruir el análisis? ¿Qué le falta a la documentación para lograrlo?
  5. ¿Cómo aplicaría este método a un problema de un dominio que no conoce?

12. Lecturas recomendadas

  • Larman, C. (2004). Applying UML and patterns: An introduction to object-oriented analysis and design and iterative development (3rd ed.). Prentice Hall.
  • Beck, K., & Cunningham, W. (1989). A laboratory for teaching object-oriented thinking. En OOPSLA '89 Conference Proceedings. ACM.
  • Sebesta, R. (2015). Concepts of programming languages (11th ed.), capítulo sobre soporte para la programación orientada a objetos. Pearson.
  • Python Software Foundation. The Python Tutorial, sección «Classes». Acceso libre en docs.python.org.