El caos de las capas horizontales: La "Cirugía de Escopeta"
Casi todos empezamos igual: una carpeta de Controllers, otra de Services y otra de Models. En los libros de texto parece el orden perfecto, pero en la vida real, a medida que la aplicación crece, este diseño se convierte en una trampa.
Seguro te ha pasado: te piden cambiar un campo en la factura (Invoices). Para lograrlo, tienes que abrir 5 pestañas en tu editor: el controlador de facturas, el servicio de facturas, el repositorio, el DTO y la validación. Todas en carpetas distintas, perdidas entre otros 50 archivos que no tienen nada que ver con lo que estás haciendo.
A esto se le llama Shotgun Surgery (cirugía de escopeta): un solo cambio te obliga a disparar modificaciones por todo el proyecto. El acoplamiento es total y la carga cognitiva (el esfuerzo mental para entender dónde está cada cosa) es altísima.
Vertical Slices: Pensar en Dominios, no en Archivos
La propuesta es simple pero transformadora: Divide tu aplicación por lo que hace, no por lo que es. En lugar de agrupar todos los controladores del mundo en un solo lugar, agrupamos todo lo relacionado a un contexto de negocio o "Slice". Imagina que cada funcionalidad es un pastel: en lugar de comerte solo la capa de arriba (el frosting), cortas una rebanada vertical que incluye todas las capas (UI, Lógica, Datos).
Estructura sugerida:
- Auth: (Controller, Service, JWT logic, Repository)
- Users: (Controller, Profile Service, Validations)
- Invoices: (Controller, Tax Logic, PDF Generator, Repo)
Al organizar tu monolito así, estás creando contextos desacoplados. Si el día de mañana el módulo de Invoices crece tanto que necesita su propia base de datos, la migración a un microservicio será casi un "copy-paste".
¿Por qué este enfoque cambia las reglas del juego?
Dividir por slices verticales no es solo una preferencia estética, es una decisión estratégica que trae beneficios tangibles:
- Onboarding ultra rápido: Cuando un desarrollador nuevo llega al equipo y tiene que tocar "Pagos", no tiene que aprenderse toda la arquitectura del sistema. Solo necesita abrir la carpeta
Paymentsy ahí tendrá todo el contexto. - Facilidad de Testing: Los tests unitarios y de integración viven al lado del código que prueban. Es mucho más sencillo mockear dependencias cuando las fronteras del dominio están claras.
- Velocidad de entrega (Time-to-Market): Al reducir la fricción de navegar por carpetas infinitas, el equipo desarrolla funcionalidades de punta a punta de forma más ágil.
- Menos conflictos en Git: Es menos probable que dos desarrolladores toquen los mismos archivos si uno está trabajando en
Authy el otro enInvoices. Cada uno trabaja en su "rebanada".
Pros y Contras: La honestidad ante todo
Como toda decisión de arquitectura, esto no es una bala de plata. Hay intercambios (trade-offs) que debes conocer.
Ventajas (Pros)
- Bajo Acoplamiento: Un cambio en la lógica fiscal dentro de
Invoicestiene nulas probabilidades de romper el login enAuth. - Navegación Intuitiva: El proyecto se explica solo a través de sus carpetas de negocio.
- Escalabilidad Evolutiva: Te permite crecer de forma organizada. Si el monolito se vuelve gigante, ya está "pre-segmentado" para convertirse en microservicios sin dolor.
¿Cuándo NO es beneficioso? (Contras)
- Aplicaciones tipo CRUD básico: Si tu app solo hace 4 operaciones básicas sobre 2 tablas, crear esta estructura es Overengineering. Añades carpetas y archivos innecesarios para algo que no va a escalar.
- Duplicación de código intencional: A veces, para mantener los slices independientes, podrías terminar duplicando una clase de
UserDTOen dos módulos. Para algunos desarrolladores puristas, esto es difícil de aceptar (aunque a veces es mejor que una dependencia acoplada). - Disciplina del equipo: Requiere que todos entiendan dónde termina un dominio y empieza otro. Si el equipo no tiene experiencia, pueden terminar creando "Slices monstruos" que mezclan todo de nuevo.
Conclusión
Organizar tu código por dominios desde el día 1 no es "escalado prematuro". Es higiene técnica y respeto por tu "yo" del futuro. Un monolito bien modularizado es mucho más valioso, barato de mantener y fácil de evolucionar que un ecosistema de microservicios mal gestionados.
No pienses en archivos, piensa en capacidades de negocio. Tu código (y tu salud mental) te lo agradecerán.