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, բիզնես-լոգիկա և ներկայացման լոգիկայի միջև:
  • Թեստավորելիություն: Հեշտ է թեստավորել յուրաքանչյուր բաղադրիչ առանձին, օգտագործելով mock կախվածություններ:
  • Կարգապահություն: Փոփոխությունները մեկ բաղադրիչում քիչ ազդեցություն ունեն մյուսների վրա:

Օրինակ՝ VIP մոդուլի ֆայլային կառուցվածքը (UserScene)-ի համար՝

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Խնդրանքների, պատասխանների, 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
}