VIPER — архитектурный паттерн для iOS-разработки
VIPER — это модульная и масштабируемая архитектура, которая разделяет приложение на 5 компонентов с четкими обязанностями. Она особенно популярна в крупных iOS-проектах, где важны тестируемость и поддержка кода.
🔥 Компоненты VIPER
Компонент | Роль | Пример в Swift |
---|---|---|
View | Отображает данные и передает действия пользователя Presenter. | UIViewController , SwiftUI View |
Interactor | Содержит бизнес-логику (работа с API, БД, вычисления). | UserInteractor |
Presenter | Получает данные от Interactor и форматирует их для View. | UserPresenter |
Entity | Модели данных (обычно структуры или классы). | struct User { let id: Int } |
Router | Навигация между модулями (переходы между экранами). | UserRouter |
⚡ Как работает VIPER?
- View сообщает Presenter о действии пользователя (например, нажатие кнопки).
- Presenter запрашивает данные у Interactor.
- Interactor обращается к API/БД и возвращает Entity.
- Presenter преобразует Entity в готовые для отображения данные и передает их View.
- Router открывает новый экран, если нужно.
🛠 Пример VIPER в Swift
1. Entity
struct User {
let id: Int
let name: String
}
2. Interactor
protocol UserInteractorProtocol {
func fetchUsers() -> [User]
}
class UserInteractor: UserInteractorProtocol {
func fetchUsers() -> [User] {
// Здесь может быть запрос к API или БД
return [User(id: 1, name: "Alice"), User(id: 2, name: "Bob")]
}
}
3. Presenter
protocol UserPresenterProtocol {
func viewDidLoad()
}
class UserPresenter: UserPresenterProtocol {
weak var view: UserViewProtocol?
private let interactor: UserInteractorProtocol
private let router: UserRouterProtocol
init(interactor: UserInteractorProtocol, router: UserRouterProtocol) {
self.interactor = interactor
self.router = router
}
func viewDidLoad() {
let users = interactor.fetchUsers()
view?.showUsers(users)
}
}
4. View
protocol UserViewProtocol: AnyObject {
func showUsers(_ users: [User])
}
class UserViewController: UIViewController, UserViewProtocol {
var presenter: UserPresenterProtocol!
override func viewDidLoad() {
super.viewDidLoad()
presenter.viewDidLoad()
}
func showUsers(_ users: [User]) {
// Обновляем UI (например, таблицу)
}
}
5. Router
protocol UserRouterProtocol {
func openUserDetails(for user: User)
}
class UserRouter: UserRouterProtocol {
weak var view: UIViewController?
func openUserDetails(for user: User) {
let detailsVC = UserDetailsViewController()
view?.navigationController?.pushViewController(detailsVC, animated: true)
}
}
🌟 Преимущества VIPER
✅ Четкое разделение ответственности (каждый компонент делает одно).
✅ Высокая тестируемость (можно тестировать Interactor, Presenter без UI).
✅ Масштабируемость — подходит для крупных проектов с командой разработчиков.
📉 Недостатки VIPER
❌ Сложность для маленьких проектов (слишком много boilerplate-кода).
❌ Долгая настройка (нужно создавать много файлов).
❌ Сложность навигации (Router может стать «божественным объектом»).
🆚 VIPER vs. MVVM
Критерий | VIPER | MVVM |
---|---|---|
Сложность | Высокая (5 компонентов) | Средняя (3 компонента) |
Тестируемость | Максимальная | Высокая |
Использование | Крупные iOS-проекты | Средние/малые проекты |
Когда выбирать VIPER?
- В командной разработке (например, банковские приложения).
- Если критична тестируемость и поддержка.
Когда выбирать MVVM?
- Для быстрой разработки (стартапы, MVP).
- Если используется SwiftUI (лучше сочетается с MVVM).
🚀 Советы по VIPER
✔ Используйте протоколы для всех компонентов (так легче тестировать).
✔ Выносите общую логику в базовые классы (например, BaseRouter
).
✔ Для навигации можно использовать Coordinators вместо Router.
🔥 Вывод
VIPER — это архитектура для сложных iOS-приложений, которая:
✅ Делает код чистым и тестируемым.
✅ Упрощает работу в команде.
✅ Позволяет легко заменять компоненты.
Альтернативы:
- MVVM (для SwiftUI и простых проектов).
- Clean Swift (VIP) — упрощенная версия VIPER.