Skip to content

Desenvolvimento Orientado a Contratos (Contract-First)

Em um ecossistema de saúde distribuído, onde múltiplas aplicações consomem os mesmos dados de negócio, a confiança na estrutura dos dados é vital. Nossa arquitetura utiliza a abordagem Contract-First, centralizando todas as definições de dados no pacote packages/contracts.

O Conceito: Contrato como Fonte Única da Verdade

Diferente da abordagem tradicional onde a tipagem é definida dentro de cada componente ou domínio, no Contract-First a conversa começa na definição da interface. O contrato é o "acordo" entre quem produz o dado (ex: Backend ou Domínio de Origem) e quem consome o dado (ex: Apps ou Domínios Seguidores).

Por que isto é crítico na saúde?

Imagine que o campo bloodType (tipo sanguíneo) em um prontuário mude de uma string genérica para um enum específico. Sem um contrato centralizado, essa mudança poderia passar despercebida em algum módulo secundário, causando erros fatais em tempo de execução ou exibição incorreta de dados clínicos.

O Papel do packages/contracts

Este pacote é o nível mais baixo da nossa hierarquia de dependências. Ele não contém lógica, apenas tipos (interfaces), enums e opcionalmente esquemas de validação (Zod).

Vantagens Estratégicas:

  1. Segurança de Tipagem (Type Safety): O TypeScript garante que qualquer quebra no contrato seja detectada imediatamente durante o desenvolvimento em qualquer parte do monorepo.
  2. Sincronia com o Backend: Os contratos no frontend podem ser gerados automaticamente a partir de definições de API (OpenAPI/Swagger) ou compartilhados como modelos mentais com os desenvolvedores de backend.
  3. Desacoplamento de Implementação: Um domínio pode mudar completamente sua lógica interna (store, sagas), mas desde que ele continue respeitando o contrato exportado, os outros módulos não serão afetados.
  4. Autodocumentação: O diretório contracts serve como uma documentação viva do que o sistema é capaz de processar.

Fluxo de Trabalho Contract-First

Ao criar uma nova funcionalidade (ex: Gerenciamento de Exames), seguimos este fluxo:

  1. Definição: Criamos packages/contracts/src/exams.ts com os modelos de dados (Exame, Resultado, Status).
  2. Compartilhamento: Exportamos estes modelos através do index.ts do pacote de contratos.
  3. Consumo:
    • O Domínio de Exames usa as interfaces para tipar sua Store e suas chamadas de API.
    • As Apps usam as interfaces para prever os dados que serão exibidos nos componentes.
    • Os Domain Events usam as interfaces para definir o payload das mensagens trocadas no barramento.

Conclusão

O desenvolvimento orientado a contratos transforma a incerteza da comunicação entre módulos em uma garantia matemática de consistência. No setor de saúde, esta camada de segurança adicional não é apenas uma boa prática, mas um requisito para a entrega de software robusto e seguro.