Eu tenho uma situação em que apoio o que é funcionalmente a mesma biblioteca em vários idiomas. Muitas vezes, há constantes que precisam ser compartilhadas entre elas (por exemplo, chaves de nome de campo json ou códigos de erro).
A maneira como atualmente faço isso é ter código que define as constantes em cada idioma.
O problema vem na manutenção. Se eu adicionar um novo código de erro, preciso atualizá-lo manualmente em todas as bibliotecas. Enquanto isso é bom para alguns, torna-se tedioso se eu tiver que dizer 5 sdks para atualizar. Seria bom ter uma única fonte de verdade para elas também.
Pensei em algum tipo de arquivo de configuração, mas ele precisa ser incluído em todos os pacotes implantados, o que adiciona complexidade ao nosso processo de compilação / liberação.
Existe uma maneira melhor de lidar com a manutenção de constantes compartilhadas entre vários idiomas?
type
atributo para identificação da estrutura ao transferi-lo pela conexão. Com isso, os clientes móveis definem apenas constantes (tipos) que eles entendem no momento e ignoram quaisquer tipos desconhecidos. A definição dinâmica causaria muitos problemas.Respostas:
Embora eu ache que sua abordagem atual seja provavelmente a mais simples e direta, aqui estão algumas idéias alternativas:
fonte
Ótima pergunta! Eu tenho exatamente a mesma questão; minhas constantes são essencialmente: quais idiomas são suportados nos meus aplicativos e informações adicionais sobre esses idiomas no que se refere à funcionalidade do aplicativo.
Infelizmente, a melhor coisa que eu encontrei (como você encontrou) é simplesmente redefinir constantes para cada idioma, como você está fazendo atualmente (eu sei, você definitivamente queria ouvir isso ).
Obviamente parece errado, porque é o oposto de DRY ( WET ?? ). No entanto, as constantes devem mudar com tanta frequência que os 5 a 10 minutos de redefini-las para cada idioma realmente não me incomodam. No final do dia, pequenos problemas com alguma solução 'elegante', como configuração compartilhada ou geração de código, podem levar horas ou dias para serem resolvidos, então o que realmente é ganho? A complexidade adicionada com o risco de algo dar errado que poderia exigir um esforço adicional para corrigir não é algo com o qual eu quero lidar.
Além disso, se o seu aplicativo tiver tantas constantes que redefini-las por idioma quando você as adiciona ou altera, leva um tempo significativo, é possível que você tenha um cheiro de código mais significativo para lidar e, nesse ponto, convém ativar para algo mais complexo.
Resumindo, redefini-los para cada idioma tem sido minha melhor solução, e ainda tenho que pensar em algo mais SECO que não tenha mais fatores de risco do que gostaria de lidar.
Uma coisa a fazer definitivamente , porém, é garantir que suas constantes sejam bem documentadas de maneira generalizada (e independente de idioma) (temos um repositório de documentos da empresa com especificações, documentos diversos, documentos da 'prancheta' etc. etc., onde mantemos esse documento). Além disso, verifique se você possui mecanismos para manter suas definições sincronizadas. Esse é um problema tão grande com a abordagem de duplicação quanto você terá, exceto por uma pequena quantidade de sofrimento psicológico causado pela duplicação intencional de código. Mas, no final, suas mudanças constantes devem ser muito deliberadas e pouco frequentes , portanto os problemas de sincronicidade devem ser essencialmente nulos.
Também devo mencionar que, ao longo dos anos, vi portos multilíngues de várias bibliotecas (cansados demais para lembrar o que são no momento) escritos pelo mesmo grupo que invariavelmente tem constantes definidas nos próprios idiomas. Nenhuma configuração compartilhada, nenhuma geração de código (exceto as bibliotecas cliente da API do Google ... mas vamos lá, o Google tem os recursos para permitir essa complexidade). Então acho que atingimos uma parede de tijolos nessa. Talvez alguém venha a criar uma biblioteca para lidar com esse problema;)
fonte
Felizmente, o núcleo da sua biblioteca está escrito em um idioma e as outras bibliotecas usam o FFI ( https://en.wikipedia.org/wiki/Foreign_function_interface ) para chamar a biblioteca principal. Isso lhe daria o local central para fornecer uma API para publicar as constantes e definições. Dessa forma, tudo é independente dentro da biblioteca. Estou apenas mencionando isso, pois parece não estar incluído na resposta de Samuel.
Eu acho que realmente depende da capacidade da sua base de usuários. São capazes o suficiente para lidar com a passagem de outro arquivo de configuração? Eles são capazes de configurar um novo serviço? Para a grande maioria dos usuários que eu tenho suporte, eu gostaria que tudo fosse independente - desta forma, os usuários não precisariam pensar nisso.
fonte
Hopefully, the core of you library is written in one language, and the other libraries use FFI
Infelizmente, temos bibliotecas para o cliente da Web e o código do servidor (em vários idiomas), então ... não seria trivial a execução (e provavelmente uma vulnerabilidade de segurança se pudéssemos no aplicativo da Web).