Design Patterns
Este documento detalla los patrones de diseño utilizados en el worker de demanda de productos.
Patrón Singleton
Section titled “Patrón Singleton”-
Descripción: El patrón Singleton asegura que una clase tenga una única instancia y proporciona un punto de acceso global a ella. Este patrón es útil cuando se necesita exactamente un objeto para coordinar acciones en todo el sistema.
-
Componentes clave:
- Implementación en la capa de infraestructura:
getQueueService()ensrc/infrastructure/providers/services.ts: Asegura que solo se cree una instancia del QueueServicegetDemandService()ensrc/infrastructure/providers/services.ts: Asegura que solo se cree una instancia del DemandServicegetProcessor()ensrc/infrastructure/providers/processors.ts: Asegura que solo se cree una instancia del ProductDemandProcessorgetWorker()ensrc/infrastructure/providers/processors.ts: Asegura que solo se cree una instancia del ProductDemandWorker
- Beneficios:
- Asegura un estado consistente en toda la aplicación
- Reduce el uso de recursos al reutilizar instancias de servicios
- Proporciona un único punto de acceso a servicios externos
- Implementación en la capa de infraestructura:
Patrón Adapter
Section titled “Patrón Adapter”-
Descripción: El patrón Adapter permite que objetos con interfaces incompatibles colaboren. Actúa como un envoltorio entre dos objetos, convirtiendo la interfaz de un objeto para que coincida con lo que el otro objeto espera.
-
Componentes clave:
- Implementación en la capa de infraestructura:
HttpDemandServiceensrc/infrastructure/services/demand/index.ts: Adapta el cliente HTTP a la interfaz DemandServiceAwsQueueServiceensrc/infrastructure/services/queue/index.ts: Adapta el cliente AWS SQS a la interfaz QueueService
- Beneficios:
- Desacopla el dominio de los servicios externos
- Permite reemplazar fácilmente las implementaciones de servicios externos
- Simplifica las pruebas al permitir implementaciones simuladas
- Implementación en la capa de infraestructura:
Patrón Factory Method
Section titled “Patrón Factory Method”-
Descripción: El patrón Factory Method proporciona una interfaz para crear objetos pero permite que las subclases alteren el tipo de objetos que se crearán. En este proyecto, se implementa como funciones factory.
-
Componentes clave:
- Implementación en la capa de infraestructura:
- Funciones factory en
src/infrastructure/providers/services.tsysrc/infrastructure/providers/processors.ts
- Funciones factory en
- Beneficios:
- Centraliza la lógica de creación de objetos
- Simplifica la inyección de dependencias
- Hace que el sistema sea más configurable
- Implementación en la capa de infraestructura:
Patrón Strategy
Section titled “Patrón Strategy”-
Descripción: El patrón Strategy define una familia de algoritmos, encapsula cada uno y los hace intercambiables. Permite que el algoritmo varíe independientemente de los clientes que lo utilizan.
-
Componentes clave:
- Implementación en la capa de aplicación:
- Función
validationensrc/infrastructure/validation/index.ts: Implementa una estrategia de validación usando Zod checkIfEventIsProcessableycheckIfWarehouseExistsensrc/app/checkers.ts: Implementan estrategias de validación
- Función
- Beneficios:
- Permite diferentes estrategias de validación
- Separa la lógica de validación de la lógica de negocio
- Hace que el sistema sea más mantenible
- Implementación en la capa de aplicación:
Patrones de Programación Funcional
Section titled “Patrones de Programación Funcional”-
Descripción: El proyecto utiliza patrones de programación funcional, particularmente la mónada Either para el manejo de errores, que representa un valor que puede ser un éxito (Right) o un fracaso (Left).
-
Componentes clave:
- Implementación en todo el código:
Eitherde@justomx/eitherutilizado para el manejo de erroresEitherAsyncpara operaciones asíncronas- Funciones puras para validación y transformación
- Beneficios:
- Hace que el manejo de errores sea explícito y seguro en cuanto a tipos
- Fomenta la inmutabilidad y las funciones puras
- Simplifica flujos de trabajo asíncronos complejos
- Implementación en todo el código: