Sobes.tech
Middle+

Оё архитектураи бо давраи VIP-ро медонед?

sobes.tech AI

Ҷавоб аз AI

VIP (View, Interactor, Presenter) - иншоои меъморӣ мебошад, ки варианти Clean Architecture-ро ифода мекунад, ва дар таҳияи iOS барои ҷудо кардани масъулиятҳо ва беҳтар кардани тестпазирии коди истифода мешавад. Ин асос дар ҷараёни якнақшаи маълумот байни компонентҳо мебошад.

Компонентҳои VIP:

  • View: Маълумотҳоро намоиш медиҳад ва амалҳои корбар (user actions) ба Interactor мефиристад. View (UIView, UIViewController ё танҳо протокол) бизнес-логика надорад.
  • Interactor: Бизнес-логика дорад. Аз View амалҳоро мегирад, амалҳои заруриро иҷро мекунад (масалан, дастрасӣ ба маълумот, ҳисобҳо) ва натиҷаро ба Presenter мефиристад. Аз UI мустақил аст.
  • Presenter: Маълумотҳоро аз Interactor мегирад, онҳоро барои намоиш формат мекунад ва ба View мефиристад. Бизнес-логика надорад, танҳо барои намоиши маълумот масъул аст.

Рамзи муошират:

  1. Корбар амалро дар View анҷом медиҳад.
  2. View "хост" (request - struct/enum) ба Interactor мефиристад.
  3. Interactor хостро коркард мекунад, бизнес-логика иҷро мекунад ва "ҷавоб" (response - struct/enum) ба Presenter мефиристад.
  4. Presenter ҷавобро мегирад, маълумотҳоро ба "ViewModel" (struct/enum) формат мекунад ва ба View мефиристад.
  5. View ViewModel-ро мегирад ва UI-ро навсозӣ мекунад.

Компонентҳои иловагӣ (ихтиёрӣ):

  • Router: Навигатсияро байни VIP-модулҳо (сценарияҳо) идора мекунад. Одатан аз Interactor ё Presenter даъват мешавад.
  • Worker: Компоненти Interactor, ки масъул барои иҷрои вазифаҳои мушаххас аст (масалан, дархостҳои шабакавӣ, кор бо Core Data).

Афзалиятҳои асосии VIP:

  • Ҷудо кардани масъулиятҳо: Ҷудоии равшан байни UI, бизнес-логика ва логикаи намоиш.
  • Тестпазирӣ: Ҳар компонентро осонтар тест кардан мумкин аст, бо истифода аз мок-зависҳо.
  • Дастгирӣ: Тағйирот дар як компонент ба дигарон камтар таъсир мерасонад.

Масалан, структураи папкаҳо барои модул VIP (UserScene):

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Структураҳо барои Request, Response, ViewModel
├── UserProtocols.swift // Протоколҳо барои муошират байни компонентҳо

Масалан, муошират (боргирӣ аз маълумоти корбар):

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

// Дар UserInteractor
func fetchUserData(request: UserModels.FetchUser.Request) {
    // ... бизнес-логикаи боргирӣ аз маълумот ...
    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)
func displayUserData(viewModel: UserModels.FetchUser.ViewModel) {
    nameLabel.text = viewModel.displayName
    emailLabel.text = viewModel.displayEmail
}