-
Patrón de Comando
- Encapsula solicitudes de acción en objetos, permitiendo operaciones y deshacer acciones.
-
Patrón Observer
- Notifica y actualiza automáticamente a varios objetos sobre los cambios de estado en otro objeto.
-
Patrón Strategy
- Define una familia de algoritmos, los encapsula y los hace intercambiables.
-
Patrón State
- Gestiona el estado del sistema de control por gestos, permitiendo cambiar su comportamiento según el estado interno.
-
Patrón Factory Method
- Proporciona una interfaz para crear objetos en una superclase, pero permite que las subclases alteren el tipo de objetos que se crearán.
-
Patrón Abstract Factory
- Ofrece una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
-
Patrón Singleton
- Asegura que una clase tenga solo una instancia y proporciona un punto de acceso global a ella.
-
Patrón Prototype
- Permite copiar objetos existentes sin hacer que el código dependa de sus clases.
-
Patrón Builder
- Separa la construcción de un objeto complejo de su representación.
-
Patrón Facade
- Proporciona una interfaz unificada a un conjunto de interfaces en un subsistema.
Razones de la Elección:
-
Encapsulamiento de Solicitudes como Objetos: Este patrón permite encapsular acciones o solicitudes a realizar en objetos de comando. Esto es particularmente útil para un sistema de control por gestos, donde diferentes gestos pueden estar asociados con diferentes acciones (como encender luces, ajustar termostatos, etc.). Cada gesto puede activar un comando específico que ejecuta la acción correspondiente.
-
Desacoplamiento: El patrón de comando desacopla el componente que invoca la acción (en este caso, el detector de gestos) de los componentes que realizan la acción (los dispositivos domóticos). Esto facilita la expansión o modificación del sistema sin requerir cambios significativos en el código existente.
-
Historial de Comandos: Permite implementar de manera sencilla la funcionalidad para deshacer o rehacer acciones, algo que puede ser valioso en un entorno domótico para revertir comandos accidentalmente activados.
-
Flexibilidad en la Asignación de Comandos: Facilita la configuración y personalización de qué gestos activan qué comandos, lo que puede ser ajustado según las preferencias del usuario o necesidades específicas sin alterar el núcleo del sistema de detección de gestos o el manejo de dispositivos.
En la práctica, el patrón de comando se implementaría creando una clase abstracta o interfaz Comando
con un método ejecutar()
(y potencialmente deshacer()
). Cada acción concreta (como encender una luz) se implementaría en una clase que extienda Comando
, sobrescribiendo el método ejecutar()
para llevar a cabo la acción específica. El sistema de detección de gestos tendría una manera de mapear gestos detectados a objetos de comando específicos y ejecutar el método ejecutar()
correspondiente.
- Rapidez en el Desarrollo: Python es conocido por su sintaxis clara y legible, lo que facilita la escritura rápida de código. Esto es particularmente útil en las etapas iniciales del proyecto, donde se prototipan ideas y se realizan pruebas conceptuales.
- Bibliotecas para Visión Artificial y Aprendizaje Automático: Python tiene una extensa colección de bibliotecas como OpenCV, TensorFlow y Keras, que son esenciales para el desarrollo de algoritmos de detección e interpretación de gestos.
- Comunidad Amplia: La vasta comunidad de desarrolladores de Python significa que hay una gran cantidad de recursos, tutoriales y soporte disponible, lo que puede ser invaluable para resolver problemas y aprender nuevas técnicas.
- Rendimiento: Aunque Python es suficientemente rápido para muchos casos de uso, su naturaleza interpretada puede limitar el rendimiento en tareas de procesamiento en tiempo real comparado con lenguajes compilados.
- Alto Rendimiento y Eficiencia: C++ es un lenguaje compilado que ofrece un control fino sobre los recursos del sistema y la gestión de la memoria, resultando en un rendimiento superior para el procesamiento en tiempo real de gestos, crucial para una respuesta rápida en aplicaciones domóticas.
- Interacción Directa con el Hardware: C++ permite un control detallado sobre el hardware, lo que es útil para interactuar directamente con cámaras, sensores y otros dispositivos del sistema domótico.
- Portabilidad: C++ es ampliamente soportado en diferentes plataformas y sistemas operativos, lo que permite desarrollar aplicaciones que pueden ser desplegadas en una variedad de entornos domóticos.
- Curva de Aprendizaje: C++ puede ser más complejo de aprender y utilizar debido a su sintaxis y la necesidad de gestionar manualmente aspectos como la memoria.
- Tiempo de Desarrollo: El desarrollo en C++ puede ser más lento comparado con Python, especialmente para prototipado y pruebas iniciales debido a la complejidad del lenguaje y la necesidad de compilación.