
La semaine dernière, nous avons parlé de
conteneurs d'état de type Redux dans SwiftUI . Redux fournit une source unique de valeurs de vérité qui empêche un grand nombre d'erreurs potentielles qui peuvent se produire dans différents états d'application. Cette semaine, nous parlerons de méthodes éprouvées pour créer des applications basées sur Redux qui garderont notre base de code simple et sans erreur.
Normalisation
Dans le concept de Redux, il existe un objet de magasin qui contient l'état de l'application entière et cela sert de source unique de valeurs de vérité pour notre application. Cela nous permet de synchroniser l'interface utilisateur avec l'état de l'application. Mais pour y parvenir, tout d'abord, il est nécessaire de normaliser l'état. Prenons l'exemple de code suivant.
struct AppState { var allTasks: [Task] var favorited: [Task] }
Il existe une structure
AppState qui stocke une liste de tâches simples et sélectionnées. Cela semble simple, mais il a un gros défaut. Supposons qu'il existe un écran d'édition des tâches où vous pouvez modifier la tâche sélectionnée. Chaque fois que l'utilisateur clique sur le bouton Enregistrer, nous devons rechercher puis mettre à jour une tâche spécifique dans la liste de toutes les tâches (toutes les tâches) et dans la liste des tâches
préférées (sélectionnées). Cela peut entraîner des erreurs et des problèmes de performances si la liste des tâches est trop longue.
Améliorons un peu les performances de l'application en normalisant la structure de l'état. Tout d'abord, nous devons stocker nos tâches dans le
dictionnaire , où l'identifiant de la tâche est la clé et la tâche elle-même est la valeur. Un dictionnaire peut obtenir une valeur clé pour un temps constant
(O (1)) , mais en même temps, il ne préserve pas l'ordre. Dans ce cas, vous pouvez créer un tableau avec des identifiants afin de préserver l'ordre. Examinons maintenant l'état modifié après la normalisation.
struct AppState { var tasks: [Int: Task] var allTasks: [Int] var favorited: [Int] }
Comme indiqué dans l'exemple ci-dessus, les tâches sont stockées dans le dictionnaire, où l'identifiant de la tâche est la clé et la tâche elle-même est la valeur. Des tableaux d'identificateurs sont stockés pour toutes les tâches et les tâches sélectionnées. Nous atteignons un état de stabilité qui synchronise l'interface utilisateur et les données.
État de composition
Il est très naturel de stocker l'état de votre application dans une structure unique, mais il peut simplement exploser dès que vous ajoutez de plus en plus de champs à la structure d'état. Nous pouvons utiliser l'
état de composition pour résoudre ce problème. Regardons un exemple.
struct AppState { var calendar: CalendarState var trends: TrendsState var settings: SettingState }
Dans l'exemple de code ci-dessus, nous divisons notre état en trois parties distinctes et les combinons en un AppState.
Réducteur de composition
Un autre composant important d'un conteneur d'état de type Redux est le
réducteur lui-même. Il peut être extrait et combiné, comme ce fut le cas avec la structure étatique. Cela nous permettra de respecter le principe de responsabilité unique et de maintenir des objets tels que des réducteurs de petites tailles.
enum AppAction { case calendar(action: CalendarAction) case trends(action: TrendsAction) } let trendsReducer: Reducer<TrendsState, TrendsAction> = Reducer { state, action in
Conclusion
Aujourd'hui, nous avons parlé de deux stratégies importantes que nous devrions utiliser lors du développement d'applications utilisant des conteneurs d'état de type Redux dans SwiftUI. La normalisation et l'intégration rendent l'application créée plus simple et plus compréhensible. J'espère que cet article vous plaira.
Merci d'avoir lu et à la semaine prochaine!