Чӣ тавр бояд меъмории мувофиқи iOS-ро интихоб кард (Қисми 2)

MVC, MVP, MVVM, VIPER ё VIP

Шумо метавонед бо қисми якуми ин ҷо машварат кунед.

Муҳимтарин меъмориҳои iOS

Шарҳи мухтасар.

MVC

Қабатҳои MVC инҳоянд:

M: мантиқи тиҷорӣ, қабати шабакавӣ ва қабати дастрасӣ ба маълумот

V: сатҳи UI (объектҳои UIKit, тахтачаҳо, Xibs)

C: Миёнаравӣ байни модел ва намудро ҳамоҳанг мекунад.

Барои фаҳмидани MVC, мо бояд заминаро, ки дар он сохта шудааст, фаҳмем. MVC дар айёми қадимии рушди веб ихтироъ шуда буд, вақте ки Views мақом надошт. Дар замонҳои қадим, браузер ҳар вақте ки ба мо тағироти визуалӣ дар вебсайт лозим шавад, ҳамаи HTML-ҳоро дубора барқарор мекунад. Дар он замон, ҳеҷ фикри он буд, ки ҳолати нигоҳдорӣ нигоҳ дошта мешавад ва наҷот дода мешавад.

Масалан, баъзе таҳиягароне буданд, ки аз ҳамон файлҳои HTML, PHP ва дастрасии пойгоҳи додаҳо истифода мекарданд. Ҳамин тавр, ангезаи асосии MVC ҷудо кардани сатҳи назар аз сатҳи модел буд. Ин имконпазирии сатҳи моделро зиёд кард. Гуфта мешавад, ки дар MVC намуд ва қабатҳои моделӣ набояд дар бораи якдигар донанд. Барои ин имконпазир як қабати мобайнӣ бо номи контроллер ихтироъ карда шуд. Ин SRP буд, ки татбиқ карда шуд.

Намунаи сикли MVC:

  1. Амали корбар / як рӯйдоди корбар дар сатҳи намоиш (масалан, "амали навсозӣ") ба амал омада, ин амал ба нозир расонида мешавад
  2. Назоратчие, ки маълумотро ба сатҳи модел мефиристад
  3. Маълумоти баргаштаро ба контроллер модел кунед
  4. Нозир мегӯяд, ки намуди он мақоми худро бо маълумоти нав навсозӣ мекунад
  5. Навсозии ҳолати онро бинед

Apple MVC

Дар iOS, Назорати View бо UIKit ва намуди давраи ҳаёт пайваст карда шудааст, бинобар ин MVC холис нест. Аммо, дар таърифи MVC чизе гуфтан мумкин нест, ки нозир наметавонад намуд ё намунаи татбиқи мушаххасро донад. Ҳадафи асосии он ҷудо кардани масъулияти сатҳи модел аз сатҳи назар аст, то ки мо онҳоро дубора истифода барем ва сатҳи моделро дар алоҳидагӣ санҷем.

ViewController намудро дар бар мегирад ва соҳиби модел мебошад. Масъала дар он аст, ки мо ҳам ба рамзи контролер ва ҳам ба коди View ба ViewController менависем.

MVC аксар вақт боиси он мегардад, ки мушкилоти Massive View Controller номида мешавад, аммо он танҳо дар замимаҳои дорои мушкилоти кофӣ рух медиҳад ва тиҷорати ҷиддӣ мешавад.

Якчанд усулҳое мавҷуданд, ки таҳиягар метавонад барои равшантар кардани назоратчии намуд истифода барад. Баъзе мисолҳо:

  • Мантиқи VC-ро барои синфҳои дигар, ба монанди манбаи маълумотҳои усулҳои намоиши ҷадвал ва ваколатдиҳии файлҳои дигарро бо истифода аз намунаи тарроҳии намояндагӣ бардоред.
  • Тақсимоти аниқтари масъулияти композитсияро эҷод кунед (масалан, тақсим кардани VC ба идоракунии намуди кӯдакон).
  • Намунаи тарроҳии координаторро барои бартараф кардани масъулият барои татбиқи мантиқи навигатсия дар нозири виртуалӣ истифода баред
  • Синфи парпечи DataPresenter -ро истифода баред, ки мантиқро дар бар гирад ва модели маълумотро ба натиҷаи додаҳо табдил диҳад, ки маълумоти ба корбари охир пешниҳодшударо ифода мекунад.

MVC нисбат ба MVP

Тавре ки шумо диаграммаи MVP-ро мебинед, MVC хеле монанд аст

