0
votes

Comment construire des extensions aux packages existants idiomatiquement

Efficace Go, et un certain nombre d'autres wikis et sites, exhortez le programmeur Go pour utiliser des noms simples pour les colis et éviter quelque chose de trop général que «Divers» ou «Utils».

En outre, allez les espaces de noms multi-consommations -Il a un niveau - le nom du paquet.

Ainsi, les noms de paquets sont simples, un ou deux mots combinés au plus, et spécifiques au sujet.

et il n'y a pas de moyen d'injecter un nouveau code dans un package existant, alors ce qui est dans «OS», par exemple, est essentiellement scellé par l'auteur de la version de l'emballage «OS» que je choisis d'utiliser (très probablement le Go OS Emballage).

Mais c'est là que je suis d'où je suis laissé gratter ma tête.

Comment puis-je écrire une bonne bibliothèque de mienne qui étend des concepts / packages existants tels que OS ou FMT ou quelque chose d'aussi générique comme "étend les types de cartes" dans un package ou un ensemble de packages à partager entre mes propres projets (ou mon organisation, ou peut-être publiquement à temps)?

comme un exemple arbitraire, disons que je suis couramment Besoin d'une fonction telle que getenvordefault (clé, définition de chaîne) string

Ceci est utile. Il pourrait être écrit de longue main en tant que jeu de déclarations si, mais est auto-documentant et un peu plus court pour écrire une fois et permet à un code client de consommer et d'être un peu plus court et plus concis dans leur signification (moins d'analyse visuelle de 'getenvordefault 'vs. Le code épelé sur et encore et encore - dans ce cas: xxx

Ceci est juste un exemple. Il est court afin de s'adapter ici et d'être facile à discuter. Je vais sortir sur un membre et supposer que vous pouvez penser à un exemple arbitraire et plus complexe où il n'est pas question que vous voudriez que vous voudriez le mettre dans une bibliothèque afin d'écrire et de le déboguer une fois, alors avoir Plusieurs projets utilisent et consomment de telles fonctionnalités.

Que nommer ce package?

pas "utils" ni "MIST" comme c'est trop GOSS. Ne peut pas être 'os' comme c'est effectivement scellé. Ne peut pas être «organisation / système d'exploitation» car nous ne pouvons pas faire des espaces de noms multi-niveaux. Ne devrait pas être "organisation_os" comme ce n'est pas idiomatique pour aller.

alors où cela nous laissait-il?

'osx' - erm ... 'OSX' - amusant mais ... 'osmisc' - semble laid / mauvais ... 'env' - d'accord, bien sûr, mais c'est super générique - combien dois-je parier qu'il existe déjà des paquets plus méritants de ce nom qui seraient en conflit à l'avenir ...

Vous sentez-vous Moi?

Ceci est un exemple. Mais j'ai des extensions utiles à JSON, à UUID, aux cartes de 32 bits, aux serveurs HTTP, aux clients HTTP, ...

Que fait un programmateur?

Copiez un tel petit misc. Fonctions utilitaires et types autour de chaque projet?

Proposez-vous avec des noms très non idiomatiques pour les colis?

Quelles suggestions pourriez-vous avoir à offrir?


2 commentaires

Ne négligez pas jusqu'à ce que vous sachiez l'API que vous raisonnez. Il n'y a pas une réponse universelle à votre question, cela dépend de l'API et des décisions prises par ses écrivains. Bien que votre exemple, si cela ne rentre pas dans la principale du programme CLI, il appartient à un package situé dans org / autre / os qui contient un importe "OS". et les ajouts.


@ MH-CBON et quel nom de paquet utiliseriez-vous pour cette extension - dans votre projet? J'ai un sac de petits ajouts pour une douzaine de sdlib différents ou de forfaits communs ...


3 Réponses :


2
votes

La bibliothèque standard utilise un suffixe "util". Exemples:


2 commentaires

Cool - Je n'étais pas au courant de cela. Je suis toujours confondue par l'histoire à long terme ici - comment ils pensent que des centaines d'équipes DEV souhaitant faire des utilitaires pour étendre HTTP - par exemple - sont destinés à le faire avec un espace de noms parent pour les distinguer tous?


Les espaces de noms n'ont pas besoin de ne jamais entrer en conflit, car vous pouvez utiliser un alias à l'importation, pour importer plusieurs packages avec le même nom par défaut.



3
votes

Il y a plusieurs façons de faire face à cela.

Premier, même si c'est discouré, misc , aidateurs , API Il existe dans de nombreux projets.

Si vous écrivez des extensions sur un package existant quelque chose , vous pouvez nommer le nouveau package quelque chose .

Vous pouvez utiliser une nommage à plusieurs niveaux en s'appuyant sur vos utilisateurs à alias est correctement: xxx

si vous écrivez un remplacement pour un package existant < Code> Quelque chose , vous pouvez nommer votre package quelque chose , similaire à github.com/sirupsen/logrus , qui est un remplaçant pour stdlib log < / code> package.


0 commentaires

1
votes

Dans des cas très simples, cela ne me dérange pas d'avoir utils dans mes projets. Si les appels de fonction sont explicites, comme par exemple, utils.getenvordefault , je constate qu'il est toujours facile de lire et de comprendre.

Mais examinons un cas plus complexe. Vous mentionnez à l'aide du nom de la société dans le package comme organisation_os . Qui rend effectivement le code plus difficile à lire.

Le nom du paquet peut également être auto-documentant. Enviroment.getenvorfault pourrait être une option. Si le nom devient trop gros, vous pouvez toujours alias l'importation à quelque chose de plus concis.


3 commentaires

Ouais, pour un projet donné, la fonction d'alias est cool et utile. Je suis toujours confondue par l'histoire à long terme ici - comment ils pensent que des centaines d'équipes DEV souhaitant faire des utilitaires pour étendre HTTP - par exemple - sont destinés à le faire avec un espace de noms parent pour les distinguer tous? Je peux utiliser «environnement» comme vous le suggérez - mais alors mon forfait «environnement» entrera en conflit avec tous les autres qui veulent ce nom ...


Eh bien, s'il y a deux packages environnement , s'ils ont des chemins d'importation différents, des alias peuvent y aider. Mais si c'est dans la même entreprise, pourquoi ne pas unir toutes les fonctions dans le même paquet? C'est toujours possible d'avoir plusieurs paquets faire la même chose. Mais ce n'est pas comme si ils ne peuvent pas être renommés d'être légèrement différents.


Pour mes propres projets - je suis tout à fait d'accord pour dire que utils.max32 (A, B) est trivialement facile à lire et à comprendre - ou utils.getenvordefault (), ouc. Je reçois la repasse de la publication publiquement sous utils - mais pour un petit Au groupe de taille moyenne, je ne vois pas les conseils pour éviter de tels noms comme convaincants. Je ne vois toujours pas une bonne "histoire" pour aller dans son ensemble avec seulement des noms de paquet de 1 niveau - nom-collision va être rampant ...