1. Introducción
2. Patrón Unidireccional
2.1 Pros y contras del enfoque unidireccional
3.1. Pros y contras del enfoque bidireccional
4. Documentación de Apple
5. The Composable Architecture (TCA)
5.1 ¿Qué es TCA y por qué es relevante en SwiftUI?
5.2 Componentes clave de TCA
5.3 Pros y contras de usar TCA en tus aplicaciones
Introducción
En este artículo nos enfocaremos en lo que es el patrón de arquitectura The Composable Architecture más conocida como TCA en SwiftUI. Pero antes de empezar vamos a preguntarnos lo siguiente:
- ¿Qué son patrones bidireccionales y unidireccionales?
- ¿En qué nos beneficia tener uno de esos patrones en nuestra app?
- ¿Apple recomienda el patrón bidirectional para el desarrollo de SwiftUI?
Patrón Unidireccional
El patrón unidireccional, es cuando la comunicación o el flujo de datos se produce en una sola dirección. Esto significa que un componente o módulo puede enviar información o eventos a otros componentes hasta llegar a nuestro único SSOT, pero no viceversa.
¿Qué es SSOT?
SSOT «Single Source of Truth«, es un sólo lugar donde guardar la información correcta y actualizada de todas nuestras vistas.
Pros y contras del enfoque unidireccional
Pros:
- Ideal para Aplicaciones Medianas y Largas.
- Única Fuente de Verdad.
- Predictibilidad: El flujo de datos unidireccional puede hacer que el comportamiento del sistema sea más predecible, ya que la información fluye en una sóla dirección.
- Modularidad: Los componentes pueden ser más independientes entre sí por lo que se facilita la reutilización y el intercambio de módulos.
- Depuración: La depuración es más sencilla en sistemas unidireccionales de tal modo que es más fácil rastrear el flujo de datos.
- Facilidad de prueba: Cada parte del sistema se puede probar de forma aislada haciendo que las pruebas unitarias sean más simples.
Contras:
- Posible abundancia de código: En algunos casos, este patrón puede resultar en código más verboso en comparación con otros patrones de SwiftUI, especialmente en aplicaciones simples.
- Alto consumo de memoria: Debido a la única fuente de verdad, puede consumir más memoria en algunas situaciones.
Patrón Bidireccional
Este patrón se aplica cuando la comunicación entre los componentes o módulos del sistema se da en ambas direcciones. Esto significa que los componentes pueden enviar información y eventos entre sí tanto hacia adelante como hacia atrás.
Pros y contras del enfoque bidireccional
Pros:
- Ideal para Aplicaciones pequeñas y medianas:
- Implementación simple y clara: proporciona una estructura clara y fácil de entender para organizar su código.
- Modularidad: Inicialmente, los componentes pueden ser más independientes entre sí, lo que facilita la reutilización y el intercambio de módulos.
- Facilidad de prueba: Inicialmente, cada parte del sistema se puede probar de forma aislada, lo que facilita las pruebas unitarias.
Contras:
- Mayor complejidad: Los sistemas bidireccionales tienden a ser más complejos, lo que puede dificultar la comprensión y el mantenimiento del código.
- Mayor riesgo de errores: La comunicación en ambas direcciones puede aumentar la posibilidad de errores.
- Mayor acoplamiento: Puede haber un mayor acoplamiento entre los componentes, lo que podría dificultar la reutilización y la escalabilidad.
- Menos predictibilidad: La comunicación bidireccional puede hacer que el comportamiento del sistema sea menos predecible, ya que la información puede fluir en múltiples direcciones.
- Modularidad: Es importante tener en cuenta que a medida que la aplicación crece significativamente (Medianas y Largas), la gestión de la modularidad puede volverse más compleja.
- Pruebas unitarias: Conforme la complejidad del sistema aumenta tamaño de la app (Medianas y Largas), la modularidad puede presentar desafíos adicionales en la realización de pruebas exhaustivas.
Documentación de Apple
En sus documentaciones de SwiftUI, Apple hace mucho énfasis en el data flow con gráficos donde se puede visualizar que son patrones unidireccionales además de tener referencias al SSOT
The Composable Architecture (TCA)
¿Qué es TCA y por qué es relevante en SwiftUI?
The Composable Architecture es una potente arquitectura de software creada por Brandon Williams y Stephen Celis para la empresa de desarrollo de software Point-Free.
Esta arquitectura está diseñada específicamente para su uso en Swift, el lenguaje de programación de Apple.
Se enfoca mucho en estos pilares claves:
- Side Effects: Comunicación del mundo externo con nuestra aplicación.
- State Management: Cómo se comporta la aplicación para diferentes valores de estado y también cómo se pasan los estados de una pantalla a otra.
- Composition: “Divide y vencerás”. Dividir las características en módulos más pequeños, bien definidos, aislados e individuales.
- Testing: Admite la prueba de mini módulos hasta la integración de características de extremo a extremo. También podemos probar cómo se comporta la aplicación ante efectos secundarios externos. Esto asegura que nuestra aplicación sea robusta.
Componentes clave de TCA
Una aplicación construida con TCA consta de cinco componentes principales que ayudan a modelar tu aplicación:
- State: A menudo, una colección de propiedades representa el estado de una aplicación o una característica distribuida en muchas clases. TCA coloca todas las propiedades relevantes juntas en un solo tipo.
- Actions: Una enumeración que incluye casos para todos los eventos que pueden ocurrir en tu aplicación, por ejemplo, cuando un usuario toca un botón, cuando suena un temporizador o cuando se recibe una solicitud de API.
- Environment: Un tipo que envuelve todas las dependencias de tu aplicación o característica. Por ejemplo, estos pueden ser clientes de API con métodos asíncronos.
- Reducer: Una función que utiliza una acción dada para transformar el estado actual en el próximo estado.
- Store: Un lugar al que tu interfaz de usuario observa para realizar cambios y donde envías acciones. Según estas acciones, ejecuta reductores.
Pros y contras de usar TCA en tus aplicaciones
Pros:
- Ideal para Aplicaciones Grandes: Es especialmente adecuado para aplicaciones grandes y complejas.
- Gestión de Estado Predecible: TCA impone un flujo estricto de datos unidireccional, facilitando el razonamiento sobre el estado de tu aplicación y solucionar problemas.
- Facilidad de Testing: TCA fomenta el desarrollo orientado a pruebas al separar la lógica de negocio de las vistas SwiftUI, permitiendo pruebas unitarias exhaustivas de la funcionalidad central de tu aplicación.
- Modularidad: Promueve un enfoque modular y componible para construir características, facilitando la reutilización de componentes y el mantenimiento del código.
- Reducción de Código Innecesario: TCA reduce la necesidad de código repetitivo, dando como resultado bases de código más limpias y concisas.
- Simplificación del Seguimiento de Datos: Es fácil hacer un seguimiento del flujo de datos, de dónde proviene, dónde cambia y a dónde va en la aplicación.
- Única Fuente de Verdad: Proporciona una única fuente de verdad, crucial para el concepto de gestión de estado en SwiftUI.
- Facilidad de Pruebas Rápidas: Probar la aplicación es simple y rápido al conectar un Almacén
- Trabajo en Equipo: Facilita la colaboración entre equipos de desarrollo.
- Objetivo Principal: Simplificar el desarrollo de aplicaciones haciéndolas escalables y fáciles de mantener.
- Recomendación de Apple: Cumple con las recomendaciones de Apple para aplicaciones SwiftUI.
Contras:
- Curva de aprendizaje: TCA puede tener una curva de aprendizaje más pronunciada para desarrolladores no familiarizados con conceptos de programación funcional o arquitecturas de flujo de datos unidireccional.
- Overhead de configuración inicial: Implementar TCA en un proyecto existente puede requerir refactorización y reescritura de partes del código, lo que puede llevar tiempo.
- Posible verbosidad: En algunos casos, TCA podría resultar en un código más denso en comparación con otros patrones de SwiftUI, especialmente para aplicaciones simples.
- Recursos de la comunidad limitados: Aunque TCA ha ganado popularidad, puede tener menos información, tutoriales y bibliotecas de terceros en comparación con patrones más establecidos.
- No siempre es necesario: TCA es más adecuado para aplicaciones complejas a gran escala. Para aplicaciones más simples, podría introducir complejidad innecesaria.
- Alto uso de memoria: Debido a la única fuente de verdad, TCA puede consumir más memoria en algunas situaciones.
Conclusión
En conclusión, este análisis detallado demuestra la importancia crítica de los patrones arquitectónicos, tanto unidireccionales como bidireccionales, en la creación de aplicaciones robustas y eficientes utilizando SwiftUI. Los patrones unidireccionales destacan en proyectos de gran escala debido a su previsibilidad y modularidad, mientras que los patrones bidireccionales son ideales para proyectos más pequeños y dinámicos, aportando sencillez y una estructura más clara.
En esencia, la decisión de optar por patrones unidireccionales, bidireccionales o incluso por el enfoque de The Composable Architecture (TCA) en SwiftUI debe guiarse por el tamaño y complejidad del proyecto, así como por la experiencia y las preferencias del equipo desarrollador.
Bibliografía
Unidirectional data flow in iOS Apps
MVC vs MVVM on iOS: Key Differences With Swift Examples
Architectures comparing for SwiftUI
Managing data flow between views