Skip to main content

Bounded Context

Visão Geral

Um bounded context é a fronteira dentro da qual um modelo e sua linguagem têm significado único e consistente.

É o conceito mais consequente do DDD, porque é o único que decide arquitetura diretamente: as fronteiras de contexto são as melhores candidatas a fronteiras de módulo e, mais tarde, de serviço.

Problema

A ambição natural ao modelar uma empresa é um modelo único: uma definição de "cliente", uma de "produto", uma de "pedido", compartilhadas por todos os sistemas.

Isso é atraente e impossível.

"Cliente" em cobrança é uma entidade fiscal com CNPJ, condições de pagamento e histórico de inadimplência. Em logística, é um conjunto de endereços com restrições de entrega e janelas de recebimento. Em suporte, é uma pessoa com histórico de interações e nível de contrato.

Forçar um modelo comum produz um dos dois resultados, e ambos são ruins.

O modelo inchado — uma classe Cliente com sessenta campos, dos quais cada contexto usa oito, e ninguém sabe quais são obrigatórios em qual situação.

O modelo mínimo — só o que é comum aos três, o que deixa cada contexto implementando o que falta por fora, com duplicação e divergência.

Bounded context aceita o que a realidade impõe: modelos diferentes, com fronteiras explícitas e tradução entre eles.

Conceitos Centrais

A mesma palavra, significados diferentes

O sinal mais confiável de que há uma fronteira: um termo muda de significado.

Os três se referem à mesma entidade do mundo real. São três modelos, e devem permanecer três.

O que os liga é um identificador compartilhado, não uma classe compartilhada.

Contexto é solução; subdomínio é problema

Ver subdomínio. O ideal é um contexto por subdomínio, e a realidade diverge:

Um subdomínio atendido por dois contextos — frequentemente por razão histórica.

Um contexto cobrindo três subdomínios — o caso típico de sistema legado.

Quando divergem, isso é informação sobre onde o software não acompanha o negócio.

O contexto define o limite do modelo

Dentro da fronteira, o modelo é consistente e a linguagem é única. Fora, nada é garantido.

Isso significa que a fronteira precisa ser real — imposta por módulo, por processo, ou por sistema. Uma fronteira que só existe no diagrama não delimita nada, e o modelo vaza. Ver arquitetura vs. implementação.

Contextos se comunicam por tradução

Nenhum contexto expõe seu modelo interno. A comunicação acontece por contratos próprios da fronteira, com tradução dos dois lados.

As formas de relacionamento entre contextos — parceria, cliente-fornecedor, conformista, e outras — são o assunto de context mapping. A defesa contra o modelo alheio é a anti-corruption layer.

Modelo Mental

Onde o vocabulário muda de significado, há uma fronteira.

É um teste que se aplica ouvindo as pessoas trabalharem. Quando duas áreas usam a mesma palavra e precisam esclarecer o que querem dizer, a fronteira está ali.

Quando Usar

  • Áreas diferentes do negócio usam os mesmos termos com significados distintos.
  • Times diferentes trabalham em partes diferentes do domínio.
  • Um modelo único está ficando inchado ou cheio de casos condicionais.
  • Partes do sistema evoluem em ritmos diferentes.
  • É preciso integrar com um sistema externo que tem seu próprio modelo.

Quando Não Usar

Quando há um modelo e ele serve bem. Num sistema pequeno, com um time e um domínio coeso, criar fronteiras adiciona tradução sem resolver nada.

Quando as fronteiras propostas não correspondem a mudança de significado. Contextos criados por simetria organizacional ou por camada técnica não capturam nada.

Antes de entender o domínio. Fronteira de contexto errada é cara: ela dita onde a tradução acontece e, mais tarde, onde os serviços são extraídos. Comece com fronteiras internas fracas.

Quando o custo de tradução supera o de um modelo compartilhado. Dois contextos com noventa por cento de sobreposição e tradução constante provavelmente eram um.

