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

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

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

5.13.1. Justificación ↑ Volver arriba

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 ↑ Volver arriba

  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) ↑ Volver arriba

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 ↑ Volver arriba

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

Referencias Bibliográficas: (Stroustrup, 2013; Josuttis, 2019; Vandevoorde 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: Polimorfismo y Tipado Complementario (12 horas) [Habilidades AG-C09,AG-C12] ↑ Volver arriba

Referencias Bibliográficas: (Stroustrup, 2013; Vandevoorde et al., 2017a; Stroustrup, 2022)

Temas

  1. Tipos genéricos (polimorfismo paramétrico):
    1. Definición y ventajas del polimorfismo: paramétrico, de subtipado (subtyping), de sobrecarga (overloading) y de coerción
    2. Comparación de tipos monomórficos y polimórficos
    3. Comparación con polimorfismo ad-hoc (sobrecarga) y polimorfismo de subtipos
    4. Parámetros genéricos y tipado
    5. Uso de bibliotecas genéricas como colecciones
    6. Comparación con polimorfismo ad hoc (sobrecarga) y polimorfismo de subtipos
    7. Polimorfismo prescriptivo vs descriptivo
    8. Modelos de implementación de tipos polimórficos
    9. Subtipado enumerate
    10. 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.
    11. Concepts (C++20): sintaxis declarativa para restringir parámetros de plantilla, sucesor moderno de SFINAE con mejores diagnósticos de error.
    12. 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.
    13. Reenvío perfecto y referencias universales.
    14. Plantillas variádicas.
    15. 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] ↑ Volver arriba

    Referencias Bibliográficas: (Meyers, 2014; Stroustrup, 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] ↑ Volver arriba

    Referencias Bibliográficas: (Williams, 2019; Stroustrup, 2013)

    Temas

    1. Seguridad (safety) y vivacidad (liveness):
      1. Condiciones de carrera (race conditions)
      2. Dependencias/precondiciones
      3. Modelos de fallos (fault models)
      4. Terminación enumerate
      5. Modelos de programación:
        1. Modelo de actores (actor models)
        2. Modelos procedurales y reactivos
        3. Modelos de programación síncrona/asíncrona
        4. Paralelismo de datos (data parallelism) enumerate
        5. Comunicación y coordinación:
          1. Mutexes
          2. Paso de mensajes (message-passing)
          3. Memoria compartida (shared memory)
          4. Cobegin-coend
          5. Monitores
          6. Canales (channels)
          7. Hilos (threads)
          8. Guardas (guards) enumerate
          9. std::thread y gestión de hilos.
          10. std::jthread (C++20): unión automática (RAII) y cancelación cooperativa vía stop_token.
          11. Mutexes, candados y variables de condición.
          12. Mecanismos de sincronización de C++20: std::latch, std::barrier, std::counting_semaphore.
          13. Operaciones atómicas y programación sin bloqueo.
          14. std::async y futures.
          15. 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).
          16. Patrones de diseño seguros para hilos.
          17. 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] ↑ Volver arriba

          Referencias Bibliográficas: (Stroustrup, 2013; Vandevoorde 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] ↑ Volver arriba

          Referencias Bibliográficas: (Stroustrup, 2013; Williams, 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] ↑ Volver arriba

          Referencias Bibliográficas: (Gamma et al., 1994a; Stroustrup, 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] ↑ Volver arriba

          Referencias Bibliográficas: (Meyers, 2014; Stroustrup, 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] ↑ Volver arriba

          Referencias Bibliográficas: (Stroustrup, 2013; Stroustrup, 2022)

          Temas

          1. Automatización de procesos de software:
            1. Sistemas de construcción (build systems): el valor de builds rápidos, herméticos y reproducibles, comparar/contrastar enfoques para construir un proyecto.
            2. 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).
            3. 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.
            4. Gestión de dependencias: actualización de dependencias externas/aguas arriba, gestión de paquetes, SemVer. enumerate
            5. Sistemas de construcción para C++: CMake, el estándar de facto de la industria.
            6. Alternativas modernas: xmake, Meson y Bazel – comparación de enfoques declarativos frente a basados en Lua/Python.
            7. Organización de proyectos multi-archivo: unidades de traducción, cabeceras, bibliotecas estáticas y dinámicas.
            8. 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 ↑ Volver arriba

            Stroustrup, B. (2013). The C++ Programming Language. Addison-Wesley Professional.

            Josuttis, N. M. (2019). C++17: The Complete Guide. Pearson Education.

            Vandevoorde, D., Josuttis, N. M., and Gregor, D. (2017a). C++ Templates: The Complete Guide. Addison-Wesley Professional.

            Stroustrup, B. (2022). A Tour of C++. Addison-Wesley Professional, 3rd edition.

            Meyers, S. (2014). Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14. O'Reilly Media.

            Williams, A. (2019). C++ Concurrency in Action. Manning Publications.

            Vandevoorde, D., Josuttis, N. M., and Gregor, D. (2017b). C++ Templates: The Complete Guide. Addison-Wesley Professional.

            Gamma, E., Helm, R., Johnson, R., and Vlissides, J. (1994a). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.

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

            Escanea para abrir en tu teléfono