MVC як қадам ба пеш буд, аммо он ҳанӯз ҳам бо набудани ё хомӯшӣ дар бораи баъзе чизҳо аломат дошт.

Дар ин миён, шабакаи ҷаҳонии Интернет рушд кард ва дар ҷомеаи таҳиягарон бисёр чизҳо рушд карданд. Масалан, барномасозон ба истифодаи Ajax шурӯъ карданд ва ба ҷои тамоми сафҳаи HTML якбора танҳо қисмҳои саҳифаҳоро бор мекунанд.

Дар MVC, ба андешаи ман, ишорае вуҷуд надорад, ки нозир бояд татбиқи мушаххаси View (набудани) -ро надонад.

HTML як қисми қабати дидан буд ва бисёр ҳолатҳо ин аблаҳона буданд. Дар баъзе ҳолатҳо, он танҳо рӯйдодҳоро аз корбар қабул мекунад ва мундариҷаи визуалии GUI-ро намоиш медиҳад.

Азбаски қисмҳои веб-саҳифаҳо ба қисмҳо бор карда шуда буданд, ин сегментатсия боиси нигоҳ доштани ҳолати назар ва зарурати бештар барои ҷудо кардани масъулият барои мантиқи пешниҳодот гардид.

Мантиқи муаррифӣ мантиқест, ки чӣ гуна намоиш додани интерфейси корбар ва тарзи муомилаи унсурҳои интерфейси корбарро бо якдигар назорат мекунад. Мисол ин мантиқи идоракунии он аст, ки нишондиҳандаи боркунӣ кай ба намоиш / аниматсия оғоз мекунад ва кай он бояд намоиш / аниматсияро қатъ кунад.

Дар MVP ва MVVM, қабати дидан бояд ба дараҷае ҷаззоб бошад, ки мантиқ ва зеҳнӣ надошта бошад ва дар iOS нозири намуди он бояд қисми қабати намуд бошад. Далели он будани Намоиши маънои онро дорад, ки ҳатто мантиқи презентатсионӣ берун аз ҳавопаймои View мемонад.

Яке аз мушкилоти MVC дар он аст, ки мантиқи презентатсия ба куҷо равона нест. Ӯ дар ин бора танҳо хомӯш аст. Оё мантиқи муаррифӣ дар ҳавопаймои назар ё дар ҳавопаймои моделӣ бошад?

Агар нақши модел танҳо пешниҳоди "маълумоти хом" бошад, ин маънои онро дорад, ки рамзи назар чунин аст:

Мисоли зеринро дида мебароем: Мо корбаре дорем бо ному насаб. Ба назари мо, мо бояд номи корбарро ҳамчун "Насаб, ном" нишон диҳем (масалан, "Флорес, Тиаго").

Агар нақши модел аз пешниҳоди "маълумоти хом" иборат бошад, ин маънои онро дорад, ки рамзи назар чунин аст:

бигзор firstName = userModel.getFirstName () бигзор lastName = userModel.getLastName () nameLabel.text = Фамилия + “,“ + Ном

Ин маънои онро дорад, ки масъулияти View барои идораи мантиқи интерфейси корбар мебошад. Аммо, ин санҷиши мантиқи интерфейси корбарро ғайриимкон мекунад.

Равиши дигар он аст, ки намуна танҳо маълумотеро нишон диҳад, ки мантиқи тиҷориро аз тамошо пинҳон мекунад. Аммо пас мо моделҳое дорем, ки ҳам мантиқи тиҷорӣ ва ҳам мантиқи интерфейси корбарро идора мекунанд. Ин як шахси санҷидашаванда мебуд, аммо пас модел ба таври ғайримустақим вобаста аст.

бигзор name = userModel.getDisplayName () nameLabel.text = ном

Ин барои MVP равшан аст ва мантиқи пешниҳод дар сатҳи муаррифӣ боқӣ мемонад. Ин имконпазирии сатҳи презентатсияро меафзояд. Ҳоло қабати намуна ва презентентро бе ягон мушкилот санҷидан мумкин аст.

Одатан, дар татбиқи MVP назар пушти интерфейс / протокол пинҳон карда мешавад ва дар презентатсия набояд ба UIKit ишора карда шавад.

Чизи дигаре, ки бояд қайд кард, вобастагии гузаранда аст.

Агар контролер қабати тиҷорӣ ҳамчун вобастагӣ дошта бошад ва қабати бизнес қабати дастрасӣ ба маълумотро ҳамчун вобастагӣ дошта бошад, контролер вобастагии транзитивӣ барои қабати дастрасӣ ба додаҳоро дорад. Азбаски татбиқи MVP одатан шартнома (протокол) байни ҳама сатҳҳоро истифода мебаранд, вобастагии гузаранда вуҷуд надорад.

