Curricula CS-UNI
5.13. CS113. Programación Orientada a Objetos II (Obligatorio)

5.13. CS113. Programación Orientada a Objetos II (Obligatorio)

  • Semestre: 3er Sem. Créditos: 4
  • Horas del curso: Teoría: 2 horas; Práctica: 2 horas; Laboratorio: 2 horas;
  • Prerrequisitos:

    • CS112. Programación Orientada a Objetos I (2do Sem)

Figura 5.13: Mapa de Conexión. CS113 Programación Orientada a Objetos II

5.13.1. Justificación

Este es el tercer curso en la secuencia de cursos introductorios en ciencia de la computación. Este curso explora características avanzadas de C++17/C++20 centrándose en el desarrollo de sistemas de alto rendimiento. Los temas clave incluyen metaprogramación con plantillas, semántica de movimiento, reenvío perfecto, optimización RAII, patrones de herencia múltiple/virtual, concurrencia con std::thread y async/await, programación sin bloqueo, paradigmas modernos de C++ como CRTP y plantillas de expresión, e interfaz de C++ con otros lenguajes. El curso prepara a los estudiantes para motores de juego, computación de alto rendimiento y desarrollo embebido donde C++ es dominante.

5.13.2. Objetivos Generales

1.
Dominar características avanzadas de C++17/C++20, incluyendo plantillas y metaprogramación.
2.
Desarrollar habilidades en programación concurrente y de sistemas.
3.
Comprender técnicas de optimización de rendimiento.
4.
Prepararse para aplicaciones de computación de alto rendimiento.
5.
Dominar la metaprogramación con plantillas y el cómputo en tiempo de compilación.

5.13.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. (Assessment)

5.13.4. Contenido

5.13.4.1. Programación Orientada a Objetos II: Encapsulación, Subtipado y Reflexión (8 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Stroustrup, 2013Josuttis, 2019Vandevoorde et al., 2017a]

Temas

1.
Clases de colecciones, iteradores y otros componentes comunes de biblioteca.
2.
Contenedores asociativos (std::set, std::map, variantes no ordenadas).
3.
Adaptadores de contenedor (stack, queue, priority_queue).
4.
Algoritmos avanzados de STL.
5.
Funtores y predicados.
6.
Categorías de iteradores y rasgos.

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 [Evaluar]
3.
Comparar y contrastar los beneficios y costos/impacto de usar herencia (subclases) y composición (específicamente, cómo basar la composición en funciones de orden superior) [Usar]
4.
Implementar asignadores personalizados para contenedores STL [Usar].
5.13.4.2. Sistemas de Tipos II: Polimorfismo y Tipado Complementario (12 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Stroustrup, 2013Vandevoorde et al., 2017aStroustrup, 2022]

Temas

1.
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
2.
SFINAE (Fallo de Sustitución No es un Error): fundamento histórico de la programación genérica restringida en C++, base de bibliotecas anteriores a C++20.
3.
Concepts (C++20): sintaxis declarativa para restringir parámetros de plantilla, sucesor moderno de SFINAE con mejores diagnósticos de error.
4.
if constexpr (C++17): ramificación en tiempo de compilación, reemplazo de gran parte del despacho por etiquetas (tag dispatch) antes resuelto con SFINAE.
5.
Reenvío perfecto y referencias universales.
6.
Plantillas variádicas.
7.
Cómputo en tiempo de compilación con constexpr y consteval.

Aprendizaje esperado (Learning Outcomes)

1.
Definir y usar piezas de programa (como funciones, clases, métodos) que usen tipos genéricos, incluyendo para colecciones [Evaluar]
2.
Discutir las diferencias entre genéricos, subtipado y sobrecarga [Evaluar]
3.
Aplicar Concepts para restringir parámetros de plantilla y mejorar diagnósticos de error [Usar].
4.
Distinguir cuándo usar Concepts, if constexpr o SFINAE heredado al mantener código C++ existente [Evaluar].
5.
Implementar reenvío perfecto para paso eficiente de argumentos [Usar].
5.13.4.3. Gestión de Memoria (8 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Meyers, 2014Stroustrup, 2013]

Temas

