Ich habe eine Situation, in der ich eine funktionsgleiche Bibliothek in mehreren Sprachen unterstütze. Es gibt häufig Konstanten, die von diesen gemeinsam genutzt werden müssen (z. B. json-Feldnamenschlüssel oder Fehlercodes).
Die Art und Weise, wie ich dies derzeit tue, ist, dass Code die Konstanten in jeder Sprache definiert.
Das Problem liegt in der Wartung. Wenn ich einen neuen Fehlercode hinzufüge, muss ich ihn in jeder Bibliothek manuell aktualisieren. Während dies für ein paar in Ordnung ist, wird es langweilig, wenn ich 5 sdks zum Aktualisieren sage. Es wäre schön, auch für diese eine einzige Quelle der Wahrheit zu haben.
Ich habe über eine Art Konfigurationsdatei nachgedacht, aber dann muss sie in jedem bereitgestellten Paket enthalten sein, was unseren Build- / Release-Prozess komplexer macht.
Gibt es eine bessere Möglichkeit, die Verwaltung von Konstanten zu verwalten, die von mehreren Sprachen gemeinsam genutzt werden?
type
Attribut zur Strukturidentifikation enthält, wenn es über die Leitung übertragen wird. Auf diese Weise definieren die mobilen Clients nur Konstanten (Typen), die sie zur Zeit verstehen, und ignorieren unbekannte Typen. Die dynamische Definition würde viele Probleme verursachen.Antworten:
Obwohl ich denke, dass Ihr derzeitiger Ansatz wahrscheinlich der einfachste und direkteste ist, sind hier einige alternative Ideen:
quelle
Gute Frage! Ich habe genau das gleiche Problem. Meine Konstanten sind im Wesentlichen: Welche Sprachen werden in meinen Anwendungen unterstützt? Und zusätzliche Informationen zu diesen Sprachen, da sie sich auf die Funktionalität in der App beziehen.
Leider ist das Beste, was ich (wie Sie) gefunden habe, einfach Konstanten für jede Sprache neu zu definieren, wie Sie es gerade tun (ich weiß, das wollten Sie unbedingt hören ).
Offensichtlich fühlt es sich falsch an weil es das Gegenteil von DRY ( WET ?? ) ist. Konstanten sollten sich jedoch so selten ändern, dass mich die fünf bis zehn Minuten, in denen sie für jede Sprache neu definiert wurden, nicht wirklich stören. Letztendlich können kleine Probleme mit „eleganten“ Lösungen wie der gemeinsamen Konfiguration oder der Codegenerierung Stunden oder Tage in Anspruch nehmen. Was ist also wirklich gewonnen? Zusätzliche Komplexität mit dem Risiko, dass etwas schief geht und zusätzliche Anstrengungen erforderlich sind, ist etwas, mit dem ich mich nicht befassen möchte.
Wenn Ihre Anwendung über so viele Konstanten verfügt, dass die Neudefinition dieser Konstanten pro Sprache beim Hinzufügen oder Ändern viel Zeit in Anspruch nimmt, ist möglicherweise nur ein wichtigerer Codegeruch zu behandeln, und an diesem Punkt möchten Sie möglicherweise die Konstante aktivieren zu etwas Komplexerem.
Kurz gesagt, es war meine beste Lösung, sie für jede Sprache neu zu definieren, und ich habe noch nichts TROCKENERES gefunden, das keinen größeren Risikofaktor hätte, als ich behandeln möchte.
Eine Sache, die Sie auf jeden Fall tun sollten, ist sicherzustellen, dass Ihre Konstanten in einer verallgemeinerten (und sprachunabhängigen) Weise gut dokumentiert sind dieses Dokument). Stellen Sie außerdem sicher, dass Mechanismen vorhanden sind, um die Definitionen synchron zu halten. Das ist ein ungefähr so großes Problem mit dem Duplizierungsansatz wie Sie, abgesehen von einer kleinen psychischen Belastung durch absichtliche Code-Duplizierung. Aber am Ende sollten Ihre ständigen Änderungen sehr bewusst und selten sein , so dass Synchronitätsprobleme im Wesentlichen gleich Null sein sollten.
Ich sollte auch erwähnen, dass ich im Laufe der Jahre mehrsprachige Ports verschiedener Bibliotheken gesehen habe (zu müde, um sich daran zu erinnern, was sie im Moment sind), die von derselben Gruppe geschrieben wurden, deren Konstanten immer in den Sprachen selbst definiert sind. Keine gemeinsame Konfiguration, keine Codegenerierung (mit Ausnahme der Google API-Clientbibliotheken ... Google verfügt jedoch über die Ressourcen, um sich eine solche Komplexität zu leisten). Ich denke, wir haben eine Ziegelmauer getroffen. Vielleicht kommt irgendwann jemand mit einer Bibliothek, um dieses Problem zu lösen;)
quelle
Hoffentlich ist der Kern Ihrer Bibliothek in einer Sprache geschrieben, und die anderen Bibliotheken verwenden FFI ( https://en.wikipedia.org/wiki/Foreign_function_interface ), um die Kernbibliothek aufzurufen. Dies würde Ihnen den zentralen Ort geben, um eine API bereitzustellen, von der aus Sie die Konstanten und Definitionen veröffentlichen können. Auf diese Weise ist alles in der Bibliothek in sich geschlossen. Ich erwähne dies nur, da es nicht in Samuels Antwort enthalten zu sein scheint.
Ich denke, es hängt wirklich davon ab, wie leistungsfähig Ihre Benutzerbasis ist. Sind die fähig genug, um mit dem Weitergeben einer anderen Konfigurationsdatei fertig zu werden? Sind sie in der Lage, einen neuen Dienst einzurichten? Für die große Mehrheit der von mir unterstützten Benutzer möchte ich, dass alles in sich geschlossen ist - auf diese Weise müssen die Benutzer nicht darüber nachdenken.
quelle
Hopefully, the core of you library is written in one language, and the other libraries use FFI
Leider haben wir Bibliotheken sowohl für einen Web-Client- als auch für einen Server-Code (in mehreren Sprachen), so dass es nicht trivial wäre, diese abzurufen (und wahrscheinlich eine Sicherheitslücke, wenn wir in der Web-App damit anfangen könnten).