Principy návrhu knihoven v Go: od repozitářů k prostředkům
Programování zahrnuje tvorbu aplikací a knihoven pro jejich podporu. Knihovna je soubor prostředků pro sdílení, převážně zdrojového kódu. Rozlišení pojmů pomáhá navrhovat odolné komponenty.
Repozitář obsahuje soubory s kódem ve struktuře souborového systému. Balíček v Go je skupina .go-souborů, které plní jednu úlohu, s povinným deklarováním package na začátku každého souboru. Modul sdružuje balíčky, závislosti jsou fixovány v go.mod.
Knihovna zajišťuje oddělení kódu bez duplikace. Příklad: funkce MaxInt se kopíruje do různých balíčků foo a baz, ale bez jednotného zdroje pravdy je to neefektivní. Balíčky řeší problém kompilace a importu.
package foo
func MaxInt(a, b int) int {
if a > b {
return a
}
return b
}
Izolace komponent zabraňuje znalostem o cizím kódu, dekompozice zjednodušuje interakci s kompilátorem.
Prostředky v knihovnách
Knihovny zahrnují nejen kód, ale i externí prostředky: dynamické a statické.
Dynamické prostředky závisí na runtime. Příklad — přístup k GPU přes CUDA v balíčku cu z Gorgonia:
d := cu.CurrentDevice()
ctx := cu.NewContext(d, cu.SchedAuto|cu.MapHost)
mem, err := ctx.MemAlloc(1024)
Zde ctx je deskriptor GPU pro úlohy GPGPU. Stav není znám ve fázi kompilace.
Statické prostředky jsou známé kompilátoru. Příklad — texty Shakespeara v balíčku willshakes:
package willshakes
const AllsWellThatEndsWell = `Akt 1 Scéna 1
KOMTESSA.
Když dávám svého syna ode mě, pohřbívám druhého manžela.
...`
const MacBeth = `Akt 1 Scéna 1
PRVNÍ ČARODĚJNICE.
Kdy se zase my tři sejdeme
...`
Přístup: willshakes.MacBeth. Podobně fonty nebo datové sady jako MNIST.
Klasifikace knihoven
Knihovny se dělí do tříd podle prostředků:
- Kódové knihovny: sdílený zdrojový kód v balíčcích/modulech.
- Ovladačové knihovny: obálky nad ovladači (cu pro CUDA, go-gl pro OpenGL).
- Prostředkové knihovny: statická data (willshakes) nebo zavaděče (mnist v Go).
| Typ | Příklad | Charakteristika |
|-----|--------|----------------|
| Kódová | Balíček s utilitami | Statický kód |
| Ovladačová | cu | Dynamický přístup |
| Prostředková | willshakes | Vložené konstanty |
Ovladače přidávají abstrakce pro mezijazykovou interakci.
Vlastnosti dobré knihovny
Dobrá knihovna usnadňuje dva dialogy: se strojem (kompilátor/runtime) a vývojářem.
Kritéria:
- Izolace: komponenty neznají externí knihovny.
- Dekompozice: jasné hranice funkcionality.
- Kompozice: snadná integrace do aplikací.
- Předvídatelnost: chování odpovídá dokumentaci.
- Výkonnost: minimální režie bez kompromisů.
Vyhýbejte se package main v knihovnách — zaměřte se na utility. Testujte hraniční případy, zajišťujte thread-safety.
Co je důležité
- Knihovna je sdílený prostředek, ne jen repozitář nebo balíček.
- Oddělujte statické (konstanty) a dynamické (ovladače) prostředky.
- Zajistěte izolaci pro soustředění vývojáře na jednu úlohu.
- Používejte balíčky Go pro kompilaci a moduly pro závislosti.
- Navrhujte pro kompozici: jednoduchost importu a použití.
— Editorial Team
Zatím žádné komentáře.