Alternativas

  • Modelo compartilhado (shared kernel) — dois contextos compartilham deliberadamente uma parte pequena do modelo. Reduz tradução e acopla os dois times; exige acordo explícito sobre mudanças.
  • Um contexto só — legítimo em sistemas pequenos.
  • Contexto por sistema externo — cada integração ganha o seu, com tradução na fronteira.

Trade-offs

Contextos separadosModelo unificado
Cada modelo serve bem ao seu problemaServe mal a todos
Times evoluem independentementeCoordenação a cada mudança
Vocabulário preciso em cada áreaTermos ambíguos
Tradução em cada fronteiraSem tradução
Dado duplicado entre contextosUma fonte
Consistência eventual entre elesTransacional

A quinta linha é a que mais gera resistência: duplicar dados de cliente em três contextos parece errado. É o preço de cada contexto ter o modelo que precisa, e costuma ser menor que o custo do modelo inchado.

Modos de Falha

Contexto que vaza o modelo. Expõe suas entidades; os vizinhos passam a depender da estrutura interna.

Fronteira nominal. Existe no diagrama e nada a impõe.

Modelo canônico corporativo. A tentativa de definir "o cliente da empresa" consome anos e não converge — porque a premissa está errada.

Contextos demais. Fronteiras onde não há mudança de significado produzem tradução constante.

Banco compartilhado entre contextos. Anula a fronteira: os dois passam a depender do mesmo esquema.

Erros Comuns

Buscar um modelo único para a empresa. O erro que o conceito existe para corrigir.

Confundir com subdomínio. Solução versus problema.

Traçar fronteiras por estrutura organizacional sem verificar o vocabulário. A organização é uma pista, não a resposta.

Não impor a fronteira.

Compartilhar entidades entre contextos "para não duplicar". É o caminho de volta ao modelo unificado.

Exemplo Real

Uma rede de farmácias tinha um sistema com uma entidade Produto de 84 campos.

A análise do uso mostrou três agrupamentos de campos que nunca eram usados juntos:

Comercial usava preço, margem, fornecedor, condição de compra, curva ABC. Regulatório usava princípio ativo, tarja, registro na agência, exigência de receita, controle especial. Logística usava dimensões, peso, condição de armazenamento, validade, lote.

Nenhum dos três usava mais de 30 dos 84 campos. E havia 19 campos que só faziam sentido para alguns tipos de produto, produzindo validações condicionais espalhadas.

A separação em três contextos, ligados pelo código do produto, resolveu três problemas de uma vez.

As validações condicionais desapareceram: no contexto regulatório, Medicamento tem tarja obrigatória, e ProdutoDeHigiene é outra coisa. No comercial, essa distinção não existe.

O time regulatório passou a alterar suas regras sem coordenar com o comercial.

E o cadastro de produto deixou de exigir 84 campos: cada contexto pede o que precisa, no momento em que precisa.

O que gerou mais resistência foi a duplicação do nome do produto nos três contextos. Levou tempo aceitar que o nome comercial, o nome regulatório e a descrição de embalagem eram de fato três coisas — e que o sistema antigo as forçava a ser uma, com um campo que ninguém sabia qual dos três significava.

Conceitos Relacionados

Exercício Prático

Escolha três termos centrais do seu domínio. Para cada um, pergunte a pessoas de áreas diferentes o que ele significa.

Onde as respostas divergirem — mesmo sutilmente — há uma fronteira de contexto que o modelo provavelmente não representa.

Perguntas de Entrevista

  • Qual a diferença entre bounded context e subdomínio?
  • Por que o modelo canônico corporativo costuma falhar?
  • O que liga dois contextos que se referem à mesma entidade do mundo real?

Para Aprofundar

  • Evans, Eric. Domain-Driven Design. Addison-Wesley, 2003.
  • Vernon, Vaughn. Implementing Domain-Driven Design. Addison-Wesley, 2013.
  • Fowler, Martin. BoundedContext, 2014.