Principes de conception des bibliothèques Go : des dépôts aux ressources
La programmation consiste à créer des applications et les bibliothèques qui les soutiennent. Une bibliothèque est un ensemble de ressources partageables, principalement du code source. Distinguer les termes aide à concevoir des composants robustes.
Un dépôt contient des fichiers de code dans une structure de système de fichiers. Un package en Go est un groupe de fichiers .go qui exécutent une tâche unique, avec une déclaration package obligatoire en haut de chaque fichier. Un module regroupe des packages ensemble, avec des dépendances fixées dans go.mod.
Une bibliothèque permet le partage de code sans duplication. Par exemple : une fonction MaxInt copiée dans différents packages foo et baz est inefficace sans une source unique de vérité. Les packages résolvent le problème de compilation et d'importation.
package foo
func MaxInt(a, b int) int {
if a > b {
return a
}
return b
}
L'isolation des composants empêche la connaissance d'autres codes, et la décomposition simplifie l'interaction avec le compilateur.
Ressources dans les bibliothèques
Les bibliothèques incluent non seulement du code mais aussi des ressources externes : dynamiques et statiques.
Ressources dynamiques dépendent de l'exécution. Un exemple est l'accès GPU via CUDA dans le package cu de Gorgonia :
d := cu.CurrentDevice()
ctx := cu.NewContext(d, cu.SchedAuto|cu.MapHost)
mem, err := ctx.MemAlloc(1024)
Ici, ctx est un descripteur GPU pour les tâches GPGPU. Son état est inconnu à la compilation.
Ressources statiques sont connues du compilateur. Un exemple est les textes de Shakespeare dans le package willshakes :
package willshakes
const AllsWellThatEndsWell = `Acte 1 Scène 1
COMTESSE.
En délivrant mon fils de moi, j'enterre un second mari.
...`
const MacBeth = `Acte 1 Scène 1
PREMIÈRE SORCIÈRE.
Quand nous trois nous retrouverons-nous
...`
Accès via : willshakes.MacBeth. De même pour les polices ou jeux de données comme MNIST.
Classification des bibliothèques
Les bibliothèques sont classées par leurs ressources :
- Bibliothèques de code : Code source partagé dans des packages/modules.
- Bibliothèques de pilotes : Enveloppes sur des pilotes (cu pour CUDA, go-gl pour OpenGL).
- Bibliothèques de ressources : Données statiques (willshakes) ou chargeurs (mnist en Go).
| Type | Exemple | Caractéristique |
|------|---------|----------------|
| Code | Package utilitaire | Code statique |
| Pilote | cu | Accès dynamique |
| Ressource | willshakes | Constantes intégrées |
Les pilotes ajoutent des abstractions pour l'interaction interlangage.
Qualités d'une bonne bibliothèque
Une bonne bibliothèque facilite deux dialogues : avec la machine (compilateur/exécution) et avec le développeur.
Critères :
- Isolation : Les composants ignorent les bibliothèques externes.
- Décomposition : Limites fonctionnelles claires.
- Composition : Intégration facile dans les applications.
- Prévisibilité : Le comportement correspond à la documentation.
- Performance : Surcharge minimale sans compromis.
Évitez package main dans les bibliothèques—concentrez-vous sur les utilitaires. Testez les cas limites, assurez la sécurité des threads.
Points clés à retenir
- Une bibliothèque est une ressource partageable, pas seulement un dépôt ou un package.
- Séparez les ressources statiques (constantes) et dynamiques (pilotes).
- Assurez l'isolation pour que les développeurs se concentrent sur une seule tâche.
- Utilisez les packages Go pour la compilation et les modules pour les dépendances.
- Conçuez pour la composition : importation et utilisation faciles.
— Editorial Team
Aucun commentaire pour le moment.