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 User
tipo 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 class
declarações diferentes . O banco de dados precisaria de uma User
declaraçã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 User
tipo 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?
fonte
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 repetirUser
4 vezes em 4 idiomas diferentes. Em ambientes distribuídos, o acoplamento é um problema. SECO não é.Respostas:
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:
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.
fonte
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).
fonte