Kuinka hyödyntää JavaScriptin oletusparametreja riippuvuusinjektioon

Nykyään on melko yleistä käyttää riippuvuusinjektiota, jonka avulla projektin moduulit voidaan kytkeä löysästi. Mutta kun hankkeet kasvavat monimutkaisina, meillä on hallitseva riippuvuussuhteiden määrä tähtitieteellisesti.

Tämän ongelman kiertämiseksi käännymme usein riippuvuussäiliöihin. Mutta onko se välttämätöntä jokaisessa tilanteessa?

Tässä viestissä kerron kuinka JavaScriptin oletusparametrit voivat auttaa meitä tässä kysymyksessä. Tätä varten toteutamme yksinkertaisen sovelluksen Node.JS. Sillä on toiminnot luoda ja lukea käyttäjien tietoja kolmella eri tavalla:

  1. Ilman riippuvuusinjektiota
  2. Riippuvuusinjektiolla
  3. Riippuvuusinjektiolla ja oletusparametreilla

Projektin rakenne

Järjestelemme esimerkkiprojektimme ominaisuuksien mukaan (muuten - älä rakenna tiedostojasi roolien ympärille). Joten rakenne on jotain tällaista:

├── käyttäjät /
│ ├── users-repository.js
│ ├── käyttäjät.js
│ ├── käyttäjät.spec.js
│ ├── index.js
├── app.js

Huomaa: Tätä esimerkkiä varten tallennamme käyttäjien tiedot muistiin.

Ilman riippuvuusinjektiota

Edellistä koodia analysoimalla varmistetaan, että olemme rajoitettu lauseella: const usersRepo = vaatii ('./ users-repository') käyttäjissä. Käyttäjämoduuli, tällä lähestymistavalla, on vahvasti kytketty käyttäjien arkistoon.

Tämä rajoittaa meidät käyttämään toisen arkiston toteutusta muuttamatta vaatimuslauseketta. Kun vaatimusta käytetään, luodaan staattinen riippuvuus tarvittavasta moduulista. Sen avulla emme voi käyttää sovellusmallissa toista arkistoa lukuun ottamatta käyttäjien arkisto-moduulin määrittelemää arkistoa.

Tämän lisäksi olemme sitoutuneet myös käyttäjien tietosuojakoodiin yllä mainitun staattisen riippuvuuden vuoksi. Nämä yksikkötestit on tarkoitettu vain käyttäjän moduulin testaamiseen eikä mitään muuta. Kuvittele, olisiko arkisto kytketty ulkoiseen tietokantaan. Meidän pitäisi olla vuorovaikutuksessa tietokannan kanssa, jotta voimme testata.

Riippuvuusinjektiolla

Riippuvuusinjektiolla käyttäjämoduulia ei enää liitetä käyttäjien säilytysmoduuliin.

Suurin ero edelliseen lähestymistapaan on, että nyt meillä ei ole staattista riippuvuutta käyttäjien moduulissa (meillä ei ole lausetta: const usersRepo = vaatii ('./ users-repository')). Sen sijaan käyttäjämoduuli vie tehdasfunktion parametrilla arkistoon. Tämä antaa meille mahdollisuuden siirtää kaikki arkistot korkeammalle moduulille.

Vaihtoehto tehdastoiminnolle on lisätä parametri arkiston argumentille toiminnoissa, jotka luodaan ja luetaan. Mutta jos nämä kaksi toimintoa ovat riippuvaisia ​​samasta arkistosta, voimme kapseloida ne toiminnolla ja hyödyntää JavaScriptin sulkemisia.

Nyt sovellusmoduulissa meillä on vapaus määritellä mitä säilytyspaikkaa haluamme käyttää. Katso myös yksikkötestejä. Nyt voimme testata käyttäjämoduulin huolehtimatta arkistosta. Pilkkaa vain!

Olkaamme kuitenkin rehellisiä - kuinka usein määrittelemme riippuvuudet, jotka muuttuvat koko sovelluksen elinkaaren ajan? Yleensä yritämme välttää staattisia riippuvuuksia, koska se vaikeuttaa testaamista. Mutta nyt, koska haluamme testattavuuden, meidän on siirrettävä arkiston ilmentymä käyttäjien moduulille joka kerta, kun haluamme käyttää sitä.

Tiedätkö mikä olisi todella mahtavaa? Jos pystyisimme käyttämään moduulia joutumatta antamaan sille arkistoa joka kerta. Voimme tehdä tämän JavaScriptillä oletusparametreilla.

Riippuvuusinjektiolla ja oletusparametreilla

Tämän strategian avulla, edellisessä lähestymistavassa nähtyjen riippuvuusinjektioiden lisäksi, käyttäjämoduulin viemissä tehdastoiminnossa määritelty parametri on nyt oletusparametri: usersRepo = defaultUsersRepo.

Oletusparametrilla, jos emme lähetä argumenttia, funktio käyttää oletusparametrin arvoa. Muussa tapauksessa argumentin arvoa käytetään. Tämä on sama kuin edellisessä lähestymistavassa määritellyn riippuvuusinjektiotekniikan käyttäminen.

Nyt meillä on jälleen staattinen riippuvuus käyttäjien moduulissa. Tämä staattinen riippuvuus määrittelee kuitenkin oletusparametrissa käytetyn arvon vain, jos mitään argumenttia ei siirretä tehdastoimintoon.

Tällä lähestymistavalla meillä ei ole velvollisuutta siirtää arkistoa sovellusmoduulissa käyttäjän moduulia vaadittaessa. Voimme silti tehdä sen. Voimme myös tarkistaa, että yksikkötesteillä voidaan jatkaa mock-arkiston käyttöä, koska pystymme välittämään sen oletusparametrin arvon sijasta.

johtopäätös

Oletusparametrit ovat yksinkertainen JavaScript-ominaisuus, mutta tehokas. Niiden avulla voimme toteuttaa parempia ratkaisuja.

Voit vapaasti kysyä minulta mitään.

Lisää resursseja

GitHub-arkisto ja esimerkit: täällä.

Mattias Petter Johanssonilla on loistava riippuvuusinjektion video:

Jos pidit tästä artikkelista, anna minulle joitain claps, jotta useammat ihmiset näkevät sen. Kiitos!