1.
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
2.
Retorno de procedimiento como mecanismo de desasignación automática para elementos de datos locales en la pila
3.
Gestión manual de memoria: asignar, desasignar y reutilizar memoria del montón
4.
Gestión automática de memoria: recolección de basura (garbage collection) como técnica automatizada usando la noción de alcanzabilidad (reachability)
5.
Lvalues y rvalues en C++11/14/17/20.
6.
Constructores de movimiento y operadores de asignación de movimiento.
7.
Referencias a valor-r y colapso de referencias.
8.
Patrón RAII (Adquisición de Recursos es Inicialización).
9.
Personalización de punteros inteligentes.
10.
Detección y prevención de fugas de memoria.

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 semántica de movimiento para optimización de recursos [Usar].
5.
Diseñar clases RAII para gestión de recursos segura ante excepciones [Usar].
5.13.4.4. Computación Paralela y Distribuida (12 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Williams, 2019Stroustrup, 2013]

Temas

1.
Seguridad (safety) y vivacidad (liveness):
a)
Condiciones de carrera (race conditions)
b)
Dependencias/precondiciones
c)
Modelos de fallos (fault models)
d)
Terminación
2.
Modelos de programación:
a)
Modelo de actores (actor models)
b)
Modelos procedurales y reactivos
c)
Modelos de programación síncrona/asíncrona
d)
Paralelismo de datos (data parallelism)
3.
Comunicación y coordinación:
a)
Mutexes
b)
Paso de mensajes (message-passing)
c)
Memoria compartida (shared memory)
d)
Cobegin-coend
e)
Monitores
f )
Canales (channels)
g)
Hilos (threads)
h)
Guardas (guards)
4.
std::thread y gestión de hilos.
5.
std::jthread (C++20): unión automática (RAII) y cancelación cooperativa vía stop_token.
6.
Mutexes, candados y variables de condición.
7.
Mecanismos de sincronización de C++20: std::latch, std::barrier, std::counting_semaphore.
8.
Operaciones atómicas y programación sin bloqueo.
9.
std::async y futures.
10.
std::execution y el modelo de senders-receivers (C++26, experimental): panorama hacia dónde evoluciona la concurrencia estándar en C++, presentado a nivel conceptual, sin evaluación en laboratorio dada su disponibilidad limitada (parcial en GCC).
11.
Patrones de diseño seguros para hilos.
12.
Carreras de datos y prevención de interbloqueos.

Aprendizaje esperado (Learning Outcomes)

1.
Implementar programas concurrentes correctos usando múltiples modelos de programación, como memoria compartida, actores, futuros, construcciones de sincronización y primitivas de paralelismo de datos [Usar]
2.
Usar construcciones de sincronización como métodos monitorizados/sincronizados en un programa simple [Usar]
3.
Usar un modelo de paso de mensajes para analizar un protocolo de comunicación [Evaluar]
4.
Implementar estructuras de datos sin bloqueo usando operaciones atómicas [Usar].
5.
Diferenciar std::thread de std::jthread y justificar cuándo usar cada uno [Usar].
6.
Analizar la seguridad en hilos de algoritmos concurrentes [Evaluar].
5.13.4.5. Construcciones de Programación Avanzadas (8 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Stroustrup, 2013Vandevoorde et al., 2017b]

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.
Herencia múltiple y herencia virtual.
4.
Patrón CRTP (Patrón de Plantilla Curiosamente Recursivo).
5.
deducing this (C++23): simplifica CRTP al eliminar la necesidad de static_cast<Derived&>(*this) para polimorfismo estático.
6.
Plantillas de expresión.
7.
Rasgos de tipos e introspección en tiempo de compilación.
8.
Diseño basado en políticas.
9.
Diseño de interfaz para bibliotecas.

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 [Evaluar]
4.
Implementar CRTP para polimorfismo estático [Usar].
5.
Diseñar interfaces de biblioteca extensibles usando diseño basado en políticas [Usar].
5.13.4.6. Modelo de Ejecución y Memoria de Sistemas (8 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Stroustrup, 2013Williams, 2019]

Temas

