Ihmisten on vaikea nähdä ongelman kokonaiskuvaa ilman, että he käyttävät paljon aikaa ja vaivaa. Näin tapahtuu erityisesti silloin, kun työskennellään suurten ja monimutkaisten sovellusten parissa. Mitkä ovat muutosteni sivuvaikutukset? Miksi tämä rivi tässä vaikuttaa koodipohjan kaukaisen osan testeihin? Täydellistä tai täydellistä ratkaisua ei ole olemassa, mutta Shopify julkaisi työkalun, joka todennäköisesti auttaa sinua ja tiimiäsi.
Johdanto
Puhuakseni Packwerk, meidän on ensin esiteltävä muutama käsite.
- Koheesio: viittaa siihen, kuinka paljon moduulin tai luokan elementit kuuluvat yhteen.
- Kytkentä: viittaa moduulien tai luokkien välisen riippuvuuden tasoon.
- Rajat: viittaa esteisiin koodi. Tässä tapauksessa koodirajalla tarkoitetaan saman koodipohjan eri osa-alueita.
- Modularisointi: Prosessi, jossa ohjelmistojärjestelmä jaetaan useisiin erillisiin moduuleihin, joista kukin toimii itsenäisesti.
Ongelmat
Kuten tiedämme, Ruby ei tarjoa hyvää ratkaisua koodirajojen valvomiseksi. Voimme määrittää näkyvyyden, mutta kaikki riippuvuudet ladataan globaaliin nimiavaruuteen. Suurissa tai monoliittisissa sovelluksissa tämä rajojen puuttuminen aiheuttaa seuraavia ongelmia.
- Vähäinen yhteenkuuluvuus,
- Korkea kytkentä,
- Spagettikoodi.
Yrittäessään modulaarisoida Shopifyn monoliittia ja asettaa rajoja, he kokeilivat erilaisia ratkaisuja saavuttamatta odotettuja tuloksia:
- Yksityisten vakioiden asettaminen,
- Rajojen asettaminen jalokivien avulla,
- Testien avulla estetään komponenttien väliset yhteydet,
- Rubyn modulaatio-jalokiven käyttäminen,
- Mikropalvelujen luominen.
Aikaisemmista yrityksistä saadun tiedon avulla he päättivät luoda oman työkalun: Packwerk.
Packwerk
Mikä on Packwerk?
Packwerk on staattinen analyysityökalu, jota käytetään rajaamaan ryhmien välisiä Ruby tiedostot nimeltä paketit.
Mikä on paketti?
A paketti on kansio, joka sisältää automaattisesti ladattua koodia. Shopifyn joukkue kannustaa käyttämään parhaita suunnittelukäytäntöjä paketteja luodessaan.
- Meidän pitäisi pakata yhteen asioita, joilla on korkea toiminnallinen koheesio,
- Pakettien tulisi olla suhteellisen löyhästi kytkettyjä toisiinsa.
Rajatarkastusten tyypit
Voimme valvoa yksityisyyden suojaa ja riippuvuusrajoja, tarkistaa rajojen rikkomista ja syklisiä riippuvuuksia.
Packwerk käytännössä
Paketteja luotaessa ei ole olemassa yhtä tiettyä tapaa jäsentää tai uudelleen jäsentää sovellusta. Tässä artikkelissa noudatamme lähestymistapaa, jota ehdottaa
Stephan Hagemann vuonna Asteittainen modulaarisointi Ruby on Rails:lle.
Valitse projekti
Voit luoda uuden projekti tai valitse jokin hankkeistasi. Päätin käyttää avoimen lähdekoodin projektia nimeltä CodeTriage. On tärkeää mainita, että tarvitsemme Rails 6 -sovelluksen, koska Packwerk käyttää Zeitwerkia.
Packwerkin alustaminen
Ensin meidän on lisättävä helmi Gemfileen seuraavasti jalokivi 'packwerk'
ja aja sitten niputtaa
konsolissa. Sitten olemme valmiita alustamaan helmi käynnissä packwerk init
.
Tämän jälkeen huomaamme, että Packwerk tuotti meille kolme tiedostoa:
-
packwerk.yml
-
package.yml
-
taivutukset.yml
packwerk.yml on konfigurointitiedosto Packwerk jossa määritetään mukaan otetut ja pois jätetyt tiedostot, luetellaan latauspolut, määritellään taivutustiedosto ja muita asioita;
package.yml on paketin asetustiedosto. Tässä tiedostossa lisäämme pakettimme rajoja koskevat asetukset. Mikä tahansa kansio, jossa on package.yml, tunnistetaan paketiksi seuraavasti Packwerk. Siinä kaikki, Packwerk loi ensimmäisen
paketti ja kutsumme sitä root paketti.
taivutukset.yml on paikka, johon sijoitamme mukautetut taivutukset ja lyhenteet, jos käytämme niitä.
Lisätietoa tiedostoista ja niiden konfiguraatiosta on osoitteessa
Packwerk.
Packwerk ominaisuudet
Jotta modularisointi toimisi, tarvitsemme kolme perusominaisuutta: nimetty säiliö, sen sisältöja nimenomaisesti riippuvuudet muista säiliöt. Määritellään siis nämä ominaisuudet Packwerk:
-
Nimi: Paketin nimi on sen suhteellinen polku paketin juuresta.
sovellus.
-
Sisältö: Kun asetamme package.yml-tiedoston kansioon, kaikki kansiossa olevat tiedostot ovat nyt paketin sisältöä.
-
Riippuvuudet: Voimme määritellä riippuvuudet muista paketeista lisäämällä riippuvuusavaimen tiedostoon package.yml.
Toinen tiedosto, jota ei sisällytetä oletusarvoisesti, mutta jota suositellaan, on README. Siinä on tärkeää antaa tietoa paketin käytöstä.
Jakson I loppu
Lue lisää
GraphQL Ruby. Entä suorituskyky?
Kiskot ja muut liikennevälineet
Rails-kehitys TMUX, Vim, Fzf + Ripgrep -ohjelmilla