Enregistrement de packages dans Go sans créer de dépendances circulaires
Problème
Considérons un package central fournissant des interfaces dont dépendent plusieurs autres packages. Chaque package dépendant propose plusieurs implémentations de ces interfaces. L'objectif est d'informer le package central de ces implémentations pour permettre l'instanciation client, mais l'importation de packages dépendants dans le package central crée une dépendance circulaire.
Solution
La bibliothèque standard Go propose deux approches pour résoudre ce problème :
1. Sans registre « central »
- Définissez les interfaces dans le package central et encapsulez les implémentations dans des packages séparés.
- Instanciez explicitement les implémentations souhaitées, en spécifiant le nom du package.
- Exemple : le package crypto définit l'interface de hachage, tandis que des implémentations concrètes se trouvent dans des packages distincts comme crypto/md5 et crypto/sha256.
2. Avec un registre « central »
- Les implémentations s'enregistrent elles-mêmes dans le package central, généralement via les fonctions init() du package.
- Exemple : le package image définit l'interface Image et plusieurs formats d'image implémentations dans des packages comme image/gif et image/jpeg.
Solution alternative (proposée) : "Personnalisée" Registre
- Créez un package intermédiaire (par exemple, pf) qui importe à la fois le package central (pi) et les packages d'implémentation (par exemple, pa, pb).
- Définissez "factory" méthodes dans pf pour instancier les clients, en évitant les dépendances circulaires entre pf et l'autre forfaits.
Recommandation
La meilleure solution dépend des exigences. L’option 1 est préférable si la sélection de la mise en œuvre peut être effectuée au préalable. L'option 2 permet l'extensibilité, mais nécessite un enregistrement explicite. L'option 3 offre un compromis entre commodité et extensibilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!