Design Patterns
Este documento detalla los patrones de diseño utilizados en el microservicio op-scanner.
Strategy Pattern
Section titled “Strategy Pattern”El Strategy pattern es un patrón de diseño de comportamiento que permite seleccionar un algoritmo en tiempo de ejecución. Define una familia de algoritmos, encapsula cada uno y los hace intercambiables.
Implementación
Section titled “Implementación”En el microservicio op-scanner, el Strategy pattern se implementa en el caso de uso Scan para manejar diferentes tipos de entidades que pueden ser escaneadas.
Componentes clave:
-
Context:
- Clase
Scan(src/app/usecase/scan.ts): Contiene una referencia a una estrategia y delega el trabajo a ella.
- Clase
-
Strategies:
findProduct: Estrategia para encontrar productos por EANfindSupply: Estrategia para encontrar suministros por código de barrasfindLocation: Estrategia para encontrar ubicaciones por nombrefindContainer: Estrategia para encontrar contenedores por nombre
-
Strategy Selection:
- El registro
findersmapea los tipos de escaneo a sus métodos de búsqueda correspondientes:this.finders = {[ScanType.Product]: this.findProduct,[ScanType.Supply]: this.findSupply,[ScanType.Location]: this.findLocation,[ScanType.Container]: this.findContainer,}
- El registro
Flujo de Operación
Section titled “Flujo de Operación”- El método
invokerecibe un texto para escanear y tipos opcionales para verificar. - Filtra los tipos de escaneo basados en el formato del texto usando el
scanTypeCheckerMapper. - Para cada tipo coincidente, selecciona la estrategia de búsqueda apropiada del registro
finders. - Ejecuta cada estrategia y devuelve el primer resultado exitoso.
Beneficios
Section titled “Beneficios”- Flexibilidad: Se pueden agregar nuevos tipos de escaneo implementando un nuevo método de búsqueda y agregándolo al registro
finders. - Mantenibilidad: Cada método de búsqueda está enfocado en una sola responsabilidad, haciendo que el código sea más fácil de mantener.
- Testabilidad: Cada estrategia puede ser probada independientemente.
Functional Programming Patterns
Section titled “Functional Programming Patterns”El microservicio también utiliza patrones de programación funcional a través de la biblioteca @justomx/either.
Either Monad
Section titled “Either Monad”El Either monad se utiliza para el manejo de errores en toda la aplicación. Representa un valor que puede ser un éxito (Right) o un fracaso (Left).
Componentes clave:
-
Either Class:
- Proporciona métodos como
map,flatMapyrunpara trabajar con el resultado.
- Proporciona métodos como
-
EitherAsync Class:
- Extiende el patrón Either para trabajar con operaciones asíncronas.
-
Ejemplos de uso:
- En métodos de búsqueda para manejar posibles errores:
return await EitherAsync.fromPromise(this.productService.getByEan(Ean.valueOf(text), country, warehouse)).map((product) => new ScanProductInfo(product)).run()
- En métodos de búsqueda para manejar posibles errores:
Beneficios
Section titled “Beneficios”- Type Safety: Los errores se manejan de manera segura en cuanto a tipos.
- Composition: Las operaciones pueden encadenarse con
mapyflatMap. - Readability: El código muestra claramente el camino feliz y el manejo de errores.
Value Object Pattern
Section titled “Value Object Pattern”El Value Object pattern se utiliza extensivamente en la capa de dominio para representar objetos inmutables sin identidad.
Componentes clave:
-
Value Objects:
Ean(src/domain/product/valueobjects/ean.ts): Representa un código EAN de productoLocationName(src/domain/location/valueobjects/name.ts): Representa un nombre de ubicaciónContainerName(src/domain/container/valueobjects/name.ts): Representa un nombre de contenedorBarcode(src/domain/supply/valueobjects/barcode.ts): Representa un código de barras de suministroCountry(src/domain/valueobjects/country.ts): Representa un paísWarehouse(src/domain/valueobjects/warehouse.ts): Representa un almacén
-
Implementación:
- Los value objects son inmutables
- Validan sus datos en la creación
- Encapsulan reglas de dominio relacionadas con sus valores
Beneficios
Section titled “Beneficios”- Immutability: Los value objects no pueden cambiarse después de la creación, reduciendo errores.
- Validation: La lógica de validación está encapsulada en el value object.
- Domain Logic: Las reglas de negocio relacionadas con el valor están encapsuladas.