Redux son como contenedores estatales en SwiftUI. Recomendaciones

imagen

La semana pasada hablamos sobre contenedores estatales como Redux en SwiftUI . Redux proporciona una única fuente de valores de verdad que evita una gran cantidad de posibles errores que pueden ocurrir en diferentes estados de la aplicación. Esta semana hablaremos sobre métodos probados para crear aplicaciones basadas en Redux que mantendrán nuestra base de código simple y sin errores.

Normalización


El concepto de Redux tiene un objeto de tienda que contiene el estado de toda la aplicación y esto sirve como una fuente única de valores de verdad para nuestra aplicación. Esto nos permite sincronizar la interfaz de usuario con el estado de la aplicación. Pero para lograr esto, primero, es necesario normalizar el estado. Considere el siguiente ejemplo de código.

struct AppState { var allTasks: [Task] var favorited: [Task] } 

Hay una estructura AppState que almacena una lista de tareas simples y seleccionadas. Parece simple, pero tiene un gran defecto. Supongamos que hay una pantalla de edición de tareas donde puede cambiar la tarea seleccionada. Cada vez que el usuario hace clic en el botón "Guardar", necesitamos encontrar y luego actualizar una tarea específica en la lista de todas las Tareas (todas las tareas) y en la lista de tareas favoritas (seleccionadas). Esto puede provocar errores y problemas de rendimiento si la lista de tareas es demasiado grande.

Mejoremos un poco el rendimiento de la aplicación normalizando la estructura de estado. En primer lugar, debemos almacenar nuestras tareas en el Diccionario , donde el identificador de la tarea es la clave y la tarea en sí es el valor. Un diccionario puede obtener un valor clave durante un tiempo constante (O (1)) , pero al mismo tiempo, no conserva el orden. En este caso, puede crear una matriz con identificadores para preservar el orden. Ahora veamos el estado cambiado después de la normalización.

 struct AppState { var tasks: [Int: Task] var allTasks: [Int] var favorited: [Int] } 

Como se indica en el ejemplo anterior, las tareas se almacenan en el Diccionario, donde la identificación del identificador de tarea es la clave, y la tarea en sí es el valor. Las matrices de identificadores se almacenan para todas las tareas y tareas seleccionadas. Logramos un estado de estabilidad que sincroniza la interfaz de usuario y los datos.

Estado compositivo


Es muy natural almacenar el estado de su aplicación en una sola estructura, pero puede explotar tan pronto como agregue más y más campos a la estructura de estado. Podemos usar el estado composicional para resolver este problema. Veamos un ejemplo.

 struct AppState { var calendar: CalendarState var trends: TrendsState var settings: SettingState } 

En el ejemplo de código anterior, dividimos nuestro estado en tres partes separadas y las combinamos en un AppState.

Reductor de composición


Otro componente importante de un contenedor de estado tipo Redux es el Reductor mismo. Se puede extraer y combinar, como fue el caso con la estructura de estado. Esto nos permitirá cumplir con el principio de responsabilidad única y mantener objetos como reductores de tamaños pequeños.

 enum AppAction { case calendar(action: CalendarAction) case trends(action: TrendsAction) } let trendsReducer: Reducer<TrendsState, TrendsAction> = Reducer { state, action in // Implement your state changes here } let calendarReducer: Reducer<CalendarState, CalendarAction> = Reducer { state, action in // Implement your state changes here } let appReducer: Reducer<AppState, AppAction> = Reducer { state, action in switch action { case let .calendar(action): calendarReducer.reduce(&state.calendar, action) case let .trends(action): trendsReducer.reduce(&state.trends, action) } } 

Conclusión


Hoy hablamos sobre dos estrategias importantes que debemos usar al desarrollar aplicaciones que usan contenedores de estado tipo Redux en SwiftUI. Tanto la normalización como la integración hacen que la aplicación creada sea más simple y comprensible. Espero que disfrutes este artículo.

Gracias por leer y nos vemos la próxima semana!

Source: https://habr.com/ru/post/476924/


All Articles