Sobes.tech
Middle+

Ismeri a VIP ciklusos architektúrát?

sobes.tech MI

Válasz az MI-től

VIP (View, Interactor, Presenter) - ez egy architektúrális mintázat, amely a Clean Architecture egy változata, és iOS fejlesztésben alkalmazzák a felelősségek szétválasztására és a kód tesztelhetőségének javítására. Egyirányú adatfolyamra épül a komponensek között.

VIP komponensek:

  • View: Megjeleníti az adatokat és küldi a felhasználói műveleteket (user actions) az Interactornek. A View (UIView, UIViewController vagy egyszerű protokoll) nem tartalmaz üzleti logikát.
  • Interactor: Tartalmazza az üzleti logikát. Fogadja a View-től a műveleteket, végrehajtja a szükséges műveleteket (pl. adatok elérése, számítások végrehajtása), és küldi az eredményt a Presenternak. Nem függ a UI-tól.
  • Presenter: Fogadja az adatokat az Interaktortól, formázza azokat megjelenítésre, és küldi a View-nak. Nem tartalmaz üzleti logikát, csak az adatok megjelenítéséért felelős.

Interakciós ciklus:

  1. A felhasználó műveletet hajt végre a View-ban.
  2. A View "kérést" (request - struct/enum) küld az Interactor-nek.
  3. Az Interactor feldolgozza a kérést, végrehajtja az üzleti logikát, és küldi a "választ" (response - struct/enum) a Presenter-nek.
  4. A Presenter megkapja a választ, formázza az adatokat "ViewModel"-re (struct/enum), és elküldi a View-nak.
  5. A View megkapja a ViewModel-t, és frissíti a UI-t.

Kiegészítő komponensek (opcionális):

  • Router: Kezeli a navigációt a VIP modulok (jelenetek) között. Általában az Interactor vagy a Presenter hívja.
  • Worker: Az Interactor egyik komponense, amely felelős konkrét feladatok végrehajtásáért (pl. hálózati kérések, Core Data kezelése).

VIP fő előnyei:

  • Felelősségek szétválasztása: Világos szétválasztás a UI, az üzleti logika és a megjelenítési logika között.
  • Tesztelhetőség: Könnyű tesztelni minden komponenst külön, mock függőségek használatával.
  • Karbantarthatóság: Egy komponens változtatásai kevésbé befolyásolják a többit.

Példa a VIP modul mappastruktúrájára (UserScene):

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Kérés, Válasz, ViewModel struktúrák
├── UserProtocols.swift // Protokollok a komponensek közötti kommunikációhoz

Példa a felhasználói adatok betöltésének folyamatára:

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

// A UserInteractor-ben
func fetchUserData(request: UserModels.FetchUser.Request) {
    // ... üzleti logika az adatok betöltéséhez ...
    let response = UserModels.FetchUser.Response(userData: fetchedData)
    presenter?.presentUserData(response: response)
}

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

// A UserViewController-ben (a UserDisplayLogic protokoll megvalósítása)
func displayUserData(viewModel: UserModels.FetchUser.ViewModel) {
    nameLabel.text = viewModel.displayName
    emailLabel.text = viewModel.displayEmail
}