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-ին: Բիզնես-լոգիկա չունի, միայն պատասխանատու է տվյալների ներկայացման համար:
Ինտերակցիոն ցիկլը՝
- Օգտագործողը կատարում է գործողություն View-ում:
- View-ը ուղարկում է "խնդրանք" (request - struct/enum) Interactor-ին:
- Interactor-ը մշակում է խնդրանքը, իրականացնում բիզնես-լոգիկան և ուղարկում է "պատասխան" (response - struct/enum) Presenter-ին:
- Presenter-ը ստանում է պատասխանը, ձևաչափում է տվյալները "ViewModel" (struct/enum) և ուղարկում է View-ին:
- 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
}