Sobes.tech
Middle+

Znáte architekturu s VIP cyklem?

sobes.tech AI

Odpověď od AI

VIP (View, Interactor, Presenter) - je to architektonický vzor, který představuje variantu Clean Architecture, používanou v iOS vývoji pro oddělení odpovědností a zlepšení testovatelnosti kódu. Základem je jednosměrný tok dat mezi komponentami.

Komponenty VIP:

  • View: Zobrazuje data a odesílá akce uživatele (user actions) Interaktoru. View (UIView, UIViewController nebo prostě protokol) neobsahuje business logiku.
  • Interactor: Obsahuje business logiku. Přijímá akce od View, provádí potřebné operace (například přístup k datům, výpočty) a odesílá výsledek Presenterovi. Nezávisí na UI.
  • Presenter: Přijímá data od Interaktoru, formátuje je pro zobrazení a odesílá View. Neobsahuje business logiku, je zodpovědný pouze za prezentaci dat.

Cyklus interakce:

  1. Uživatel provede akci ve View.
  2. View odešle "požadavek" (request - struct/enum) Interaktoru.
  3. Interactor zpracuje požadavek, provede business logiku a odešle "odpověď" (response - struct/enum) Presenterovi.
  4. Presenter obdrží odpověď, formátuje data do "ViewModel" (struct/enum) a odešle je View.
  5. View obdrží ViewModel a aktualizuje UI.

Další komponenty (volitelné):

  • Router: Řídí navigaci mezi VIP moduly (scény). Obvykle je volán Interaktorem nebo Presenterem.
  • Worker: Komponent Interaktoru, který je zodpovědný za vykonání konkrétních úkolů (například síťové požadavky, práce s Core Data).

Hlavní výhody VIP:

  • Oddělení odpovědností: Jasné rozdělení mezi UI, business logikou a logikou prezentace.
  • Testovatelnost: Snadné testování každé komponenty zvlášť, pomocí mock závislostí.
  • Udržovatelnost: Změny v jednom komponentu mají menší dopad na ostatní.

Příklad struktury složek pro VIP modul (UserScene):

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Struktury pro Request, Response, ViewModel
├── UserProtocols.swift // Protokoly pro komunikaci mezi komponentami

Příklad interakce (načítání uživatelských dat):

// V UserViewController
func viewDidLoad() {
    super.viewDidLoad()
    interactor?.fetchUserData(request: UserModels.FetchUser.Request())
}

// V UserInteractor
func fetchUserData(request: UserModels.FetchUser.Request) {
    // ... business logika načítání dat ...
    let response = UserModels.FetchUser.Response(userData: fetchedData)
    presenter?.presentUserData(response: response)
}

// V UserPresenter
func presentUserData(response: UserModels.FetchUser.Response) {
    let viewModel = UserModels.FetchUser.ViewModel(
        displayName: response.userData.name,
        displayEmail: response.userData.email
    )
    viewController?.displayUserData(viewModel: viewModel)
}

// V UserViewController (implementace protokolu UserDisplayLogic)
func displayUserData(viewModel: UserModels.FetchUser.ViewModel) {
    nameLabel.text = viewModel.displayName
    emailLabel.text = viewModel.displayEmail
}