React
Patrones de Diseño
Arquitectura
Frontend
TypeScript

Patrones de diseño avanzados en React para código mantenible

Aprende a estructurar aplicaciones React escalables y mantenibles usando patrones de diseño probados en grandes bases de código

12 min de lectura
Por Therry Miranda

Cuando empezamos a desarrollar en React, suele ser suficiente con entender los conceptos básicos de componentes, props y estado. Sin embargo, a medida que nuestras aplicaciones crecen, necesitamos adoptar patrones de diseño que nos permitan mantener el código organizado, reutilizable y testeable.

En este artículo, exploraremos patrones avanzados que utilizamos en bases de código empresariales para mantener la complejidad bajo control y facilitar el trabajo en equipo.

El problema del crecimiento descontrolado#

Primero, identifiquemos los síntomas de una base de código React que ha crecido sin patrones adecuados:

  • Componentes de más de 300-500 líneas
  • Lógica de negocio mezclada con la interfaz de usuario
  • Duplicación de código entre componentes similares
  • Dificultad para testear componentes de forma aislada
  • Props drilling a través de múltiples niveles de componentes
  • Cambios que producen efectos secundarios inesperados

Si tu aplicación muestra varios de estos síntomas, es momento de introducir patrones más estructurados.

1 Componentes controlados vs. no controlados#

Este es uno de los patrones fundamentales que sigue causando confusión incluso entre desarrolladores experimentados.

Componente Controlado#

Un componente controlado no mantiene su propio estado; recibe valores y callbacks desde el componente padre.

Componente No Controlado#

Un componente no controlado gestiona su propio estado internamente.

¿Cuándo usar cada uno?#

  • Controlados: Cuando necesitas validación en tiempo real, manipular el input antes de mostrarlo, o varios componentes necesitan compartir/sincronizar el mismo valor.
  • No controlados: Para formularios simples, cuando no necesitas procesar el valor antes de enviarlo, o para reducir renders innecesarios.

2 El patrón Compound Component#

Este patrón resuelve el problema de tener componentes con demasiadas props y configuraciones, permitiendo una API más declarativa y flexible.

Ventajas del patrón Compound Component#

1 API más expresiva y declarativa 2 Menos prop drilling 3 Mejor encapsulación de la lógica interna 4 Componentes reutilizables con configuración flexible

3 El patrón de Control de Props (Props Getter)#

Este patrón te permite combinar comportamientos personalizados con los comportamientos predeterminados de tus componentes, ideal para construir hooks reutilizables.

Ventajas del patrón Props Getter#

1 Permite extensibilidad sin conocer la implementación interna 2 Combina comportamientos predeterminados con personalizados 3 Mejora la interfaz de tus hooks personalizados 4 Mantiene intactos los atributos de accesibilidad

4 El patrón Custom Hook Factory#

Un patrón menos conocido pero extremadamente útil para crear familias de hooks relacionados.

Ventajas del patrón Custom Hook Factory#

1 Crea familias de hooks con comportamiento consistente 2 Reduce la duplicación de código 3 Facilita cambios en toda una familia de hooks a la vez 4 Mejor inferencia de tipos al usar TypeScript

5 El patrón de Separación de Preocupaciones#

No es un patrón específico de código, sino un enfoque arquitectónico para organizar componentes.

Aunque React Hooks ha diluido un poco la separación estricta entre componentes contenedores y presentacionales, el principio sigue siendo valioso. En aplicaciones empresariales, preferimos esta implementación moderna:

Ventajas de la separación de preocupaciones#

1 Mejor testabilidad - Puedes testear la lógica y la UI por separado 2 Reutilización - El mismo hook puede usarse en múltiples componentes 3 Mantenibilidad - Cambios en la lógica no afectan la UI y viceversa 4 División del trabajo - Los equipos pueden trabajar en paralelo

Implementando estos patrones en una aplicación real#

Para ilustrar cómo estos patrones funcionan juntos, veamos un ejemplo más completo de una funcionalidad común: un selector de elementos con búsqueda.

Este ejemplo combina varios patrones:

  • Separación de preocupaciones: La lógica está en un hook custom, la UI en un componente
  • Props getters: Para combinar comportamientos predeterminados con personalizados
  • Componente controlado: Permite controlar el estado desde fuera si es necesario

Conclusión#

Estos patrones no son reglas estrictas sino herramientas que puedes aplicar según las necesidades de tu proyecto. Las aplicaciones pequeñas pueden no necesitar todos estos patrones, pero a medida que tu base de código crece, te agradecerás haberlos implementado.

Recuerda que el objetivo final no es usar patrones por usarlos, sino crear un código que sea:

1 Mantenible: Fácil de entender y modificar 2 Testeable: Separar responsabilidades facilita las pruebas 3 Reutilizable: Componentes y lógica que puedas usar en diferentes partes 4 Coherente: Un enfoque consistente en toda la aplicación

¿Qué patrones de diseño React utilizas en tus proyectos? ¿Has encontrado otros que no mencionamos aquí? Comparte tu experiencia en los comentarios.


Próximamente: "Arquitectura por características vs. por tipo: Organizando tu código React para equipos grandes" - Una guía para estructurar proyectos React a escala.

#React#Patrones de Diseño#Arquitectura#Frontend#TypeScript