Hoidla kujundusmuster kiirelt

Puhas viis oma mudelite kohta päringute tegemiseks

Mis probleemi see lahendab?

Kui peate ikka ja jälle pärima mudeli objektidest oma koodi erinevatest asukohtadest, võib hoidlast olla tõesti abi ühe mudeli sisestamiseks oma mudelitega töötamiseks ja duplikaatkoodide eemaldamiseks. Võite selle veelgi kaugemale viia ja seda koos protokollidega kasutada, sel viisil saate rakendusi hõlpsalt välja lülitada (näiteks ühiskatsete jaoks) või saate seda geneeriliste ravimitega kasutada, et teha * trummelrulli * üldist abstraktsiooni. Selles artiklis käsitlen kõiki neid juhtumeid.

Stseeni visand.

Oletame, et teil on kood, mis tõmbab andmeid API-st ja kaardistab selle objektide modelleerimiseks. Selle näite jaoks toon serverist artiklite loendi.

See võib tunduda pisut funky, kuid see on lihtsalt RxSwift, kasutades Moya võrgustiku abstraktsioonikihina, kuid see ei oma tegelikult tähtsust toimuva mõistmiseks. See, kuidas oma andmeid hankida, on täiesti teie enda otsustada.

See kooditükk teeb

  1. GET-päring serverile
  2. Kaardib tagastatud JSON artikli objektide massiivi
  3. Sulgemist kutsutakse siis, kui kõik tööd on tehtud.

Miks me vajame hoidlat?

Noh, praegu me seda ei tee. Kui helistate API-le kogu koodi baasis ainult üks kord, võib hoidla lisamine olla liiga suur (või nagu mõned võivad öelda, et üleehitamine).

Ok ... aga millal on hoidlaobjekti mugav kasutada?
Oletame, et teie koodbaas hakkab kasvama ja artiklite ikka ja jälle toomiseks peate koodi kirjutama. Võite öelda: „kopeerige kood ja kleepige see kuhu iganes teil on vaja kõiki artikleid tuua”.

Kahju pole tehtud, keegi ei surnud. Õige?

Sel hetkel peaks teie ajus vilkuma suur punane äratus.

Tere hoidla.

Hoidla on lihtsalt objekt, mis kapseldab kogu koodi, et teie mudelitest päringuid teha ühest kohast, nii et teil on üks sisenemispunkt, kui soovite nt. hangi kõik artiklid.

Loome hoidlaobjekti, mis pakub avalikku API-d artiklite saamiseks.

Nüüd võime seda meetodit nimetada ja tegelike artiklite saamiseks ei pea me muretsema kulisside taga toimuva pärast.
Lihtsalt helistage meetodile ja saate artiklid. Kena, eks?
Kuid oodake, seal on veel!

Käsitlege kõiki artiklite interaktsioone

Saame hoidla abil lisada rohkem meetodeid oma mudelobjektiga suhtlemiseks. Enamasti soovite oma mudelis teha CRUD-i toiminguid (luua, lugeda, värskendada, kustutada). Lisage lihtsalt hoidlas nende toimingute loogika.

See teeb kena API, mida saab kasutada kogu oma koodis, ilma et peaksite sama koodi ikka ja jälle kordama.

Praktikas näeks hoidla kasutamine välja selline.

Üsna kena ja loetav, eks? Kuid oodake, kuni see muutub veelgi paremaks.

Sisselülitamine: protokollid

Eelmises koodis kasutasin alati näidet API-st andmete hankimise kohta. Aga mis siis, kui peate lisama tugiteenuse andmete laadimiseks kohalikust JSON-failist, mitte veebiallikast.

Noh, kui loote meetodi nimesid sisaldava protokolli, saate luua veebi API-le rakenduse ja selle, et saada andmed võrguühenduseta.

See võiks välja näha selline.

Protokollis öeldakse lihtsalt, et "kui te vastate mulle, peate teil olema nende meetodite allkirjad, kuid ma ei hooli tegelikust rakendamisest!"

Nii et tore, saate luua WebArticleRepository ja LocalArticleRepository. Neil mõlemal on kõik protokollis loetletud meetodid, kuid võite kirjutada 2 täiesti erinevat rakendust.

Sisselülitamine: seadme testimine

Protokollide kasutamine on tõesti mugav ka siis, kui soovite oma koodi ühiselt testida, kuna saate lihtsalt luua uue objekti, mis rakendab hoidla protokolli, kuid tagastab selle asemel pilkatud andmed.

Kui kasutate seda koos sõltuvuse süstimisega, on see konkreetse objekti katsetamine tõesti väga lihtne.

Näide

Oletame, et teil on vaatemudel ja vaatemudel hangib selle andmed hoidla kaudu.

Kui soovite proovimudelit katsetada, olete ummikus veebist tõmmatavate artiklite osas.
Tegelikult pole see see, mida me tahame. Soovime, et meie test oleks võimalikult deterministlik. Sel juhul võivad veebist hangitud artiklid aja jooksul muutuda, testide ajal ei saa olla Interneti-ühendust, server võib olla maas,… need on kõik võimalikud stsenaariumid, mille korral meie testid ebaõnnestuvad, kuna need on meie kontrolli alt väljas. Ja kui testime, tahame / peame kontrollima.

Õnneks on selle lahendamine tegelikult väga lihtne.

Tere, sõltuvussüst.

Peate lihtsalt seadistama artikliRepo atribuudi initsialiseerija kaudu. Vaikejuhtum on see, mida soovite oma tootmiskoodi jaoks ja ühikatesti kirjutamisel saate hoidla oma piltide versiooniga välja vahetada.

Aga võib-olla mõtled, aga kuidas oleks tüüpidega? WebArticleRepository ei ole MockArticleRepository, nii et kas koostaja ei kaeba? Noh, mitte siis, kui kasutate protokolli tüübina. Nii anname kompilaatorile teada, lubame kõike, kuni see vastab ArticleRepository protokollile (mida teevad nii veeb kui ka MockArticleRepository).

Lõplik kood näeks välja selline.

Ja oma ühikatses võiksite selle niimoodi välja vahetada.

Nüüd saate täielikult kontrollida, milliseid andmeid teie hoidla tagastab.

Ülivõimsus: geneerilised ravimid

Võite seda geneeriliste ravimite abil veelgi kaugemale viia. Kui järele mõelda, on enamikul hoidlatest alati samad toimingud

  1. saa kõik asjad kätte
  2. saada mõned asjad
  3. sisesta mõned asjad
  4. kustuta asi
  5. värskenda asja

Ainuke asi, mis erineb, on sõna “asi”, nii et see võib olla suurepärane kandidaat geneeriliste ravimite protokolli kasutamiseks. See võib tunduda keeruline, kuid tegelikult on seda üsna lihtne teha.

Esmalt nimetame protokolli ümber hoidlaks, et muuta see üldisemaks .
Ja siis eemaldame kõik artiklitüübid ja asendame need võlukirjaga T. Kuid täht T on lihtsalt asendaja kõigele, mida me soovime. Peame lihtsalt T-protokolli seotud tüübiks märkima.

Nüüd saame seda protokolli kasutada mis tahes mudeliobjekti jaoks.

1. Artiklite hoidla

Kompilaator järeldab T-tüübi artiklist, kuna meetodite rakendamisel oleme täpsustanud, mis on T. Sel juhul on ese ese.

2. Kasutajate hoidla

See selleks.

Loodetavasti teile artikkel meeldis ja kui teil on küsimusi või märkusi, küsige neid altpoolt või pöörduge minu poole Twitteris ja lähme vestlema.