Ответ
Presentation Layer (Слой представления) — это верхний слой в архитектуре приложения, отвечающий за всё, что видит и с чем взаимодействует пользователь. Его главная цель — отображать данные и передавать пользовательские действия в бизнес-логику.
Основные обязанности:
- Отображение UI: Визуализация данных, полученных из доменного или бизнес-слоя.
- Обработка ввода: Реакция на действия пользователя (тапы, жесты, ввод текста) и передача их на обработку.
- Навигация: Управление переходами между экранами.
- Валидация UI: Проверка введенных данных на корректность формата.
Чего он НЕ должен делать:
- Содержать бизнес-правила.
- Напрямую обращаться к базе данных или сетевому API.
- Выполнять сложные вычисления.
Пример в паттерне MVVM (iOS):
// View (Presentation Layer - UIKit)
class LoginViewController: UIViewController {
@IBOutlet private weak var loginTextField: UITextField!
@IBOutlet private weak var passwordTextField: UITextField!
private let viewModel = LoginViewModel() // Ссылка на ViewModel
@IBAction private func loginButtonTapped() {
// 1. View передает пользовательский ввод во ViewModel
viewModel.login(email: loginTextField.text,
password: passwordTextField.text)
}
private func bindViewModel() {
// 2. View подписывается на изменения состояния во ViewModel
viewModel.onLoginStateChange = { [weak self] state in
DispatchQueue.main.async {
switch state {
case .loading:
self?.showLoadingIndicator()
case .success:
self?.navigateToHomeScreen()
case .failure(let error):
self?.showErrorAlert(message: error)
}
}
}
}
}
// ViewModel (Также часть Presentation Layer)
class LoginViewModel {
var onLoginStateChange: ((LoginState) -> Void)?
private let authService: AuthService // Зависимость от доменного слоя
func login(email: String?, password: String?) {
onLoginStateChange?(.loading)
// 3. ViewModel делегирует логику авторизации доменному сервису
authService.login(email: email, password: password) { [weak self] result in
switch result {
case .success:
self?.onLoginStateChange?(.success)
case .failure(let error):
self?.onLoginStateChange?(.failure(error.localizedDescription))
}
}
}
}
Итог: Presentation Layer должен быть «глупым» и тонким, его задача — быть мостом между пользователем и бизнес-логикой приложения.