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

Автор оригинала: Majid Jabrayilov
  • Перевод
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. Как нормализация, так и объединение делают создаваемое приложение более простым и понятным. Я надеюсь, вам понравится эта статья.

Спасибо за прочтение и до встречи на следующей неделе!
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 0

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое