J'ai une situation où je soutiens ce qui est fonctionnellement la même bibliothèque dans plusieurs langues. Il y a souvent des constantes qui doivent être partagées entre celles-ci (par exemple, les clés de nom de champ json ou les codes d'erreur).
La façon dont je le fais actuellement est d'avoir du code définissant les constantes dans chaque langue.
Le problème vient de la maintenance. Si j'ajoute un nouveau code d'erreur, je dois le mettre à jour manuellement dans chaque bibliothèque. Bien que cela soit bien pour certains, cela devient fastidieux si je dis 5 sdks à mettre à jour. Ce serait bien d'avoir une seule source de vérité pour eux aussi.
J'ai pensé à une sorte de fichier de configuration, mais il doit ensuite être inclus dans chaque package déployé, ce qui ajoute de la complexité à notre processus de génération / publication.
Existe-t-il un meilleur moyen de gérer la maintenance des constantes partagées entre plusieurs langues?
type
attribut pour l'identification de la structure lors du transfert à travers le fil. Ayant cela, les clients mobiles définissent uniquement les constantes (types) qu'ils comprennent au moment du moment et ignorent tous les types inconnus. La définition dynamique causerait beaucoup de problèmes.Réponses:
Bien que je pense que votre approche actuelle est probablement la plus simple et la plus simple, voici quelques idées alternatives:
la source
Grande question! J'ai exactement le même problème; mes constantes sont essentiellement: quelles langues sont prises en charge dans mes applications, et des informations supplémentaires sur ces langues en ce qui concerne les fonctionnalités de l'application.
Malheureusement, la meilleure chose que j'ai trouvée (comme vous l'avez) est de simplement redéfinir les constantes pour chaque langue, comme vous le faites actuellement (je sais, vous vouliez certainement entendre cela ).
Évidemment, ça ne va pas parce que c'est l'opposé de SEC ( MOUILLÉ ?? ). Cependant, les constantes devraient changer si rarement que les 5-10 minutes de les redéfinir pour chaque langue ne me dérangent pas vraiment. À la fin de la journée, de petits problèmes avec une solution «élégante» comme la configuration partagée ou la génération de code peuvent prendre des heures ou des jours à résoudre, alors qu'est-ce qui est vraiment gagné? La complexité supplémentaire avec le risque de quelque chose qui ne va pas et qui pourrait prendre des efforts supplémentaires pour réparer n'est pas quelque chose que je veux traiter.
De plus, si votre application a tellement de constantes que les redéfinir par langue lorsque vous les ajoutez ou les changez prend beaucoup de temps, vous pourriez simplement avoir une odeur de code plus importante à gérer et, à ce stade, vous voudrez peut-être activer à quelque chose de plus complexe.
Donc, en bref, les redéfinir pour chaque langue a été ma meilleure solution, et je n'ai pas encore pensé à quelque chose de plus SEC qui n'aurait pas plus de facteur de risque que je veux traiter.
Une chose à vraiment faire, cependant, est de faire en sorte que vos constantes sont bien documentées dans une généralisée (et agnostique de langue) manière (nous avons une prise en pension de documentarion de l' entreprise avec des spécifications, documents divers, « planche à dessin » docs, etc. où nous gardons ce document). Assurez-vous également que des mécanismes sont en place pour synchroniser leurs définitions. C'est à peu près aussi gros problème avec l'approche de duplication que vous aurez, à l'exception d'une petite quantité de détresse psychologique due à la duplication intentionnelle de code. Mais au final, vos changements constants devraient être très délibérés et peu fréquents , donc les problèmes de synchronicité devraient être essentiellement nuls.
Je dois également mentionner qu'au fil des ans, j'ai vu des ports multilingues de diverses bibliothèques (trop fatigués pour se souvenir de ce qu'ils sont en ce moment) écrits par le même groupe qui ont invariablement des constantes définies dans les langues elles-mêmes. Pas de configuration partagée, pas de génération de code (sauf pour les bibliothèques clientes de l'API Google ... mais allez, Google a les ressources pour permettre une telle complexité). Je pense donc que nous avons frappé un mur de briques sur celui-ci. Peut-être que quelqu'un finira par trouver une bibliothèque pour résoudre ce problème;)
la source
Espérons que le cœur de votre bibliothèque soit écrit dans une langue et que les autres bibliothèques utilisent FFI ( https://en.wikipedia.org/wiki/Foreign_function_interface ) pour appeler la bibliothèque principale. Cela vous donnerait l'emplacement central pour fournir une API à partir de laquelle publier les constantes et les définitions. De cette façon, tout est autonome dans la bibliothèque. Je ne fais que mentionner cela car cela ne semble pas être inclus dans la réponse de Samuel.
Je pense que cela dépend vraiment de la capacité de votre base d'utilisateurs. Sont-ils suffisamment capables pour gérer le passage d'un autre fichier de configuration? Sont-ils capables de configurer un nouveau service? Pour la grande majorité des utilisateurs que j'ai soutenus, je voudrais que tout soit autonome - de cette façon, les utilisateurs n'auraient pas à y penser.
la source
Hopefully, the core of you library is written in one language, and the other libraries use FFI
Malheureusement, nous avons des bibliothèques pour un client Web et un code serveur (en plusieurs langues), donc ... ce ne serait pas trivial à retirer (et probablement une vulnérabilité de sécurité si nous pouvions dans l'application Web pour commencer).