Patrones de diseño: Atomic Design + Feature-Sliced
| Campo | Valor |
|---|---|
| Status | Aceptado |
| Encargados | Danieles |
| Fecha | 11-05-2026 |
| Proyecto | Aplicación React Native (MVP móvil + expansión web) |
Contexto y problema
Se está desarrollando una aplicación con React Native cuyo MVP está orientado a plataforma móvil, pero con la expectativa de extenderse a web en el corto-mediano plazo. Es necesario definir desde el inicio un patrón de diseño que:
- Maximice la reutilización de código entre móvil y web.
- Permita escalar el proyecto sin deuda técnica desde el MVP.
- Evite dispersar lógica de plataforma (
Platform.OS) por toda la base de código. - Facilite el trabajo en equipo con límites de responsabilidad claros entre módulos.
Impulsores de decisiones
- ¿Qué tan importante es la reutilización de componentes?
- ¿El patrón permite aislar las diferencias de plataforma sin contaminar la lógica de negocio?
- ¿Cuánto overhead introduce durante el MVP, cuando el equipo es pequeño y el tiempo es crítico?
Opciones consideradas
Opción 1: Atomic Design + Feature-Sliced Architecture (con Platform Abstraction Layer) Seleccionada
Combina la organización visual jerárquica de Atomic Design (átomos → moléculas → organismos) con Feature-Sliced Architecture para la lógica de negocio, más una capa de abstracción de plataforma para aislar diferencias entre móvil y web.
Ventajas
- Alta reutilización:
shared/yfeatures/son agnósticos de plataforma. - Boundaries claros: cada capa tiene reglas de importación explícitas.
- Escalable: agregar features nuevas no afecta las existentes.
- Platform Abstraction Layer elimina
if (Platform.OS)del código de negocio. - Compatible con Expo Router, Zustand y TanStack Query.
- Facilita testing unitario por feature. Desventajas
- Mayor setup inicial comparado con una arquitectura flat.
- Requiere disciplina del equipo para respetar las reglas de importación.
- Puede parecer over-engineered en las primeras semanas del MVP.
Opción 2: Arquitectura plana (por tipo de archivo)
Organización tradicional donde los archivos se agrupan por tipo: components/, screens/, hooks/, services/, utils/.
Ventajas
- Setup inmediato, sin overhead inicial.
- Familiar para la mayoría de desarrolladores React.
- Válido para proyectos pequeños o prototipos rápidos. Desventajas
- Escala muy mal:
components/crece sin estructura. - Dificulta encontrar todo lo relacionado a una feature.
- Acoplamiento alto entre partes del sistema.
- Agregar soporte web obliga a refactorizar toda la estructura.
- No tiene mecanismo natural para aislar diferencias de plataforma.
Opción 3: Monorepo con Nx o Turborepo
Separar el código en un monorepo con packages independientes: @app/mobile, @app/web, @app/shared.
Ventajas
- Separación física clara entre plataformas.
- Permite builds independientes y CI optimizado.
- Ideal para equipos grandes con ownership separado. Desventajas
- Overhead de configuración muy alto para un MVP.
- Complejidad operacional innecesaria con un equipo pequeño.
- El beneficio real se percibe con 3+ equipos trabajando en paralelo.
- Puede bloquear el avance en etapas tempranas del proyecto.
Resultado de la decisión
Se selecciona la Opción 1: Atomic Design + Feature-Sliced Architecture con Platform Abstraction Layer.
Esta combinación ofrece el mejor balance entre estructura sostenible y velocidad de desarrollo para el MVP. La separación en shared/, features/, screens/ y platform/ permite que la mayor parte del código sea 100% compartido entre móvil y web, mientras que la Platform Abstraction Layer concentra las diferencias de plataforma en un único lugar, evitando que contaminen la lógica de negocio.
La regla de importación unidireccional (shared → features → screens ← platform) garantiza que el proyecto escale sin generar dependencias circulares o acoplamiento implícito entre módulos.
Consecuencias positivas
- Más del 80% del código (lógica de negocio, estado, UI base) es reutilizable entre móvil y web sin modificación.
- Incorporar soporte web en el futuro solo requiere implementar las interfaces de
platform/, no refactorizar features. - Los nuevos desarrolladores tienen guías claras sobre dónde colocar cada tipo de código.
- El testing es más simple: cada feature es un módulo independiente sin efectos secundarios externos.
- Compatibilidad garantizada con el stack elegido: Expo Router (navegación), Zustand (estado), TanStack Query (data fetching) y React Hook Form (formularios).
- La estructura evita el crecimiento caótico de carpetas que ocurre con arquitecturas planas.
Consecuencias negativas
- La semana 1–2 del proyecto se invierte en configurar la estructura base antes de entregar features visibles.
- Se requiere una sesión de onboarding para que todos los miembros del equipo comprendan y respeten las reglas de importación entre capas.
- Para proyectos muy pequeños (1–2 pantallas), la estructura puede sentirse más compleja de lo necesario.
- Sin enforcement automático (e.g., ESLint con import boundaries), las reglas dependen de la disciplina del equipo.