Žmonėms sunku pamatyti bendrą problemos vaizdą, neskiriant tam daug laiko ir pastangų. Taip atsitinka ypač dirbant su didelėmis ir sudėtingomis programomis. Koks yra mano pakeitimų šalutinis poveikis? Kodėl čia esanti eilutė daro įtaką nutolusios kodų bazės dalies testams? Tobulo ar išsamaus sprendimo nėra, tačiau "Shopify" išleido priemonę, kuri tikriausiai padės jums ir jūsų team.
Įvadas
Norint kalbėti apie Packwerk, pirmiausia turime pristatyti keletą sąvokų.
- Sanglauda: reiškia priemonę, rodančią, kiek modulio ar klasės elementai priklauso vieni kitiems.
- Jungtis: reiškia priklausomybės tarp modulių ar klasių lygį.
- Ribos: reiškia kliūtis tarp kodas. Šiuo atveju kodo riba reiškia skirtingas tos pačios kodų bazės problemines sritis.
- Modulavimas: programinės įrangos sistemos padalijimo į kelis atskirus modulius procesas, kai kiekvienas modulis veikia savarankiškai.
Problemos
Kaip žinome, Ruby nepateikia gero sprendimo, kaip užtikrinti kodekso ribų laikymąsi. Galime nurodyti matomumą, tačiau visos priklausomybės bus įkeltos į pasaulinę vardų erdvę. Didelėse arba monolitinėse programose dėl tokio ribų nebuvimo kyla šių problemų.
- Maža sanglauda,
- Aukštas sukabinimo lygis,
- Spagečių kodas.
Bandydami moduliuoti "Shopify" monolitą ir nustatyti ribas, jie išbandė įvairius sprendimus, tačiau nepasiekė laukiamų rezultatų:
- Privačių konstantų nustatymas,
- Ribų nustatymas per brangakmenius,
- Testų naudojimas siekiant išvengti tarpkomponentinių asociacijų,
- Naudojant ‘Ruby" moduliacijos brangakmenį,
- Kūrimas mikroservisai.
Pasinaudoję visomis ankstesnių bandymų žiniomis, jie nusprendė sukurti savo įrankį: Packwerk.
Packwerk
Kas yra "Packwerk"?
Packwerk yra statinės analizės įrankis, naudojamas siekiant nustatyti ribas tarp grupių Ruby failai, vadinami paketai.
Kas yra paketas?
A paketas yra aplankas su automatiškai įkeltu kodu. "Shopify komanda ragina kuriant paketus taikyti geriausią dizaino praktiką.
- Turėtume kartu supakuoti daiktus, kurie yra labai funkcionalūs. sanglauda,
- Paketai turėtų būti palyginti laisvai susieti tarpusavyje.
Ribinių patikrinimų tipai
Galime užtikrinti privatumo ir priklausomybės ribų laikymąsi, tikrinti ribų pažeidimus ir ciklines priklausomybes.
Packwerk į praktiką
Kuriant paketus nėra vieno konkretaus būdo, kaip struktūrizuoti ar pertvarkyti programą. Šiame straipsnyje vadovausimės metodu, kurį pasiūlė
Stephan Hagemann in Laipsniškas "Ruby on" moduliavimas Bėgiai.
Pasirinkite projektą
Galite sukurti naują projektas arba pasirinkite vieną iš savo projektų. Nusprendžiau naudoti atvirojo kodo projektą, vadinamą CodeTriage. Svarbu paminėti, kad mums reikia Rails 6 programos, nes Packwerk naudoja Zeitwerk.
Inicializuoti "Packwerk
Pirma, turime pridėti gem į savo Gemfile kaip brangakmenis 'packwerk' ir paleiskite paketaskonsolėje. Tuomet esame pasirengę inicializuoti brangakmenį packwerk init.
Po to pastebime, kad Packwerk sugeneruoti trys failai mus:
-
packwerk.yml
-
package.yml
-
inflections.yml
packwerk.yml yra konfigūracijos failas Packwerk kuriame, be kita ko, apibrėšime įtrauktus ir neįtrauktus failus, nurodysime įkėlimo kelius, apibrėšime inflekcijų failą;
package.yml yra paketo konfigūracijos failas. Šiame faile pridėsime mūsų paketo ribų konfigūraciją. Bet kuris aplankas su package.yml bus atpažįstamas kaip paketas Packwerk. Štai ir viskas, Packwerk sukūrėme pirmąjį
paketą ir vadiname jį root pakuotė.
inflections.yml čia patalpinsime savo pasirinktinius linksnius ir akronimus, jei juos naudosime.
Daugiau informacijos apie failus ir jų konfigūraciją rasite
Packwerk.
"Packwerk" savybės
Kad moduliavimas veiktų, reikia trijų pagrindinių savybių: įvardytas konteineris, jos turinys, ir aiškiai priklausomybės dėl kitų konteineriai. Taigi apibrėžkime šias savybes Packwerk:
-
Pavadinimas: Paketo pavadinimas yra jo santykinis kelias nuo šaknies
taikymas.
-
Turinys: Įdėjus package.yml į aplanką, visi aplanke esantys failai tampa paketo turiniu.
-
Priklausomybės: Galime apibrėžti priklausomybes nuo kitų paketų, pridėdami priklausomybių raktą į package.yml.
Kitas failas, kuris pagal nutylėjimą neįtrauktas, bet rekomenduojamas, yra README. Jame svarbu pateikti informaciją apie paketo naudojimą.
I epizodo pabaiga

Skaityti daugiau
"GraphQL Ruby". O kaip dėl našumo?
Bėgiai ir kitos transporto priemonės
"Rails" kūrimas naudojant TMUX, "Vim", Fzf + Ripgrep