2 votes

Mai une nouvelle fonction alloue les descripteurs de fichiers dans Golang

Comme je viens d'un environnement C et C++ et que golang est sémantiquement différent, j'ai quelques discussions sur les noms de fonctions "New" et "Open" et sur ce que le programmeur attend de ce qui se passe sous le capot. J'ai créé un paquet où la fonction New ouvre des descripteurs de fichiers vers des fichiers temporaires. Je ne suis pas sûr que ce comportement soit prévu pour les API écrites en Go.

Voici un extrait :

// Not directly convenient New allocates file descriptors
deb := New()
deb.AddFile("/tmp/myfile")
deb.Write("/tmp/mypackage.deb")
deb.Close()

// Idiomatic it opens file descriptors but we have to provide context to open
info := &Props{Name: "mypackage"}
deb := info.Open("/tmp/mypackage.deb")
deb.AddFile("/tmp/myfile")
deb.Close()

2voto

Plato Points 2843

La communauté de Go est encore en train de trouver ses idiomes et ses modèles, alors ne considérez rien comme un dogme. Sur la base de ce que j'ai vu en un an et demi, je ne pense pas qu'il soit mauvais de toucher au disque dans un contexte de New s'il a des commentaires godoc expliquant le comportement. Il serait être inhabituel, et il est probablement plus logique de toucher le disque en d.Write() . Quelques modèles communs que j'ai vus avec New fonctions :

  • ne sont exportés que lorsqu'ils sont conçus pour être utilisés par d'autres paquets.
  • a un sens lorsqu'il est invoqué à partir d'autres paquets avec le nom du paquet en préfixe : d := deb.New(...) (puisque vous avez une variable nommée deb votre paquet est autre chose)
  • renvoie une instance de la logique commerciale principale du paquet, qui sera utilisée ultérieurement.
  • accepte les dépendances comme arguments au lieu de construire ses propres dépendances (en espérant que les dépendances comportementales soient des interfaces)
  • souvent un main() rassemble ces dépendances, appelle d := deb.New(deps) et exécute le comportement d.AddFile(); d.Write(); d.Close()

un exemple de signature utilisant une interface :

package deb

// New accepts blah returning a *Deb. It returns nil if blah.
func New(name string, to io.WriteCloser) *Deb {...}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X