Skip to content

Design Patterns

Este documento detalla los patrones de diseño utilizados en el worker de demanda de productos.

  • 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:

    1. Implementación en la capa de infraestructura:
      • getQueueService() en src/infrastructure/providers/services.ts: Asegura que solo se cree una instancia del QueueService
      • getDemandService() en src/infrastructure/providers/services.ts: Asegura que solo se cree una instancia del DemandService
      • getProcessor() en src/infrastructure/providers/processors.ts: Asegura que solo se cree una instancia del ProductDemandProcessor
      • getWorker() en src/infrastructure/providers/processors.ts: Asegura que solo se cree una instancia del ProductDemandWorker
    2. 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
  • 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:

    1. Implementación en la capa de infraestructura:
      • HttpDemandService en src/infrastructure/services/demand/index.ts: Adapta el cliente HTTP a la interfaz DemandService
      • AwsQueueService en src/infrastructure/services/queue/index.ts: Adapta el cliente AWS SQS a la interfaz QueueService
    2. Beneficios:
      • Desacopla el dominio de los servicios externos
      • Permite reemplazar fácilmente las implementaciones de servicios externos
      • Simplifica las pruebas al permitir implementaciones simuladas
  • 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:

    1. Implementación en la capa de infraestructura:
      • Funciones factory en src/infrastructure/providers/services.ts y src/infrastructure/providers/processors.ts
    2. Beneficios:
      • Centraliza la lógica de creación de objetos
      • Simplifica la inyección de dependencias
      • Hace que el sistema sea más configurable
  • 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:

    1. Implementación en la capa de aplicación:
      • Función validation en src/infrastructure/validation/index.ts: Implementa una estrategia de validación usando Zod
      • checkIfEventIsProcessable y checkIfWarehouseExists en src/app/checkers.ts: Implementan estrategias de validación
    2. 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
  • 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:

    1. Implementación en todo el código:
      • Either de @justomx/either utilizado para el manejo de errores
      • EitherAsync para operaciones asíncronas
      • Funciones puras para validación y transformación
    2. 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