Изучим основы архитектуры Clean Swift за короткое время.
*Перевод статьи Kamyar Elyasi - iOS Developer
Помните те дни, когда мы, iOS разработчики, проводили часы и дни, изучая MVVM? Теперь я верю, что когда-нибудь, рано или поздно, мы повсюду будем искать возможности изучать и осваивать Clean Architecture. Так почему бы нам не начать сегодня?
В этой статье я расскажу вам, что такое Clean Architecture, таким образом, чтобы вы могли быстро узнать о ней много нового.
Так что…
Немного о Clean Swift Architecture
Clean Swift (сокращенно VIP) - это чистая архитектура дяди Боба, адаптированная для проектов iOS и macOS. Архитектура VIP для написания чистого Swift кода была представлена Рэймондом Лоу. Как вы, наверное, знаете, VIP расшифровывается как View—Interactor—Presenter.
Структура проекта в этой архитектуре строится вокруг scenes (сцен). Scene должна иметь следующие компоненты:
- View Controller
- Interactor
- Presenter
- Worker
- Models
- Router
- Configurator(опционально)
Другими словами, у нас будет набор компонентов для каждой scene, которые будут работать для нашего контроллера.
Жизненный цикл VIP
- View controller принимает пользовательское событие, создает объект запроса и отправляет его в interactor.
- Interactor выполняет некоторую работу с запросом, используя worker, создает объект ответа и отправляет его в presenter.
- Presenter форматирует данные в ответе, создает объект view model и отправляет его в view controller.
- View controller отображает пользователю результаты, содержащиеся в view model.
Теперь давайте рассмотрим каждый компонент глубже:
View Controller
Взаимодействует с Interactor и получает ответ обратно от Presenter.
- Содержит views;
- Хранит экземпляры Interactor и Router;
- Передает действия из Views в Interactor (бизнес-логика) и принимает действия Presenter в качестве входных данных.
Interactor
Посредник между Worker и Presenter.
- Содержит бизнес-логику у Scene.
- Сохраняет ссылку на Presenter.
- Запускает действия у Workers на основе входных данных (от View Controller), запускает и передает результат к Presenter.
- Interactor никогда не должен импортировать UIKit (import UIKit).
- Interactor также содержит два типа протоколов, таких как Router:
1. Протокол бизнес-логики (Business Logic Protocol) - объявляет все методы Interactor-а в этом протоколе, чтобы они могли быть доступны для использования во ViewController.
2. Протокол хранения данных (Data Store Protocol) — здесь объявлены все свойства, которые должны сохранять свое текущее состояние. Этот протокол в основном используется в Router для передачи данных между контроллерами.
Presenter
Обрабатывает данные и формирует результат от Interactor-а во ViewModel и передает его обратно во ViewController.
- Сохраняет weak ссылку на ViewController, который являет output-ом presenter-а.
- После того, как Interactor выдает некоторые результаты, он передает ответ Presenter-у. Затем Presenter преобразует ответ в view models, удобный для отображения, а затем передает view models обратно во ViewController для отображения пользователю.
Worker(s)
Обрабатывает все запросы и ответы API/Database.
- Абстракция, которая обрабатывает различные скрытые операции, такие как извлечение пользователя из Core Data, загрузка фотографии профиля, разрешение пользователям ставить лайки и подписываться и т.д.
- Должен следовать принципу единой ответственности (Single Responsibility) (в состав Interactor-а может могут входить различные Worker(s) с разными обязанностями).
Models
Храните все модели данных.
- Несвязанные абстракции данных.
- Содержит модели Request, Response и ViewModel.
- Request иногда может быть пустой структурой (например, когда у нас нет никаких post-параметров или запросов к БД).
- Каждая модель данных предназначена для создания и использования в определенном компоненте:
Request: Создается во ViewController и используется в Interactor.
Response: Создан в Interactor и используется в Presenter.
ViewModel: Создается в Presenter и используется во ViewController.
Router
Заботится о переходе и передаче данных между ViewController-ми.
- Извлекает логику навигации из ViewController.
- Сохраняет weak ссылку на ViewController.
- Объявляет два протокола:
1. Протокол логики навигации (Routing Logic Protocol) — все методы, используемые для навигации, хранятся в соответствии с этим протоколом.
2. Протокол передачи данных (Data Passing Protocol) — протокол, содержащий данные, которые необходимо передать назначенному контроллеру.(кусок кода)
Configurator
Принимает необработанный ViewController и возвращает настроенный ViewController.
- Дополнительный компонент, который берет на себя ответственность за настройку цикла VIP, инкапсулируя создание всех экземпляров и назначая их там, где это необходимо.
Если вы читали примеры кода в этой статье, вы, возможно, заметили, что у нас есть еще один объект под названием “SceneFactory”.
SceneFactory - это не что иное, как класс, который хранит экземпляры конфигураторов сцен (scene configurators) создает сцены с их использованием.
И наконец, для файловой структуры вашего проекта вы можете следовать приведенной ниже схеме:
Это были основы Clean Swift Architecture.