El propósito de este módulo es integrar los conocimientos adquiridos a lo largo del curso en un proyecto práctico, aplicando los principios de diseño y las herramientas modernas del lenguaje C++.
El proyecto consistirá en el desarrollo de un sistema de dispositivos inteligentes, formado por distintos tipos de objetos que interactúan entre sí mediante relaciones de composición, herencia y polimorfismo, gestionados de forma segura a través de punteros inteligentes y el principio RAII.
Construir un pequeño sistema modular que simule la interacción entre sensores, actuadores y un controlador central, aplicando técnicas modernas de programación orientada a objetos.
El proyecto tiene un alcance didáctico, enfocado en la estructura y el diseño del código, no en la funcionalidad real de los dispositivos.
El sistema debe cumplir los siguientes requisitos:
-
Jerarquía de clases polimórfica
- Todos los dispositivos derivan de una clase base común
Dispositivo. - Cada tipo de dispositivo redefine su comportamiento según su función.
- Todos los dispositivos derivan de una clase base común
-
Lecturas opcionales
- Los sensores pueden realizar una lectura que a veces falle, representada mediante
std::optional<double>.
- Los sensores pueden realizar una lectura que a veces falle, representada mediante
-
Acciones configurables
- Los actuadores ejecutan una acción definida dinámicamente mediante una función o lambda, utilizando
std::function<void()>.
- Los actuadores ejecutan una acción definida dinámicamente mediante una función o lambda, utilizando
-
Gestión automática de memoria
- Los dispositivos se almacenan en el controlador usando
std::unique_ptr, garantizando la liberación automática de recursos.
- Los dispositivos se almacenan en el controlador usando
-
Procesamiento genérico de eventos
- Los resultados o eventos del sistema podrán representarse mediante
std::varianty procesarse constd::visit.
- Los resultados o eventos del sistema podrán representarse mediante
El sistema se estructura en torno a cuatro clases principales:
| Clase | Descripción | Conceptos aplicados |
|---|---|---|
| Dispositivo | Clase base abstracta que define la interfaz común. | Herencia, encapsulación, método virtual puro. |
| Sensor | Clase derivada que simula la lectura de valores. | Polimorfismo, std::optional, RAII. |
| Actuador | Clase derivada que ejecuta acciones configurables. | Inyección de comportamiento, lambdas, std::function. |
| Controlador | Clase que gestiona una colección de dispositivos. | Composición, punteros inteligentes, RAII. |
El siguiente diagrama UML muestra las relaciones entre las clases principales:
- La clase
Dispositivodefine la interfaz común para todos los dispositivos. SensoryActuadorderivan deDispositivoy proporcionan implementaciones específicas.Controladormantiene una colección de punteros inteligentes aDispositivo, gestionando su ciclo de vida.
El desarrollo de este sistema permitirá poner en práctica los principales conceptos de la programación orientada a objetos moderna en C++:
| Concepto | Aplicación en el proyecto |
|---|---|
| Encapsulación | Cada clase controla su propio estado y comportamiento. |
| Herencia y polimorfismo | Permiten tratar sensores y actuadores de forma uniforme. |
| Composición | El controlador contiene y gestiona los dispositivos. |
| RAII | La adquisición y liberación de recursos se realiza automáticamente. |
| Punteros inteligentes | std::unique_ptr y std::shared_ptr aseguran la gestión segura de memoria. |
Lambdas y std::function |
Permiten definir comportamientos dinámicos en tiempo de ejecución. |
Plantillas genéricas (std::optional, std::variant) |
Representan lecturas opcionales y eventos heterogéneos. |
En los apartados siguientes, construiremos el sistema de manera progresiva:
- Diseñaremos la jerarquía de clases (
Dispositivo,Sensor,Actuador). - Implementaremos la clase
Controladorque gestiona los dispositivos mediante composición y punteros inteligentes. - Añadiremos el manejo de eventos genéricos mediante
std::variantystd::visit. - Integraremos todas las piezas en un programa principal funcional y mantenible.
- Analizaremos el diseño resultante, destacando los principios aplicados y posibles mejoras.