Қабатҳои гуногун низ бо сабабҳои гуногун ва бо суръати гуногун тағир меёбанд. Пас, агар шумо як сатҳро иваз кунед, ин набояд дар сатҳи дигар таъсири / мушкилоти дуюмдараҷа ба вуҷуд орад.

Протоколҳо нисбат ба дарсҳо устувортаранд. Сабтҳо ягон тафсилоти татбиқро дар бар намегиранд ва бо шартномаҳо алоқаманд нестанд. Аз ин рӯ, тафсилоти татбиқи як сатҳро бидуни таъсир ба сатҳҳои дигар иваз кардан мумкин аст.

Шартномаҳо (протоколҳо) ҷудошавии байни қабатҳоро ба вуҷуд меоранд.

MVP против MVVM

Диаграммаи MVVM

Яке аз фарқиятҳои асосии MVP ва MVVM дар он аст, ки дар MVP презентатсия бо назар интерфейс мекунад ва дар MVVM назар ба тағиротҳо ва рӯйдодҳо нигаронида шудааст.

Дар MVP мо робитаи дастӣ байни презентатсия месозем ва бо истифода аз интерфейсҳо / протоколҳо дидан мекунем. Дар MVVM мо ба таври автоматикӣ бо RxSwift, KVO ё механизм бо генерикҳо ва пӯшишҳо ҳатмӣ мекунем.

Дар MVVM мо ҳатто ба шартнома (масалан, Java интерфейси / протоколи iOS) байни ViewModel ва View ниёз надорем, зеро мо одатан тавассути намунаи тарроҳии Observer Pattern муошират мекунем.

MVP намунаи ваколатдорро истифода мебарад, зеро қабати презентат фармонҳоро ба қабати намуд вогузор мекунад. Аз ин рӯ, ба ӯ лозим аст, ки чизе дар бораи он бидонад, ҳатто агар он танҳо имзои интерфейс / протокол бошад. Дар бораи фарқияти байни вакилони Маркази Огоҳӣ ва TableView фикр кунед. Маркази огоҳинома барои сохтани канали алоқа ба ягон интерфейс ниёз надорад. Аммо, TableView Delegates протоколеро истифода мебарад, ки синфҳо бояд онро иҷро кунанд.

Дар бораи мантиқи пешниҳоди нишондиҳандаи барқ ​​фикр кунед. Дар MVP муаррифӣ ViewProtocol.showLoadingIndicator -ро кор мекунад. Дар MVVM, метавонад дар ViewModel як амволи isLoading бошад. Қабати намоиш барои шинохтани вақте ки ин хосият тағир меёбад ва навсозӣ мешавад, ҳатмии додаҳои автоматиро истифода мебарад.MVP назар ба MVVM ҷолибтар аст, зеро муаррифӣ фармон медиҳад.

MVVM нисбат ба фармоишҳои мустақим бештар дар бораи тағир додани маълумот аст ва мо тағиротро барои дидани навсозиҳо пайванд медиҳем. Вақте ки мо RxSwift ва парадигмаи барномасозии реактивии функсионалиро дар якҷоягӣ бо MVVM истифода мебарем, мо рамзро ҳатто камтар ҷолиб ва декларативӣ кардем.

Санҷиши MVVM нисбат ба MVP осонтар аст, зеро MVVM намунаи тарроҳии Observer -ро истифода мебарад, ки маълумотро байни ҷузъҳо ба тариқи ҷудошуда интиқол медиҳад. Ҳамин тавр, мо метавонем танҳо бо тағир додани маълумот бо роҳи муқоисаи ду объект санҷиш гузаронем, на тамасхур кардани усули даъват барои санҷиши робитаи байни назар ва пешниҳодкунанда.

PS: Ман ба ашёе, ки онро хеле афзоиш дод, баъзе навсозӣ кардам. Бинобар ин онро ба се қисм тақсим кардан лозим омад. Шумо метавонед қисми сеюмро дар ин ҷо хонед.

Қисми дуюм дар ин ҷо ба анҷом мерасад. Ҳама фикру мулоҳизаҳо қабул карда мешаванд. Қисми сеюм дар бораи VIPER, VIP, барномасозии реактивӣ, хариду фурӯш, маҳдудият ва ҳисси контекстӣ мебошад.

Ташаккур барои хондан! Агар ин мақола ба шумо писанд омада бошад, лутфан чапак занед то дигарон низ онро бихонанд :)