5.8. CS112. Programación Orientada a Objetos I (Obligatorio)
- Semestre: 2do Sem. Créditos: 4
- Horas del curso: Teoría: 2 horas; Laboratorio: 4 horas;
-
Prerrequisitos:
- BIC01. Introducción a la Computación (1er Sem)
5.8.1. Justificación
Este es el segundo curso en la secuencia introductoria de programación en Ciencia de la Computación. Incorpora una transición de lenguaje de programación como estrategia pedagógica y se enfoca en los conceptos centrales de Programación Orientada a Objetos (POO) en C++17/C++20, expandiendo las bases del primer curso mientras introduce conceptos de programación de bajo nivel. El curso proporciona una base sólida para los temas avanzados cubiertos en el curso subsiguiente del plan de estudios.
5.8.2. Objetivos Generales
- 1.
- Introducir al estudiante a los fundamentos del paradigma de orientación a objetos en C++.
- 2.
- Desarrollar habilidades en programación C++17/C++20, incluyendo plantillas y STL.
- 3.
- Comprender la gestión de memoria y conceptos de programación de bajo nivel.
- 4.
- Desarrollar habilidades de resolución de problemas usando principios de POO.
- 5.
- Dominar técnicas de programación C++ intermedias.
5.8.3. Contribución a los resultados (Outcomes)
-
AG-C09) Diseño y Desarrollo de Soluciones: Diseña, implementa y evalúa soluciones para problemas complejos de computación. (Usage)
-
AG-C12) Aplica la teoría de la ciencia de la computación y los fundamentos de desarrollo de software para producir soluciones basadas en computadora. (Usage)
5.8.4. Contenido
5.8.4.1. Pragmática del Lenguaje (2 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Josuttis, 2019]
Temas
- 1.
- Dominios de problemas y paradigma de programación
- 2.
- Criterios para un buen diseño de lenguaje de programación:
- a)
- Principios de diseño de lenguajes como la ortogonalidad
- b)
- Definir construcciones de control e iteración
- c)
- Modularización de software grande
- 3.
- Breve revisión de paradigmas de programación.
- 4.
- Comparación entre programación funcional e imperativa.
- 5.
- Historia de los lenguajes de programación (énfasis en C y C++).
Aprendizaje esperado (Learning Outcomes)
- 1.
- Discutir el contexto histórico de los paradigmas de lenguajes de programación [Familiarizarse].
- 2.
- Evaluar las compensaciones en el diseño de lenguajes para aplicaciones específicas [Evaluar].
5.8.4.2. Traducción y Ejecución de Lenguajes (4 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Deitel and Deitel, 2017]
Temas
- 1.
- Modelos de ejecución para JIT (Just-In-Time), compilador, intérprete
- 2.
- Uso de código intermedio, por ejemplo, bytecode
- 3.
- Ejecución como código nativo o dentro de una máquina virtual
- 4.
- Máquinas virtuales y lenguajes intermedios.
- 5.
- Modelos de compilación vs. interpretación.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Explicar y comprender las diferencias entre implementaciones de lenguaje compilado, JIT e interpretado, incluyendo los beneficios y limitaciones de cada una [Familiarizarse]
- 2.
- Diferenciar sintaxis y análisis (parsing) de semántica y evaluación [Usar]
- 3.
- Ilustrar ambigüedad en el análisis usando if-then-else anidado/expresión aritmética y mostrar resolución usando orden de precedencia [Evaluar]
5.8.4.3. Sistemas de Tipos I: Fundamentos (8 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Josuttis, 2019]
Temas
- 1.
- Un tipo como un conjunto de valores junto con un conjunto de operaciones:
- a)
- Tipos primitivos (por ejemplo, números, booleanos)
- b)
- Tipos compuestos construidos a partir de otros tipos (por ejemplo, registros/estructuras, uniones, arreglos, listas, funciones, referencias usando operaciones de conjuntos)
- 2.
- Tipos genéricos (polimorfismo paramétrico):
- a)
- Definición y ventajas del polimorfismo: paramétrico, de subtipado (subtyping), de sobrecarga (overloading) y de coerción
- b)
- Comparación de tipos monomórficos y polimórficos
- c)
- Comparación con polimorfismo ad-hoc (sobrecarga) y polimorfismo de subtipos
- d)
- Parámetros genéricos y tipado
- e)
- Uso de bibliotecas genéricas como colecciones
- f )
- Comparación con polimorfismo ad hoc (sobrecarga) y polimorfismo de subtipos
- g)
- Polimorfismo prescriptivo vs descriptivo
- h)
- Modelos de implementación de tipos polimórficos
- i)
- Subtipado
- 3.
- Modelos de declaración (enlace, visibilidad, alcance, tiempo de vida).
- 4.
- Visión general de la verificación de tipos en C++.
- 5.
- Conversión de tipos y casting en C++.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Definir y usar piezas de programa (como funciones, clases, métodos) que usen tipos genéricos, incluyendo para colecciones [Usar]
- 2.
- Discutir las diferencias entre genéricos, subtipado y sobrecarga [Familiarizarse]
- 3.
- Explicar múltiples beneficios y limitaciones del tipado estático al escribir, mantener y depurar software [Evaluar]
5.8.4.4. Programación Orientada a Objetos I: Fundamentos (14 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Josuttis, 2019]
Temas
- 1.
- Definición de clases: campos, métodos y constructores.
- 2.
- Subclases, herencia (incluyendo herencia múltiple) y sobrescritura de métodos.
- 3.
- Despacho dinámico: definición de llamada a método.
- 4.
- Subtipado:
- a)
- Polimorfismo de subtipos; conversiones ascendentes (upcasts) implícitas en lenguajes tipados.
- b)
- Noción de reemplazo conductual: los subtipos actúan como el supertipo.
- c)
- Relación entre subtipado y herencia.
- 5.
- Clases y objetos en C++.
- 6.
- Constructores y destructores.
- 7.
- Especificadores de acceso y encapsulamiento.
- 8.
- Jerarquías de herencia.
- 9.
- Polimorfismo y funciones virtuales.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Componer una clase a través del diseño, implementación y prueba para cumplir con los requisitos de comportamiento [Usar]
- 2.
- Construir una jerarquía de clases simple utilizando subclases que permita reutilizar código para subclases distintas [Usar]
- 3.
- Predecir y validar el flujo de control en un programa usando despacho dinámico [Evaluar]
- 4.
- Diseñar clases en C++ con encapsulamiento adecuado [Usar].
- 5.
- Implementar jerarquías de herencia para reutilización de código [Usar].
5.8.4.5. Modelo de Ejecución y Memoria de Sistemas (12 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Deitel and Deitel, 2017]
Temas
- 1.
- Acceso directo, indirecto e indexado a ubicación de memoria
- 2.
- Representación en tiempo de ejecución de abstracciones de datos como variables, arreglos, vectores, registros, elementos de datos basados en punteros como listas enlazadas y árboles, y objetos
- 3.
- Asignación y acceso de bajo nivel a estructuras de datos de alto nivel como tipos de datos básicos, arreglos n-dimensionales, vectores, registros y objetos
- 4.
- Retorno de procedimiento como mecanismo de desasignación automática para elementos de datos locales en la pila
- 5.
- Gestión manual de memoria: asignar, desasignar y reutilizar memoria del montón
- 6.
- Gestión automática de memoria: recolección de basura (garbage collection) como técnica automatizada usando la noción de alcanzabilidad (reachability)
- 7.
- Distribución de memoria (pila, montón, estática).
- 8.
- Aritmética de punteros y operaciones.
- 9.
- Asignación dinámica de memoria (new/delete).
- 10.
- Fugas de memoria y punteros colgantes.
- 11.
- Punteros inteligentes (unique_ptr, shared_ptr).
Aprendizaje esperado (Learning Outcomes)
- 1.
- Explicar por qué ocurren las fugas de memoria (memory leaks) y los problemas de punteros colgantes (dangling pointers), y qué puede hacer un programador para evitarlos/corregirlos [Usar]
- 2.
- Explicar cómo las implementaciones de lenguajes de programación típicamente organizan la memoria en secciones de datos globales, texto, montón y pila, y cómo características como recursión y gestión de memoria se mapean a este modelo de memoria [Evaluar]
- 3.
- Explicar cómo se ejecuta una construcción central del lenguaje, como abstracciones de datos y abstracciones de control [Evaluar]
- 4.
- Implementar RAII para la gestión de recursos [Usar].
- 5.
- Depurar errores relacionados con memoria en programas C++ [Usar].
5.8.4.6. Programación Funcional (10 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Josuttis, 2019]
Temas
- 1.
- Expresiones lambda y evaluación:
- a)
- Enlace (binding) de variables y reglas de ámbito (scope).
- b)
- Paso de parámetros.
- c)
- Expresiones lambda anidadas y orden de reducción.
- 2.
- Usar funciones de orden superior (tomar, devolver y almacenar funciones).
- 3.
- Plantillas de funciones y plantillas de clases.
- 4.
- Especialización de plantillas.
- 5.
- Expresiones lambda en C++11/14.
- 6.
- Conceptos de la Biblioteca de Plantillas Estándar (STL).
Aprendizaje esperado (Learning Outcomes)
- 1.
- Desarrollar funciones útiles que tomen y devuelvan otras funciones [Usar]
- 2.
- Interpretar correctamente las variables y el ámbito léxico en un programa que usa clausuras de funciones [Evaluar]
-
3.
- Usar mecanismos de encapsulación funcional como clausuras e interfaces modulares [Usar]
- 4.
- Implementar funciones genéricas usando plantillas [Usar].
- 5.
- Usar expresiones lambda para programación funcional [Usar].
5.8.4.7. Programación Orientada a Objetos II: Encapsulación, Subtipado y Reflexión (8 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Josuttis, 2019]
Temas
- 1.
- Clases de colecciones, iteradores y otros componentes comunes de biblioteca.
- 2.
- Contenedores de secuencia (vector, list, deque).
- 3.
- Contenedores asociativos (set, map, unordered_set).
- 4.
- Adaptadores de contenedor (stack, queue, priority_queue).
- 5.
- Iteradores y algoritmos.
- 6.
- Funtores y predicados.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Usar clases de colecciones e iteradores efectivamente para resolver un problema [Usar]
- 2.
- Definir y usar iteradores y otras operaciones en agregados, incluyendo operaciones que toman funciones como argumentos, en múltiples lenguajes de programación, seleccionando los idiomas más naturales para cada lenguaje [Usar]
- 3.
- Comparar y contrastar los mecanismos para definir y proteger elementos de datos dentro de los enfoques procedural, funcional y orientado a objetos [Evaluar]
- 4.
- Seleccionar contenedores STL apropiados para necesidades específicas [Usar].
5.8.4.8. Construcciones de Programación Avanzadas (6 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Josuttis, 2019]
Temas
- 1.
- Abstracciones orientadas a objetos: herencia múltiple, mixins, rasgos (traits), multimétodos (multimethods)
- 2.
- Metaprogramación: macros, programación generativa, desarrollo basado en modelos (model-based development)
- 3.
- Sobrecarga de operadores.
- 4.
- Semántica de movimiento y referencias a valor-r.
- 5.
- Manejo de excepciones en C++.
- 6.
- Espacios de nombres y programación modular.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Usar varias construcciones e idiomas de programación avanzados correctamente [Usar]
- 2.
- Discutir cómo varias construcciones de programación avanzadas tienen como objetivo mejorar la estructura del programa, la calidad del software y la productividad del programador [Evaluar]
- 3.
- Discutir cómo varias construcciones de programación avanzadas interactúan con la definición e implementación de otras características del lenguaje [Familiarizarse]
- 4.
- Implementar semántica de movimiento para optimización de rendimiento [Usar].
5.8.4.9. Scripting de Shell (4 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Robbins and Beebe, 2005]
Temas
- 1.
- Comandos del sistema:
- a)
- Interfaz con sistemas operativos
- 2.
- Tuberías (piping)
- 3.
- Abstracción de archivo y operadores
- 4.
- Programas y procesos
- 5.
- Automatización de la compilación y pruebas de programas C++ mediante scripts (Makefiles, scripts de build/test).
Aprendizaje esperado (Learning Outcomes)
- 1.
- Crear y ejecutar scripts automatizados para gestionar varias tareas del sistema [Usar]