Enregistrement de packages dans Go sans dépendance cyclique
Lors de la conception d'une application Go, il est crucial d'éviter les dépendances cycliques entre les packages, où un package dépend d'un autre, qui à son tour dépend du premier. Cela peut survenir lors de la définition d'interfaces et de leurs implémentations sur plusieurs packages.
Question :
Comment pouvons-nous enregistrer les implémentations client sans créer de dépendance cyclique entre notre package central (avec l'interface client) et les packages contenant les implémentations (par exemple, UDPClient, TCPClient)?
Réponse :
La bibliothèque standard propose deux approches principales pour résoudre ce problème :
1. Sans registre central
Définissez l'interface client dans un package central. Pour l'implémentation, spécifiez explicitement l'implémentation souhaitée lors de l'instanciation des clients. Par exemple :
import ( "hash/md5" "hash/sha256" ) func main() { h1 := md5.New() h2 := sha256.New() }
2. Avec un registre central
Créez un mécanisme de registre dans lequel les implémentations s'enregistrent elles-mêmes. Cette approche est similaire à l’enregistrement spontané évoqué dans la question. Il est utilisé dans le package d'images, où divers décodeurs de formats d'image (par exemple, GIF, JPEG, PNG) s'enregistrent.
3. Registre personnalisé proposé
Introduire un package d'usine distinct qui fournit les méthodes NewClient() pour créer des clients. Ce package peut faire référence aux packages d'interface et d'implémentation sans provoquer de dépendance circulaire. Par exemple :
package pi // Client represents the client interface. type Client interface { ... }
package pa // UDPClient implements the Client interface. type UDPClient struct { ... }
package pb // TCPClient implements the Client interface. type TCPClient struct { ... }
package pf import ( "pi" "pa" "pb" ) // NewClient creates a client based on the implementation. func NewClient(impl string) pi.Client { switch impl { case "udp": return &pa.UDPClient{} case "tcp": return &pb.TCPClient{} default: panic("Unsupported implementation") } }
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!