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
- Aberto-Fechado
- Substituição de Liskov
- Inversão de Dependência
- Segregação de Interface
- 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