Introducción
Hace más de un año, implementamos una arquitectura que inicialmente bauticé como Simplex, la cual fue refinada hasta convertirse en EleganFlow. Este nombre refleja la simplicidad y practicidad que buscábamos al diseñar un flujo modular y robusto para nuestras aplicaciones. En este artículo, compartiré las lecciones aprendidas, las mejoras que implementamos y los buenos patrones que adoptamos a lo largo del camino.
¿Qué es EleganFlow?
EleganFlow es una arquitectura modular diseñada principalmente para NestJS, aunque sus principios pueden aplicarse a otros frameworks. Se basa en la separación de responsabilidades en tres etapas bien definidas: Verificación, Proceso y Presentación. Cada etapa está compuesta por reglas o procesos individuales que se alinean con el principio de responsabilidad única. Este enfoque facilita la comprensión, mantenimiento y extensibilidad del sistema.
¿Por qué EleganFlow?
Al inicio, implementar una arquitectura robusta como EleganFlow puede parecer una tarea costosa, pero sus beneficios se vuelven evidentes con el tiempo. A medida que la base de código crecía, los errores fueron disminuyendo considerablemente. Este tipo de arquitectura modular facilita las actualizaciones, simplifica la depuración y asegura que cada componente haga solo una cosa.
Principios Clave de EleganFlow
Responsabilidad Única: Cada módulo, regla o proceso tiene una única responsabilidad dentro de su contexto.
Modularidad: Las etapas del flujo están claramente separadas, permitiendo una fácil integración y extensión.
Estrategias Independientes: Las reglas y procesos se implementan como estrategias independientes, lo que permite modificarlas sin afectar el sistema entero.
Retroalimentación Clara: En cada fase, el sistema proporciona retroalimentación clara al usuario, asegurando que los errores sean fáciles de identificar y corregir.
Etapas de la Arquitectura EleganFlow
1.Verificación
La verificación es la primera etapa en EleganFlow, y tiene dos componentes principales:
Sintaxis:
Validación inicial de la estructura y los tipos de datos utilizando DTOs (Data Transfer Objects).
Semántica:
Validación profunda según las reglas de negocio, asegurando que los datos sean consistentes y lógicamente válidos.
Flujo de trabajo:
Controlador:
Los datos entrantes son recibidos y validados en términos de sintaxis utilizando DTOs. Si la validación falla, se responde con los errores correspondientes.
Servicio: Los datos validados se pasan al servicio, donde se realiza una validación semántica utilizando reglas de negocio.
Ejemplo de Implementación
DTO de Creación:
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
export class CreatePersonDto {
@IsString()
@IsNotEmpty()
name: string;
@IsEmail()
email: string;
}
Controlador:
import { Controller, Post, Body } from '@nestjs/common';
import { CreatePersonDto, PeopleService, Person } from '../.';
import { CreateResponseInterface, HttpStatusEnum } from '../../common';
@Controller('people')
export class PeopleController {
constructor(private readonly peopleService: PeopleService) {}
@Post()
async create(@Body() createPersonDto: CreatePersonDto): Promise<CreateResponseInterface<Person>> {
return await this.peopleService.create(createPersonDto);
}
}
Servicio:
import { Injectable } from '@nestjs/common';
import { Person } from '../entities';
import { CreatePersonDto } from '../dtos';
import { PersonChecker } from '../checkers';
@Injectable()
export class PeopleService {
constructor(private readonly personChecker: PersonChecker) {}
async create(createPersonDto: CreatePersonDto): Promise<CreateResponseInterface<Person>> {
const newPerson: Person = CreatePersonDtoToPersonAdjust(createPersonDto);
await this.personChecker.validateCreate(newPerson);
return { ok: true, data: newPerson, message: 'Person created successfully' };
}
}
2. Proceso
En la etapa de proceso, cada paso se implementa como un proceso que sigue el principio de responsabilidad única. Los procesos se agrupan en un blueprint que define el flujo completo de procesamiento. Esta fase puede incluir la iteración y enriquecimiento de datos.
Proceso y Rollback:
Si un paso falla, se puede hacer un rollback, asegurando que los datos previos no se vean comprometidos.
3. Presentación
En esta etapa, se construye la respuesta final que será presentada al usuario. Aquí no se deben generar nuevos registros en la base de datos. Solo se transforma la información previamente procesada.
Beneficios de EleganFlow
1. Modularidad y Flexibilidad
Cada etapa es independiente y puede ser extendida o modificada sin afectar a las demás, lo que permite adaptarse a cambios rápidamente.
2. Claridad y Simplicidad
La arquitectura es fácil de entender y cada componente tiene un propósito claro, lo que facilita el desarrollo y la depuración.
3. Reutilización
Las reglas y procesos son modulares y pueden ser reutilizados en diferentes partes del sistema o incluso en otros proyectos.
4. Retroalimentación Clara
Los usuarios siempre reciben retroalimentación clara y detallada en caso de errores, lo que facilita la identificación de problemas.
Desafíos Iniciales
Aunque EleganFlow trae muchos beneficios, su implementación inicial puede requerir un esfuerzo considerable. Aquí algunos desafíos:
Complejidad Inicial:
La configuración de reglas y procesos puede llevar tiempo, especialmente en aplicaciones más simples.
Sobrecarga de Desarrollo: La necesidad de mantener la modularidad puede incrementar la carga de desarrollo.
Curva de Aprendizaje: Los nuevos desarrolladores pueden necesitar tiempo para adaptarse a este tipo de arquitectura.
Conclusión
La implementación de EleganFlow ha demostrado ser una inversión rentable a largo plazo. Su modularidad, claridad y facilidad de mantenimiento han reducido significativamente los errores y han mejorado la estabilidad del sistema. La clave está en aplicar principios sólidos de arquitectura como la responsabilidad única y modularidad, lo que hace que el sistema sea escalable y fácil de entender.
La implementación de una arquitectura de este tipo no solo es sostenible, sino que también facilita las actualizaciones y mejora la calidad del código a medida que el proyecto crece.
Top comments (0)