Узорак дизајна спремишта у Свифту

Чист начин да испитате своје моделе

Који проблем решава?

Ако требате поново испитивати моделе објеката са различитих локација у коду, спремиште може бити од велике помоћи да вам обезбеди јединствену тачку за рад са вашим моделима и уклоните дупликат кода упита. Можете га узети још више и користити га са протоколима, на тај начин можете лако искључити имплементације (на пример за јединице тестова) или можете их користити са генериком да направите више * друм ролл * генеричку апстракцију. У овом чланку ћу покрити све ове случајеве.

Скицирање сцене.

Рецимо да имате неки код који дохваћа податке из АПИ-ја и мапира их за моделирање објеката. У овом примеру ћу преузети листу чланака са сервера.

Ово може изгледати помало функи, али то је само РкСвифт, који користи Моиа као слој апстракције умрежавања, али то заправо и није важно да бисте схватили шта се догађа. Начин на који ћете дохватити податке потпуно овиси о вама.

Овај део кода јесте

  1. ГЕТ захтев за сервер
  2. Мапе враћеног ЈСОН-а у низ предмета из чланка
  3. Затварање се зове када се заврши сав посао.

Зашто нам треба складиште?

У овом тренутку немамо. Ако АПИ зовете само једном у целокупној бази кода, додавање спремишта може бити претежно (или као што неки могу рећи претерано инжењеринг).

Ок ... али када је објекат спремишта погодан за употребу?
Рецимо да ваша база кода почиње да расте и морате писати код да бисте дохваћали чланке изнова и изнова. Могли бисте рећи „копирајмо код и залепите га где год требате да преузмете све чланке.“

Ништа није учињено, нико није умро. Јел тако?

У том тренутку би вам у мозгу требао почети трептати велики црвени аларм.

Поздрав спремишту.

Репозиториј је само објекат који обједињује сав код да би ваше моделе питао на једном месту, тако да имате унос са једном тачком ако желите нпр. набавите све чланке.

Креирајмо објекат спремишта који пружа јавни АПИ за добивање чланака.

Сада можемо да назовемо ову методу и не морамо да бринемо о томе шта се дешава иза сцене да бисмо добили стварне чланке.
Само позовите методу и добићете чланке. Лепо, зар не?
Али чекај, има још!

Бавите се свим интеракцијама чланака

Складиште можемо користити да бисмо додали више метода за интеракцију са нашим објектом модела. Већина пута желите да радите ЦРУД (креирате, читате, ажурирате, бришете) операције на вашем моделу. Па, само додајте логику за ове операције у спремишту.

Ово чини пријатним АПИ-јем који се користи у вашем коду, а да не морате понављати исти код поново и поново.

У пракси би употреба спремишта изгледала овако.

Прилично лепо и читљиво, зар не? Али, сачекајте да буде још боље.

Појачање: протоколи

У претходном коду увек сам користио пример „добијања података из АПИ-ја“. Али шта ако требате да додате подршку за учитавање података из локалне ЈСОН датотеке, а не из мрежног извора.

Па ако креирате протокол у коме су наведена имена метода, можете да креирате имплементацију за интернетски АПИ и ону за извођење података ван мреже.

Ово би могло овако изгледати.

Протокол каже само: "Ако ме сагласно морате имати потписе ових метода, али мене није брига за стварну имплементацију!"

Тако да је то сјајно, можете да створите ВебАртицлеРепоситори и ЛоцалАртицлеРепоситори. Обе ће имати све методе које су наведене у протоколу, али можете написати две потпуно различите имплементације.

Укључивање: Испитивање јединице

Употреба протокола је такође веома згодна када желите да тестирате свој код, јер једноставно можете да креирате други објекат који имплементира протокол складишта, али уместо тога враћа податке изругивања.

Ако ово користите заједно са убризгавањем зависности, заиста је лако тестирати одређени објект.

Пример

Рецимо да имате модел приказа, а модел прегледа своје податке добија путем складишта.

Ако желите да тестирате модел приказа, заглавили сте чланке који ће бити преузети са интернета.
То заправо није оно што желимо. Желимо да наш тест буде што више детерминистички настројен. У овом случају се чланци преузети с интернета могу временом мењати, не може постојати интернетска веза у време покретања тестова, сервер би могао бити у прекиду, ... све су то могући сценарији у којима наши тестови неће успети, јер су ван наше контроле. А кад тестирамо, желимо / морамо имати контролу.

Срећом то је заиста једноставно решити.

Поздрав, убризгавање зависности

Потребно је само да поставите својство АртицлеРепо путем иницијализатора. Подразумевани случај ће бити онај који желите за свој производни код и када напишете тест јединице, можете заменити спремиште са својом верзијом.

Али можда размишљате, шта је са типовима? ВебАртицлеРепоситори није МоцкАртицлеРепоситори, па се преводилац неће жалити? Па, не ако протокол користите као тип. На овај начин обавјештавамо преводилац, допуштамо све онолико колико је у складу са протоколом АртицлеРепоситори (што раде и Веб и МоцкАртицлеРепоситори).

Коначни код би изгледао овако.

А у тесту јединице можете је заменити овако.

Сада имате потпуну контролу над подацима које враћа ваше спремиште.

Супер повер-уп: генерички

То бисте могли још даље, користећи генеричке. Ако размислите, већина спремишта увек има исте операције

  1. набавите све ствари
  2. набавите неке ствари
  3. убаци неке ствари
  4. избрисати ствар
  5. ажурирати ствар

Па, једино што је другачије је реч "ствар", тако да би ово могао бити одличан кандидат за употребу протокола са генеричким подацима. Можда звучи компликовано, али у ствари то је прилично једноставно учинити.

Прво ћемо протокол преименовати у Репозиториј да бисмо га учинили ... генеричким .
Тада ћемо уклонити све чланке и замијенити их магијом Т. Али слово Т је само замјена за ... све што желимо да буде. Само морамо означити Т као повезану врсту протокола.

Дакле, овај протокол сада можемо користити за сваки модел модела који имамо.

1. Репозиториј чланака

Компајлер ће закључити врсту Т у Артицле, јер смо применом метода одредили шта је Т. У овом случају предмет чланка.

2. Корисничко спремиште

То је то.

Надам се да вам се чланак свидио и ако имате било каквих питања или примедби, само их поставите у наставку или ми се обратите на Твиттеру и нека разговарају.