Planteamiento general del proyecto
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.
Objetivo general
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.
Requisitos funcionales
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
Arquitectura del sistema
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. |
Diagrama UML general
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.
Tecnologías y características aplicadas
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. |
Flujo general de desarrollo
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.