Como evitar a duplicação de estruturas de dados quando partes de um aplicativo são escritas em diferentes idiomas?

12

Como exemplo, digamos que você esteja escrevendo um aplicativo em Java .

Seu aplicativo se comunica com um servidor de API escrito em Python .

O servidor Python se comunica com um banco de dados SQL .

Você também tem um site para seu aplicativo escrito em JavaScript .

Com 4 idiomas diferentes, é fácil acabar repetindo essencialmente as mesmas estruturas de dados 4 vezes diferentes.

Por exemplo, um Usertipo pode ficar assim (pseudocódigo):

type User {
  integer id;
  string name;
  timestamp birthday;
}

Cada parte do projeto precisaria de algum tipo de representação User. As partes Java e Python precisariam de duas classdeclarações diferentes . O banco de dados precisaria de uma Userdeclaração de tabela. E o site de front-end também precisaria representar um User.

Repetir esse tipo 4 vezes diferentes realmente quebra o princípio de não se repetir . Também existe o problema de que, se o Usertipo for alterado, essas alterações precisarão ser repetidas em todas as partes diferentes do projeto.

Eu sei que a biblioteca protobuf do Google oferece um tipo de solução para esse problema, em que você escreve uma estrutura de dados usando uma sintaxe especial e, em seguida, a biblioteca gera uma declaração de estrutura para você em várias linguagens de programação diferentes. Mas isso ainda não lida com a questão de ter que repetir a lógica de validação para seus tipos.

Alguém tem alguma sugestão ou link para livros / posts sobre isso?

Normangorman
fonte
Essa é uma das razões pelas quais muitas pessoas estão migrando todo o seu desenvolvimento para o JavaScript. Funciona no cliente (web, iônico para celular, elétron para desktop), servidor (nó), banco de dados (MongoDB).
Paul
3
É possível compartilhar as mesmas estruturas de dados se o back-end e o front-end usarem o mesmo idioma. Você não está se repetindo se estiver usando diferentes bases de código. Use ferramentas para gerar as classes a partir de esquemas xml ou strings Json a partir das diferentes plataformas de desenvolvimento.
9138 Jon Raynor
5
Repeating this type 4 different times really breaks the Don't-Repeat-Yourself principle. Não, não. Você tem 4 sistemas diferentes que fazem coisas diferentes. Você está levando o DRY longe demais. De acordo com minha experiência, o tipo de reutilização que você deseja fazer é a semente do mal, porque introduz um acoplamento rígido. Pior ainda do que repetir User4 vezes em 4 idiomas diferentes. Em ambientes distribuídos, o acoplamento é um problema. SECO não é.
Laiv
Não tenha tempo para uma resposta: Dependendo de suas necessidades, você pode tentar formular as regras para validação usando, por exemplo, OWL (então crie uma ontologia). As regras de validação tornam-se "dados" que podem ser usados ​​nos pontos necessários. A alteração das regras pode ser feita em um local central.
Daniel Jour

Respostas:

12

Você não. Ou realmente, você não deveria.

Se você pensa no aplicativo, no servidor e no site em contextos separados, faz sentido que haja estruturas duplicadas. Razões pelas quais isso pode ser uma coisa boa:

  • As estruturas são semelhantes, mas não iguais. Mesmo que 90% da estrutura seja a mesma em todos os contextos. São os 10% que lhe darão enormes dores de cabeça.
  • Padrões e implementações podem ser diferentes. Quando diferentes linguagens e estruturas são usadas, torna-se muito difícil ter a mesma implementação em todas elas
  • As estruturas compartilhadas tornam-se uma dependência, que precisa ser gerenciada. Ter dependência compartilhada complica muito o desenvolvimento, pois as mudanças que são ótimas em um contexto são péssimas em outro. Portanto, é necessário muito esforço para coordenar o desenvolvimento dessa dependência compartilhada
  • Contextos diferentes têm implantações diferentes. Mesmo que você consiga compartilhar as mesmas estruturas de dados e o mesmo código de validação em todos os contextos, ainda pode acontecer que uma nova versão de um contexto seja implantada enquanto outras estão na versão antiga, portanto, situações em que há dessincronização nas versões ainda precisam ser implementadas. ser endereçado

Embora o princípio DRY seja incrível, acho que compartilhar estruturas de dados entre contextos ou camadas cria mais problemas do que resolve. Especialmente se o projeto cresce o suficiente para que pessoas diferentes estejam trabalhando em contextos diferentes.

Eufórico
fonte
5

Acho que o @Euphoric listou algumas boas razões para não duplicar seu código. No entanto, se você precisar fazer isso, recomendo usar a geração de código.

Encontre a forma canônica dos dados

Para fazer isso de forma eficaz, você deve primeiro descobrir qual é a forma canônica dos dados. É o seu esquema SQL ou classes no seu programa Java?

Derivar (automaticamente) as outras formas dele

Depois disso, crie uma maneira de gerar todas as outras formas a partir da canônica. Por exemplo, supondo que sua forma canônica seja o esquema SQL, você pode gerar código JavaScript, Java e Python facilmente (o SQL é facilmente analisado e um bom candidato para a origem canônica).

Acomodar diferenças

Deveria ser fácil marcar as seções do código gerado como "não toque" - dessa forma, você acomodaria as diferenças necessárias entre todas as diferentes representações (por exemplo: o código personalizado que você escreveu para o frontend JS e o backend Java) que precisam ser preservados durante as regenerações.
Veja um exemplo do Git; quando se abre um editor para que você digite uma mensagem o arquivo já contém algum texto cometer, mas tem o # -------- >8 --------marcador para saber onde suas extremidades de conteúdo, e onde seu texto gerado automaticamente começa.

Ainda assim, se você puder - evite essa duplicação. É uma PITA, mesmo que a maior parte do seu código seja gerada automaticamente.


Essa resposta é um pouco de história, em vez de "aqui estão algumas práticas recomendadas" - o que eu descrevi é exatamente o que eu fiz uma vez quando tive o mesmo problema que você e precisava ter os mesmos dados representados em diferentes partes do sistema (ou melhor, em dois sistemas diferentes).

Mael
fonte