Zasady projektowania bibliotek w Go: od repozytoriów do zasobów
Programowanie obejmuje tworzenie aplikacji i bibliotek do ich wsparcia. Biblioteka to zbiór zasobów do współdzielenia, głównie kodu źródłowego. Rozróżnienie terminów pomaga projektować trwałe komponenty.
Repozytorium zawiera pliki z kodem w strukturze plików. Pakiet w Go to grupa plików .go, wykonujących jedno zadanie, z obowiązkową deklaracją package na początku każdego pliku. Moduł łączy pakiety, zależności są ustalane w go.mod.
Biblioteka zapewnia podział kodu bez duplikacji. Przykład: funkcja MaxInt jest kopiowana do różnych pakietów foo i baz, ale bez jednego źródła prawdy jest to nieefektywne. Pakiety rozwiązują problem kompilacji i importu.
package foo
func MaxInt(a, b int) int {
if a > b {
return a
}
return b
}
Izolacja komponentów zapobiega wiedzy o cudzym kodzie, dekompozycja upraszcza interakcję z kompilatorem.
Zasoby w bibliotekach
Biblioteki obejmują nie tylko kod, ale także zewnętrzne zasoby: dynamiczne i statyczne.
Zasoby dynamiczne zależą od czasu wykonania. Przykład — dostęp do GPU przez CUDA w pakiecie cu z Gorgonia:
d := cu.CurrentDevice()
ctx := cu.NewContext(d, cu.SchedAuto|cu.MapHost)
mem, err := ctx.MemAlloc(1024)
Tutaj ctx to deskryptor GPU dla zadań GPGPU. Stan jest nieznany na etapie kompilacji.
Zasoby statyczne są znane kompilatorowi. Przykład — teksty Szekspira w pakiecie willshakes:
package willshakes
const AllsWellThatEndsWell = `Akt 1 Scena 1
HRABINA.
Oddając syna, grzebię drugiego męża.
...`
const MacBeth = `Akt 1 Scena 1
PIERWSZA WIEDŹMA.
Kiedy znów się spotkamy we trzy
...`
Dostęp: willshakes.MacBeth. Podobnie czcionki lub zbiory danych jak MNIST.
Klasyfikacja bibliotek
Biblioteki dzielą się na klasy według zasobów:
- Biblioteki kodu: współdzielony kod źródłowy w pakietach/modułach.
- Biblioteki sterowników: nakładki na sterowniki (cu dla CUDA, go-gl dla OpenGL).
- Biblioteki zasobów: dane statyczne (willshakes) lub ładowarki (mnist w Go).
| Typ | Przykład | Charakterystyka |
|-----|--------|----------------|
| Kodowa | Pakiet z narzędziami | Kod statyczny |
| Sterownikowa | cu | Dostęp dynamiczny |
| Zasobowa | willshakes | Wbudowane stałe |
Sterowniki dodają abstrakcje dla interakcji międzyjęzykowej.
Cechy dobrej biblioteki
Dobra biblioteka ułatwia dwa dialogi: z maszyną (kompilator/czas wykonania) i z programistą.
Kryteria:
- Izolacja: komponenty nie znają zewnętrznych bibliotek.
- Dekompozycja: wyraźne granice funkcjonalności.
- Kompozycja: prosta integracja w aplikacjach.
- Przewidywalność: zachowanie zgodne z dokumentacją.
- Wydajność: minimalne obciążenie bez kompromisów.
Unikaj package main w bibliotekach — skup się na narzędziach. Testuj przypadki brzegowe, zapewniaj bezpieczeństwo wątków.
Co jest ważne
- Biblioteka to współdzielony zasób, nie tylko repozytorium lub pakiet.
- Rozdzielaj zasoby statyczne (stałe) i dynamiczne (sterowniki).
- Zapewnij izolację dla skupienia programisty na jednym zadaniu.
- Używaj pakietów Go do kompilacji i modułów do zależności.
- Projektuj pod kątem kompozycji: prostota importu i użycia.
— Editorial Team
Brak komentarzy.