1.
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
2.
Estructuras de datos para traducción, ejecución, traducción y movilidad de código como pila, montón (heap), alias (compartición usando punteros), secuencia indexada y cadena
3.
Implementación del despacho dinámico introducido en POO I: tabla de funciones virtuales (vtable), puntero vtable (vptr), y su costo en memoria y rendimiento frente al despacho estático.
4.
Interfaz de C++ con otros lenguajes (FFI).
5.
Llamadas al sistema e interacción con el SO.
6.
E/S mapeada en memoria.
7.
Perfilado de rendimiento y evaluación comparativa.
8.
Técnicas de optimización para HPC.

Aprendizaje esperado (Learning Outcomes)

1.
Explicar cómo se ejecuta una construcción central del lenguaje, como abstracciones de datos y abstracciones de control [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 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]
4.
Perfilar y optimizar programas C++ para rendimiento [Usar].
5.
Explicar cómo el compilador implementa el polimorfismo en tiempo de ejecución mediante vtables [Evaluar].
6.
Interfazar código C++ con bibliotecas C [Usar].
5.13.4.7. Construcciones de Programación Avanzadas (6 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Gamma et al., 1994aStroustrup, 2013]

Temas

1.
Abstracciones orientadas a objetos: herencia múltiple, mixins, rasgos (traits), multimétodos (multimethods)
2.
Patrones creacionales, estructurales y de comportamiento.
3.
Patrones singleton seguros para hilos.
4.
Modismos de diseño modernos en C++.
5.
Inyección de dependencias e inversión de control.

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 patrones de diseño seguros para hilos [Usar].
5.
Evaluar compensaciones arquitectónicas en sistemas C++ [Evaluar].

5.13.4.8. Construcciones de Programación Avanzadas (6 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Meyers, 2014Stroustrup, 2013]

Temas

1.
Abstracciones de control: manejo de excepciones, continuaciones (continuations), mónadas (monads).
2.
Optimizaciones del compilador y banderas.
3.
Metodologías de evaluación comparativa.
4.
Estructuras de datos amigables con la caché.
5.
Predicción de bifurcación y alineación.
6.
Reducción del tiempo de compilación.
7.
Integración continua para pruebas de rendimiento.

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.
Aplicar técnicas de optimización para mejorar el rendimiento del programa [Usar].
5.
Interpretar resultados de evaluación comparativa para guiar decisiones de optimización [Usar].
5.13.4.9. Control de Versiones y CI/CD (4 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Stroustrup, 2013Stroustrup, 2022]

Temas

1.
Automatización de procesos de software:
a)
Sistemas de construcción (build systems): el valor de builds rápidos, herméticos y reproducibles, comparar/contrastar enfoques para construir un proyecto.
b)
Integración Continua (CI): el uso de automatización y pruebas automatizadas para hacer una validación preliminar de que la revisión actual del tronco se construye y pasa las pruebas (básicas).
c)
Despliegue Continuo (CD): el uso de automatización para liberar de forma automática cada cambio que supera las pruebas hacia el entorno de producción, garantizando entregas frecuentes y confiables.
d)
Gestión de dependencias: actualización de dependencias externas/aguas arriba, gestión de paquetes, SemVer.
2.
Sistemas de construcción para C++: CMake, el estándar de facto de la industria.
3.
Alternativas modernas: xmake, Meson y Bazel – comparación de enfoques declarativos frente a basados en Lua/Python.
4.
Organización de proyectos multi-archivo: unidades de traducción, cabeceras, bibliotecas estáticas y dinámicas.
5.
Gestión de dependencias en C++ (vcpkg, Conan).

Aprendizaje esperado (Learning Outcomes)

1.
Comprender el uso de sistemas de CI/CD como una fuente de verdad para el estado del código compartido del equipo (éxito en la construcción y pruebas) [Familiarizarse]
2.
Configurar un proyecto C++ multi-archivo usando un sistema de construcción declarativo [Usar].
3.
Comparar CMake con al menos una alternativa moderna (xmake, Meson o Bazel) en velocidad de compilación y reproducibilidad [Evaluar].

5.13.5. Referencias Bibliográficas

[Stroustrup, 2013]

[Josuttis, 2019]

[Vandevoorde et al., 2017a]

[Stroustrup, 2022]

[Meyers, 2014]

[Williams, 2019]

[Vandevoorde et al., 2017b]

[Gamma et al., 1994a]

¿Encontraste una errata, un curso desactualizado, un enlace roto, o tienes una sugerencia? Cuéntanos.

Escanea para abrir en tu teléfono