Архитектура VIPER для IOS приложений

Aibek Nogoev
Mad Devs — блог об IT
4 min readJan 3, 2023
Архитектура VIPER для IOS приложений

Какая архитектура лучше всего подходит для разработки приложений для iOS?

При выборе архитектуры для приложения iOS необходимо учитывать множество факторов, включая размер и сложность приложения, тип управляемых данных, целевую аудиторию и цели проекта. Некоторые распространенные архитектуры, используемые при разработке приложений для iOS, включают:

  1. MVC (Model-View-Controller): это классическая архитектура, которая широко используется в разработке для iOS. Она включает в себя разделение приложения на три основных компонента: Model, которая представляет данные и бизнес-логику; View, представляющее пользовательский интерфейс; и Controller, который обеспечивает связь между Model и View.
  2. MVVM (Model-View-ViewModel): эта архитектура похожа на MVC, но в ней представлен дополнительный уровень, называемый ViewModel, который отвечает за подготовку и форматирование данных для отображения в View. Это может помочь уменьшить объем кода в View и упростить его тестирование и поддержку.
  3. VIPER (View, Interactor, Presenter, Entity и Router): эта архитектура спроектирована так, чтобы быть масштабируемой и модульной, при этом каждый компонент служит определенной цели. View представляет пользовательский интерфейс, Interactor управляет бизнес-логикой, Presenter подготавливает данные для представления, Entity представляет модель данных, а Router обрабатывает навигацию.

Так почему же многие разработчики предпочитают VIPER?

Есть несколько причин, по которым некоторые разработчики iOS могут предпочесть использовать архитектуру VIPER при создании приложений:

  1. Разделение задач: VIPER способствует разделению задач, четко определяя обязанности каждого компонента и разделяя пользовательский интерфейс, бизнес-логику и модель данных на отдельные уровни. Это может упростить понимание кодовой базы и внесение изменений в определенные части приложения, не затрагивая другие части.
  2. Улучшенная тестируемость: каждый компонент в архитектуре VIPER можно тестировать изолированно, что упрощает написание модульных тестов и гарантирует, что приложение работает должным образом.
  3. Модульность. Архитектура VIPER разработана как модульная, что означает, что различные части приложения могут разрабатываться и тестироваться независимо друг от друга, а затем интегрироваться вместе. Это может упростить масштабирование приложения и добавление новых функций с течением времени.
  4. Улучшенная ремонтопригодность: четкое разделение обязанностей в архитектуре VIPER может облегчить поддержку кодовой базы с течением времени, поскольку легче понять, как различные части приложения сочетаются друг с другом.

Таким образом, VIPER — это масштабируемый и модульный подход к созданию приложений для iOS, который помогает разделить обязанности и улучшить тестируемость и удобство обслуживания кодовой базы.

Структура Viper модуля

Вот краткий обзор того, как работает архитектура VIPER:

  • View. View — это пользовательский интерфейс приложения, отвечающий за отображение данных и обработку пользовательского ввода.
  • Interactor: interactor управляет бизнес-логикой приложения и взаимодействует с Presenter-ом для получения и форматирования данных для представления.
  • Presenter: Presenter подготавливает данные для отображения в View и обрабатывает взаимодействия из View, при необходимости обновляя модель.
  • Entity: Entity представляет модель данных приложения и отвечает за хранение данных и управление ими.
  • Router: Router обеспечивает навигацию между различными экранами и модулями приложения.

Чтобы реализовать VIPER в приложении для iOS, вам потребуется создать отдельные классы для каждого из этих компонентов и определить их обязанности. Затем вы можете соединить эти классы с помощью протоколов для облегчения связи и потока данных.
Вот пример того, как вы можете настроить модуль VIPER в приложении для iOS:

// View
protocol [MODULE_NAME]ViewInput: class {
func setupInitialState()
}

protocol [MODULE_NAME]ViewOutput {
func viewIsReady()
}

class [MODULE_NAME]ViewController: UIViewController, [MODULE_NAME]ViewInput {
var output: [MODULE_NAME]ViewOutput!
...
}

// Interactor
protocol [MODULE_NAME]InteractorInput {
func performAction()
}

protocol [MODULE_NAME]InteractorOutput: class {
func actionCompleted()
}

class [MODULE_NAME]Interactor: [MODULE_NAME]InteractorInput {
weak var output: [MODULE_NAME]InteractorOutput!
...
}

// Presenter
protocol [MODULE_NAME]ModuleInput {
}

protocol [MODULE_NAME]ModuleOutput: class {
}

class [MODULE_NAME]Presenter {
weak var view: [MODULE_NAME]ViewInput!
var interactor: [MODULE_NAME]InteractorInput!
var router: [MODULE_NAME]RouterInput!
...
}

// Entity
class [MODULE_NAME]Entity {
...
}

// Router
protocol [MODULE_NAME]RouterInput {
func presentDetailScreen()
}

class [MODULE_NAME]Router: [MODULE_NAME]RouterInput {
weak var viewController: UIViewController!
...
}

В этом примере каждый из компонентов VIPER определяется как протокол с соответствующей реализацией класса. View, Interactor и Router подключаются к Presenter-у с помощью слабых свойств, а Presenter подключается к View и Interactor-у с помощью сильных свойств.

Затем вы можете использовать Presenter для связи между View и Interactor-ом, передавая данные и инициируя действия по мере необходимости. Router отвечает за управление навигацией между различными экранами и модулями в приложении.

И так резюмируя:

VIPER призван помочь разработчикам создавать масштабируемые и модульные приложения, которые легче тестировать, поддерживать и расширять с течением времени.

В архитектуре VIPER View представляет пользовательский интерфейс приложения и отвечает за отображение данных и обработку пользовательского ввода. Интерактор управляет бизнес-логикой приложения и взаимодействует с Presenter для извлечения и форматирования данных для View. Presenter подготавливает данные для View для отображения и обрабатывает взаимодействия из View, при необходимости обновляя модель. Entity представляет собой модель данных приложения и отвечает за хранение данных и управление ими. Router обеспечивает навигацию между различными экранами и модулями приложения.

Одним из основных преимуществ использования архитектуры VIPER является то, что она помогает четко определить обязанности каждого компонента и способствует разделению задач. Это может упростить понимание кодовой базы и внесение изменений в определенные части приложения, не затрагивая другие части. Это также может помочь улучшить тестируемость кода, поскольку каждый компонент можно тестировать изолированно.

Однако важно отметить, что VIPER представляет собой более сложную архитектуру, чем некоторые другие подходы, такие как MVC или MVVM. Это требует более предварительного планирования и может привести к увеличению количества классов и файлов в проекте. Таким образом, он может не подходить для всех проектов, и важно тщательно рассмотреть потребности и цели проекта, прежде чем принимать решение об использовании VIPER.

В конечном счете, лучшая архитектура для приложения iOS будет зависеть от конкретных потребностей и целей проекта. Важно тщательно рассмотреть все факторы, влияющие на процесс разработки, и выбрать архитектуру, подходящую для проекта.

--

--