Redux — подобные контейнеры состояния в SwiftUI. Рекомендации

от автора

image

На прошлой неделе мы говорили о Redux – подобных контейнерах состояний в SwiftUI. Redux предоставляет единый источник истинностных значений, который предотвращает огромное количество потенциальных ошибок, которые могут возникнуть в разных состояниях приложения. На этой неделе мы поговорим о проверенных методах создания приложений на основе Redux, которые позволят сохранять нашу кодовую базу простой и без ошибок.

Нормализация состояния

В концепции Redux имеется объект store который содержит состояние всего приложения и это служит единым источником истинностных значений для нашего приложения. Это позволяет нам синхронизировать Пользовательский Интерфейс с состоянием приложения. Но чтобы достичь этого, сначала, необходимо нормализовать state. Рассмотрим ниже приведенный пример кода.

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

Здесь имеется структура AppState, которая хранит список простых и избранных задач. Он выглядит просто, но у него есть один большой недостаток. Предположим, что имеется экран редактирования задачи, где можно изменить выбранную задачу. Всякий раз, когда пользователь нажимает кнопку «Сохранить», нам необходимо найти а затем обновить определенную задачу в списке allTasks (все задачи), и в списке favorited (избранных) задач. Это может привести к ошибкам и проблемам с производительностью, если список задач будет слишком большим.

Давайте немного улучшим характеристики приложения, посредством нормализации структуры состояния. Прежде всего, мы должны хранить наши задачи в Словаре, где идентификатор задачи является ключом, а сама задача является значением. Словарь может получить значение по ключу за постоянное время (O (1)), но при этом, он не сохраняет порядок. В данном случае можно создать массив с идентификаторами, чтобы сохранить порядок. Теперь давайте посмотрим на измененный вариант состояния после нормализации.

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

Как указано в приведенном выше примере, задачи сохраняются в Словаре, где идентификатор задачи id — это ключ, а сама задача — это значение. Массивы идентификаторов сохраняются для всех задач и избранных задач. Мы достигаем устойчивости состояния, которое обеспечивает синхронизацию пользовательского интерфейса и данных.

Композиционный State

Весьма естественно хранить состояние вашего приложения в виде единой структуры, но оно может просто взорваться, как только вы добавите в структуру состояний все больше и больше полей. Мы можем использовать композиционный state, чтобы решить эту проблему. Давайте посмотрим на пример.

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

В вышеприведенном примере кода, мы делим наше состояние на три отдельные части и объединяем их в AppState.

Композиционный Reducer

Другой важный компонент Redux-подобного контейнера состояния — это сам Reducer. Его можно извлекать и объединять, как это было со структурой состояния. Это позволит соблюдать принцип Единой Ответственности и поддерживать объекты типа reducers небольших размеров.

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)     } } 

Заключение

Сегодня мы поговорили о двух важных стратегиях, которые мы должны использовать при разработке приложений с использованием Redux-подобных контейнеров состояний в SwiftUI. Как нормализация, так и объединение делают создаваемое приложение более простым и понятным. Я надеюсь, вам понравится эта статья.

Спасибо за прочтение и до встречи на следующей неделе!


ссылка на оригинал статьи https://habr.com/ru/post/476924/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *