Design Patterns
Este documento detalla los patrones de diseño utilizados en el worker de asignación de ubicaciones.
Patrón Dependency Injection
Section titled “Patrón Dependency Injection”- Descripción: Una técnica donde un objeto recibe otros objetos de los que depende. Estos otros objetos se denominan dependencias.
- Componentes clave:
- Implementación en el proyecto:
EventProcessor: Recibe dependencias como función de validación, servicio de warehouse y procesadores en su constructorNewProductProcessor: Recibe servicio de asignación y procesador de estadoStateProcessor: Recibe servicio de asignaciónLocationAssignmentWorker: Recibe servicio de cola y procesador de eventos
- Beneficios:
- Mejora la testabilidad al permitir inyectar implementaciones mock
- Desacopla componentes, haciendo el sistema más modular
- Soporta el Principio de Inversión de Dependencias de SOLID
- Implementación en el proyecto:
Patrón Repository/Adapter
Section titled “Patrón Repository/Adapter”- Descripción: Proporciona una API limpia para acceder a sistemas o recursos externos, abstrayendo los detalles de implementación.
- Componentes clave:
- Interfaces del dominio:
LocationAssignmentService: Define operaciones para crear y cambiar el estado de asignaciones de ubicaciónWarehouseService: Define operaciones para recuperar información de warehousesQueueService: Define operaciones para recibir y eliminar mensajes de una cola
- Implementaciones en infraestructura:
HttpLocationAssignmentService: Implementa LocationAssignmentService usando llamadas HTTPHttpWarehouseService: Implementa WarehouseService usando llamadas HTTPAwsQueueService: Implementa QueueService usando AWS SQS
- Beneficios:
- Desacopla el dominio de los sistemas externos
- Facilita el cambio de implementaciones sin afectar al dominio
- Soporta testing al permitir implementaciones mock
- Interfaces del dominio:
Patrón Either Monad
Section titled “Patrón Either Monad”- Descripción: Un patrón de programación funcional para manejar operaciones que pueden fallar, proporcionando una forma estructurada de manejar errores.
- Componentes clave:
- Implementación en el proyecto:
Either<BusinessError, T>: Representa un valor de éxito de tipo T o un error de tipo BusinessErrorEitherAsync: Versión asíncrona de Either para manejar promesas
- Ejemplos de uso:
LocationAssignmentWorker.run(): Usa EitherAsync para manejar posibles errores en el pipeline de procesamientoEventProcessor.process(): Retorna Either para indicar éxito o fallo- Métodos de servicio: Retornan Either para manejar posibles errores de sistemas externos
- Beneficios:
- Proporciona una forma estructurada de manejar errores sin excepciones
- Hace que el manejo de errores sea explícito en el sistema de tipos
- Soporta composición funcional de operaciones que pueden fallar
- Implementación en el proyecto:
Patrón Command
Section titled “Patrón Command”- Descripción: Encapsula una solicitud como un objeto, permitiendo parametrizar clientes con diferentes solicitudes y encolar o registrar solicitudes.
- Componentes clave:
- Implementación en AWS SDK:
ReceiveMessageCommand: Encapsula una solicitud para recibir mensajes de SQSDeleteMessageCommand: Encapsula una solicitud para eliminar un mensaje de SQS
- Uso en el proyecto:
AwsQueueService: Crea y envía objetos de comando al cliente SQS
- Beneficios:
- Desacopla el emisor del receptor
- Permite la parametrización de operaciones
- Soporta logging, encolamiento y otras preocupaciones transversales
- Implementación en AWS SDK: