Pro lidi je obtížné vidět celkový obraz problému, aniž by mu věnovali mnoho času a úsilí. To se stává zejména při práci s rozsáhlými a složitými aplikacemi. Jaké jsou vedlejší účinky mých změn? Proč tento řádek zde ovlivňuje testy vzdálené části kódové základny? Dokonalé nebo úplné řešení neexistuje, ale Shopify přišlo s nástrojem, který vám a vašemu týmu pravděpodobně pomůže.
Úvod
Aby bylo možné mluvit o Packwerk, musíme si nejprve představit několik pojmů.
- Soudržnost: označuje míru toho, jak moc k sobě prvky modulu nebo třídy patří.
- Spojka: označuje úroveň závislosti mezi moduly nebo třídami.
- Hranice: se týká bariér mezi kód. V tomto případě se hranice kódu vztahuje k různým oblastem zájmu v rámci stejné kódové základny.
- Modularizace: proces rozdělení softwarového systému na více samostatných modulů, kde každý modul pracuje nezávisle.
Problémy
Jak víme, Ruby neposkytuje dobré řešení pro vynucení hranic kódu. Můžeme určit viditelnost, ale všechny závislosti budou načteny do globálního jmenného prostoru. Ve velkých nebo monolitických aplikacích způsobuje tato absence hranic následující problémy.
- Nízká soudržnost,
- Vysoký spoj,
- Špagetový kód.
Ve snaze modulovat monolit společnosti Shopify a prosadit hranice vyzkoušeli různá řešení, aniž by dosáhli očekávaných výsledků:
- Nastavení soukromých konstant,
- Stanovení hranic pomocí drahokamů,
- Použití testů k prevenci asociací mezi jednotlivými složkami,
- Použití modulačního drahokamu Ruby,
- Vytváření mikroslužby.
S využitím všech znalostí z předchozích pokusů se rozhodli vytvořit vlastní nástroj: Packwerk.
Packwerk
Co je Packwerk?
Packwerk je nástroj statické analýzy, který slouží k vynucení hranic mezi skupinami dat. Ruby soubory s názvem balíčky.
Co je to balíček?
A balíček je složka obsahující automaticky spouštěný kód. Shopify tým vyzývá k používání osvědčených postupů při vytváření balíčků.
- Měli bychom společně balit věci, které mají vysokou funkčnost soudržnost,
- Balíčky by měly být mezi sebou relativně volně provázány.
Typy hraničních kontrol
Můžeme vynucovat hranice soukromí a závislostí, kontrolovat jejich porušení a cyklické závislosti.
Packwerk do praxe
Neexistuje jediný konkrétní způsob, jak při vytváření balíčků strukturovat nebo změnit strukturu aplikace. V tomto článku se budeme řídit přístupem, který navrhuje
Stephan Hagemann v Postupná modularizace pro Ruby on Rails.
Výběr projektu
Můžete vytvořit nový projekt nebo si vyberte jeden ze svých projektů. Rozhodl jsem se použít open-source projekt s názvem CodeTriage. Je důležité zmínit, že potřebujeme Rails 6 aplikace od Packwerk používá Zeitwerk.
Inicializace systému Packwerk
Nejdříve musíme přidat gem do našeho souboru Gemfile, jako například gem 'packwerk' a pak spusťte svazekv konzole. Pak jsme připraveni inicializovat klenot, který běží packwerk init.
Poté si všimneme, že Packwerk vygeneroval tři soubory pro nás:
-
packwerk.yml
-
package.yml
-
inflections.yml
packwerk.yml je konfigurační soubor Packwerk kde mimo jiné definujeme zahrnuté a vyloučené soubory, uvedeme cesty pro načítání a definujeme skloňovací soubor;
package.yml je konfigurační soubor balíčku. V tomto souboru přidáme konfiguraci pro hranice našeho balíčku. Jakákoli složka se souborem package.yml bude rozpoznána jako balíček pomocí nástroje Packwerk. To je vše, Packwerk vytvořil náš první
a nazýváme jej root balíček.
inflections.yml je místo, kam umístíme naše vlastní skloňování a zkratky, pokud je budeme používat.
Více informací o souborech a jejich konfiguraci najdete v části
Packwerk.
Vlastnosti Packwerk
Aby modularizace fungovala, potřebujeme tři základní vlastnosti: pojmenovaný kontejner, jeho obsaha výslovně závislosti na jiných kontejnery. Definujme tedy tyto vlastnosti v Packwerk:
-
Název: Název balíčku je jeho relativní cesta od kořene adresáře.
aplikace.
-
Obsah: Když umístíme soubor package.yml do složky, všechny soubory v této složce jsou nyní obsahem balíčku.
-
Závislosti: Můžeme definovat závislosti na jiných balíčcích přidáním klíče závislostí do pole package.yml.
Dalším souborem, který není ve výchozím nastavení zahrnut, ale doporučuje se, je README. Je důležité, aby poskytoval informace o použití balíčku.
Konec epizody I

Přečtěte si více
GraphQL Ruby. Jak je to s výkonem?
Kolejnice a další dopravní prostředky
Vývoj Rails pomocí TMUX, Vim, Fzf + Ripgrep