Clean Architecture, Monorepo & DX

Arquiteto Front-end @ Santander

Professor Universitário

Guilherme

Siquinelli

Co-fundador da comunidade DevParaná

Programador Web desde os 13

Curioso pelo universo que nos circunda

Crescimento da equipe de engenharia

Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)

eixo vertical: equipe de engenharia - eixo horizontal: releases

Produtividade durante o mesmo período

Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)

eixo vertical: tamanho do produto - eixo horizontal: releases

Produtividade

Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)

Folha de pagamento mensal

Fonte: Arquitetura Limpa, Robert C. Martin (Uncle Bob)

Hard

  • Organização

  • Manutenção

  • Desempenho

  • Complexidade

Soft

  • Comunicação

  • Entendimento

  • Estimativas

  • Planejamento

Prazo

Escopo

Pessoas

Carpe Diem

Prazer, amanhã.

The future is still so much bigger than the past.

- Sir Tim Berners-Lee

Princípios de Design de Classes Orientado a Objetos

  1. Aberto-Fechado
  2. Substituição de Liskov
  3. Inversão de Dependência
  4. Segregação de Interface
  5. Responsabilidade Única

Técnicas e soluções

Arquitetura limpa

Padronizar e organizar o código, favorecendo o reuso, independente de tecnologia ou solução

Camadas

As diferentes áreas de um software devem estar em lugares diferentes

domain

domain

data

ui

As camadas favorecem

  • Escrita de testes
  • Independência de UI
  • Independência de DB
  • Entre outras independências...

Soft

ware

Suave 

 produto

Mono repositório

Um repositório único com vários projetos distintos e relacionamentos bem definidos entre eles

monorepo !== monolito

  • Simplifica o compartilhamento de código
  • Facilita refatorações entre projetos
  • Reduz o custo na criação de novas bibliotecas, micro serviços e microfrontends.

Portanto, a adoção de um monorepo geralmente permite mais flexibilidade de implantação.

O monorepo

🤔

Monorepos

Polyrepos

😁

Polyrepos

Compartilhamento de código complicado

Cada novo repo significa:

  • Configurar as ferramentas
  • Configurar ambiente de CI
  • Adicionar committers
  • Configurar a publicação

Isso, esquecendo versões incompatíveis de bibliotecas de terceiros entre eles...

Duplicação de código significativa

Cada novo repo significa:

  • Diferentes implementações
  • Desperdício de tempo
  • Maior carga de manutenção
  • Controle de qualidade

Geralmente repositórios compartilhados acabam por ficar orfãos

😃

Monorepos

Sem sobrecarga para criar novos projetos

Com monorepo significa:

  • Reuso de implementações
  • Mesma configuração de CI
  • Não precisa publicar pacotes
  • Maior controle de qualidade

E nem falamos nas facilidades em novos apps e pacotes usando geradores

Commits atômicos entre projetos

Com monorepo significa:

  • Funcionando em conjunto
  • Sem break changes locais
  • Ambientes integrados
  • Maior controle de qualidade²

Arquitetura limpa

mono
repositórios

♥️

Independência é

A equipe A poderá desenvolver seu projeto, testa-lo, mesclar PR's na main sem nunca precisar executar nenhum código escrito pela equipe B.

Portanto, a equipe B pode ter testes irregulares, código mal escrito ou quebrando testes, nada disso importa para a equipe A.

Library Types

Tipos de bibliotecas

Feature-*

Bibliotecas que implementam UI inteligentes...

  • Acesso a fontes de dados.
  • Para casos de uso de negócios.
  • Ou páginas em um aplicativo.

Ui-*

Contém apenas componentes de apresentação ou "burros"...

  • Sem casos de uso de negócios.
  • Elementos reaproveitáveis

Data-access

Biblioteca de acesso a dados contém código para interagir com um sistema de back-end.

Também inclui todo o código relacionado à gestão do estado.

  • +Store
  • Application
  • Infrastructure

Util-*

Contém utilitários de baixo nível usados por muitas bibliotecas e aplicativos.

  • Funções puras
  • Classes de encapsulamento...

domain

domain

data

ui

styles, components

services, facades

repo, usecases

entities, dtos

Criando um gerador

Gerador customizado

Governança

Ok, mas...

Como garantir que as pessoas respeitarão?

Relacionamentos

Podemos definir relações entre projetos, e isso é de extrema importância para que todas as equipes que trabalham no repositório continuem seguindo os padrões estabelecidos.

{
  "enforceBuildableLibDependency": true,
  "allow": [],
  "depConstraints": [
    {
      "sourceTag": "type:data",
      "onlyDependOnLibsWithTags": [
      	"type:domain"
      ]
    },
    {
      "sourceTag": "type:domain",
      "onlyDependOnLibsWithTags": [
      	"type:util"
       ]
    },
    {
      "sourceTag": "type:ui",
      "onlyDependOnLibsWithTags": [
      	"type:ui",
        "type:util"
      ]
    },
    {
      "sourceTag": "type:util",
      "onlyDependOnLibsWithTags": [
      	"type:util"
      ]
    },
    {
      "sourceTag": "type:feature",
      "onlyDependOnLibsWithTags": [
        "type:data",
        "type:ui",
        "type:util"
      ]
    },
    {
      "sourceTag": "type:shell",
      "onlyDependOnLibsWithTags": [
        "type:feature",
        "type:data",
        "type:ui",
        "type:util"
      ]
    },
    {
      "sourceTag": "type:app",
      "onlyDependOnLibsWithTags": [
        "type:shell",
        "type:feature",
        "type:domain",
        "type:data",
        "type:ui",
        "type:util"
      ]
    }
  ]
}

Definindo

CODEOWNERS

GitHub ✔

Dependências

Report gráfico

Perguntas?

Obrigado 🙏

😉

Arquitetura limpa

By Guilherme Siquinelli

Arquitetura limpa

  • 174