Executando verificação de segurança...
9

[Dúvida] Qual a melhor estratégia para reutilizar código em diferentes projetos?

Se você já criou mais de um projeto parecido na mesma stack e teve que reutilizar o mesmo código, então provavelmente já pensou em alguma solução para isso. Caso nunca tenha passado por isso, seria algo semelhante ao diagrama abaixo:

graph TD
  subgraph Código Compartilhado
    A[Modulo1]
    B[Modulo2]
  end

  Projeto1 -->|Usa| A

  Projeto2 -->|Usa| B
  
    C[Projeto3]
    C -->|Usa| A
    C -->|Usa| B

Quais soluções existem?

Após algumas pesquisas, encontrei 6 soluções mais praticadas em empresas e times, sendo estas:

  1. Pacotes e bibliotecas
  2. Git Submodules
  3. Git Subtrees
  4. Monorepo*
  5. APIs e Microsserviços*
  6. Copiar e colar 🙂

Como quase tudo na tecnologia, aqui não seria diferente ao termos tradeoffs em cada solução apresentada.

  • Pacotes e bibliotecas: são uma solução elegante e eficaz, porém exigem maior complexidade e organização, principalmente em novas versões para não resultar em breaking changes.

  • Git Submodules: funcionam muito bem ao dividir o código em submódulos referenciados pelo hash do commit, isso permite inclusive utilizar diversas versões do código compartilhado sem interferir em projetos já existentes ou legados, a contrapartida vem na complexidade de gerenciar os apontamentos certos para cada submódulo, caso tenha mais de um.

  • Git Subtrees: são muito semelhantes aos Git Submodules, porém ao invés de ser um link com outro repositório, subtrees permitem mesclar um repositório a outro em um subdiretório, que por ser file-based system facilita o entendimento no início e ainda mantém o histórico de alterações no repositório pai, em contrapartida aumenta consideravelmente o tamanho do repositório.

  • Monorepo: compartilha todo o código em um único repositório, sendo em teoria mais fácil de manusear, porém na ideia de projetos separados ele acaba não entrando.

  • APIs e Microsserviços: são ótimos quando o que precisa ser utilizado são recursos de outro sistema como usuários, pedidos ou algo do tipo, assim como monorepos, não entram na ideia de compartilhar código.

  • Copiar colar: em disparado o mais utilizado 🤣, nenhuma complexidade de gestão, porém deselegante. Fora a brincadeira, as vezes não há necessidade de algo mais complexo, simples assim.

Na empresa onde trabalhei utilizei majoritariamente Git Submodules, porém na ideia de “super” módulo, segue o diagrama abaixo que ilustra a utilização:

graph TD
  
    A["ProjetoSuper"]
    B["Core (Submódulo)"]
    C["Projeto (Submódulo)"]

  subgraph Core
    E["Biblioteca Compartilhada"]
  end

  subgraph Projeto
    F["Código Específico do Projeto"]
  end

  A --> B
  A --> C
  B -->|Apontamento| E
  C -->|Apontamento| F


Gostaria de ouvir de vocês, caros TabNewers, qual estratégia você utiliza em seus projetos pessoais? Quais você utiliza na empresa? Quais experiências você teve?


Referências

Carregando publicação patrocinada...
1

Eu sinceramente utilizo o copia e cola, mas tenho vergonha disso kkkkk

Estou me organizando para começar a utilizar micro-serviços, pacotes e bibliotecas.

Por exemplo:

  • Envio de e-mails: micro-serviço;
  • Validação de dados (CPF, CEP, e-mail etc): biblioteca (minha ou de terceiro).

Ou seja, tudo que tem uma abordagem de certa forma grande, como um envio organizado de e-mails, eu vou criar micro-serviço e compartilhar entre softwares ou com outros micros-serviços. Já questões mais "locais" como a validação de um dado, o tratamento de alguma informação, vou inserir em uma biblioteca, provavelmente pública no GitHub, ou pegar uma já existente e inserir diretamente na aplicação em questão.

1
1

Acho que vai muito do escopo do projeto.

Já trabalhei com esses que estão na sua lista (o último é viável em momentos de livre espontânea pressão haha)

Vou opinar em alguns deles, na qual sou mais familiarizado.

Creio que a decisão fique muito preso ao contexto e escopo da aplicação, então digamos que o escopo seja pequeno, um projeto simples, nesse caso creio que a lib se encaixe bem.

Mas psso dizer que, lib dependendo do escopo, fica bem trabalhoso de se manter.

Monorepo entraria quando centralizar apenas em lib fosse inviável.

Microservicos seria algo que Monorepo já não resolvesse.

Vale lembrar que um projeto pode ter todos esses ao mesmo tempo, pois se é um projeto grande, as vezes é melhor ter tudo separado e organizado (cada um no seu próprio contexto)

É sempre bom levar em consideração o quão trabalhoso vai ser manter a lib, monorepo, API microserviços etc...Acho que usar o necessário e ir mudando com o tempo seja mais viável que adotar um monorepo ou API logo de primeira.

1

Tem muito de escopo, a grande maioria das discussões envolvem o "depende". Nesse caso acho válido utilizar ou pelo menos experimentar todas, assim como você mencionou, tem casos em que usamos mais que um em conjunto. Obrigado pelo comentário.

1

EU costumo utilizar monorepo, tanto nos meus projeto, quanto da empresa, não sei até que ponto é certo e viavel, mais já pensei em utilizar outros.

gosto bastante de apis.

agora é uma duvida minha, microserviços não entra ai ?

1

Tecnicamente, entra, mas eu queria algo para reutilizar o código em si, classes de Log, Result, configurações com banco, cache e outros que sempre utilizamos e mudamos pouquíssima coisa. Monorepo e microsserviços são mais ideias de arquitetura que podem ou não utilizar alguma estratégia para reutilizar o código, seja por bibliotecas da propria empresa, submódulos e/ou subtrees do Git.

Minha dúvida seria em qual é mais viável, quais problemas já teve, tem alguma configuração, gambiarra ou ferramenta que te ajude nisso?

Valeu por comentar :)