Ir para o conteúdo

Padrões de Projeto

Os padrões abaixo funcionam como critério de decisão para o time. Seu objetivo é impedir que o repositório perca coesão conforme as features avançam.

Leitura da Seção

Os padrões abaixo funcionam como referência primária para decisões sobre local de implementação e estruturação de novos módulos.

1. Separação por Camadas

O backend deve seguir uma divisão clara entre transporte, aplicação e persistência:

  • api: recebe e devolve HTTP.
  • services: concentra casos de uso.
  • db: abstrai acesso a dados.

Benefício principal: reduz acoplamento entre regras de negócio e framework web.

2. Service Layer

Cada fluxo relevante deve ter uma camada de serviço dedicada para orquestrar validações, chamadas a repositórios e regras de negócio.

Esse padrão evita que endpoints HTTP concentrem responsabilidades demais.

class UserService:
    def __init__(self, user_repository):
        self.user_repository = user_repository

    def create_user(self, payload):
        return self.user_repository.create(payload)

3. Repository Boundary

O acesso a dados deve ficar atrás de uma fronteira clara, mesmo quando a implementação inicial ainda for simples. Isso facilita troca de ORM, testes e evolução de consultas.

Na prática, isso significa evitar consultas ou detalhes de persistência espalhados diretamente pela camada de API ou por componentes de interface.

class UserRepository:
    def get_by_id(self, user_id: str):
        ...

4. Componentização no Frontend

No frontend, a prioridade é separar:

  • páginas e layouts em app/;
  • componentes visuais em components/;
  • integrações e utilitários em lib/;
  • contratos compartilhados em types/.

Benefício principal: melhora reuso, legibilidade e escalabilidade da interface.

5. Contratos Explícitos

Sempre que possível, contratos entre frontend e backend devem ser explícitos e tipados.

export type HealthResponse = {
  status: "ok";
};

Isso reduz ambiguidades na integração e torna mudanças de API mais visíveis durante o desenvolvimento.

6. Crescimento Incremental Guiado

A arquitetura documentada representa a direção desejada. Nem todas as pastas existem hoje, e isso é esperado.

A regra é adicionar estrutura quando houver necessidade real, preservando o padrão definido nesta documentação.

7. Evolução Sem Duplicar Convenções

Avaliando uma necessidade nova, a primeira pergunta deve ser:

  • a pasta atual já comporta essa responsabilidade?

Criar novas convenções só deve acontecer quando a estrutura existente não resolver o problema de forma clara.