Sobes.tech
Middle+

Kas teate VIP-tsükliga arhitektuuri?

sobes.tech AI

Vastus AI-lt

VIP (View, Interactor, Presenter) on arhitektuurimuster, mis esindab puhast arhitektuuri varianti, mida kasutatakse iOS arenduses vastutuse jaotamiseks ning koodi testitavuse parandamiseks. Põhimõtteks on ühe suuna andmevoog komponentide vahel.

VIP komponendid:

  • View: Kuvab andmeid ja saadab kasutaja tegevused (user actions) interaktorile. View (UIView, UIViewController või lihtsalt protokoll) ei sisalda äriloogikat.
  • Interactor: Sisaldab äriloogikat. Saab tegevusi View-lt, teostab vajalikud toimingud (näiteks andmetele ligipääs, arvutused) ning saadab tulemuse esitlejale. Ei sõltu UI-st.
  • Presenter: Saab andmed interaktorilt, vormindab need kuvamiseks ning saadab View-le. Ei sisalda äriloogikat, vastutab ainult andmete esitamise eest.

Koostöö tsükkel:

  1. Kasutaja teeb tegevuse View-s.
  2. View saadab "päringu" (request - struct/enum) interaktorile.
  3. Interaktor töötleb päringu, teostab äriloogika ning saadab "vastuse" (response - struct/enum) esitlejale.
  4. Esitleja saab vastuse, vormindab andmed "ViewModel" (struct/enum) ning saadab selle View-le.
  5. View saab ViewModeli ning uuendab kasutajaliidest.

Täiendavad komponendid (valikuline):

  • Router: Halda navigatsiooni VIP-modulite (stseenide) vahel. Tavaliselt kutsutakse esile interaktori või esitleja poolt.
  • Worker: Interaktori komponent, mis vastutab konkreetsete ülesannete (näiteks võrgupäringud, töö Core Data-ga) täitmise eest.

VIP peamised eelised:

  • Vastutuse jaotus: Selge jaotus UI, äriloogika ning esitlusloogika vahel.
  • Testitavus: Iga komponent on lihtne eraldi testida, kasutades mock-objekte.
  • Hooldatavus: Muudatused ühes komponendis mõjutavad teisi vähem.

Näide VIP mooduli kaustastruktuurist (UserScene):

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Päringute, vastuste ja ViewModel struktuurid
├── UserProtocols.swift // Protokollid komponentide vahelise suhtluse jaoks

Näide kasutusest (kasutaja andmete laadimine):

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

// UserInteractor
func fetchUserData(request: UserModels.FetchUser.Request) {
    // ... äriloogika andmete laadimiseks ...
    let response = UserModels.FetchUser.Response(userData: fetchedData)
    presenter?.presentUserData(response: response)
}

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

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