Что такое Presentation Layer (слой представления) в архитектуре приложения?

«Что такое Presentation Layer (слой представления) в архитектуре приложения?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 должен быть «глупым» и тонким, его задача — быть мостом между пользователем и бизнес-логикой приложения.