Sobes.tech
Middle+

Poznáte architektúru s VIP cyklom?

sobes.tech AI

Odpoveď od AI

VIP (View, Interactor, Presenter) - je architektonický vzor, ktorý predstavuje variantu Clean Architecture, používanú v iOS vývoji na oddelenie zodpovedností a zlepšenie testovateľnosti kódu. Základom je jednosmerný tok dát medzi komponentami.

Komponenty VIP:

  • View: Zobrazuje údaje a odosiela akcie používateľa (user actions) Interaktoru. View (UIView, UIViewController alebo jednoducho protokol) neobsahuje biznis logiku.
  • Interactor: Obsahuje biznis logiku. Prijíma akcie od View, vykonáva potrebné operácie (napríklad prístup k dátam, výpočty) a odosiela výsledok Presenterovi. Nezávisí od UI.
  • Presenter: Prijíma údaje od Interaktoru, formátuje ich na zobrazenie a odosiela View. Neobsahuje biznis logiku, je zodpovedný iba za prezentáciu údajov.

Cyklus interakcie:

  1. Používateľ vykoná akciu vo View.
  2. View odošle "žiadost" (request - struct/enum) Interaktoru.
  3. Interactor spracuje žiadosť, vykoná biznis logiku a odošle "odpoveď" (response - struct/enum) Presenterovi.
  4. Presenter prijme odpoveď, formátuje údaje do "ViewModel" (struct/enum) a odošle ich View.
  5. View prijme ViewModel a aktualizuje UI.

Doplnkové komponenty (voliteľné):

  • Router: Riadi navigáciu medzi VIP modulmi (scénami). Zvyčajne je volaný od Interaktora alebo Presentera.
  • Worker: Komponent Interaktora, zodpovedný za vykonanie konkrétnych úloh (napríklad sieťové požiadavky, práca s Core Data).

Hlavné výhody VIP:

  • Rozdelenie zodpovedností: Jasné rozdelenie medzi UI, biznis logikou a logikou prezentácie.
  • Testovateľnosť: Jednoduché testovanie každého komponentu zvlášť, s použitím mock závislostí.
  • Údržba: Zmeny v jednom komponente majú menší vplyv na ostatné.

Príklad štruktúry priečinkov pre VIP modul (UserScene):

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Štruktúry pre Request, Response, ViewModel
├── UserProtocols.swift // Protokoly pre komunikáciu medzi komponentami

Príklad interakcie (načítanie údajov používateľa):

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

// V UserInteractor
func fetchUserData(request: UserModels.FetchUser.Request) {
    // ... biznis logika načítania údajov ...
    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 (implementácia protokolu UserDisplayLogic)
func displayUserData(viewModel: UserModels.FetchUser.ViewModel) {
    nameLabel.text = viewModel.displayName
    emailLabel.text = viewModel.displayEmail
}