Pular para o conteúdo

Regras e contextos delimitados

A regra como objeto, e a tradução que atravessa a fronteira entre dois modelos.

A regra é um objeto, e não um `given`#

Um given dentro do serviço não pode ser combinado, nem reaproveitado na consulta que lista "quem pode", nem explicado ao usuário. Os três usos são a mesma regra, e escrevê-la três vezes é como as três divergem.

dataforge
steady grande := D.regra("o pedido passa de R$ 100",
    lambda p => p.ler("total", 0) bigger 100)
steady cheio := D.regra("o pedido tem ao menos 3 itens",
    lambda p => p.ler("itens", 0) bigger_eq 3)

steady vale_frete := grande.e(cheio)

given not vale_frete.vale(pedido):
    out vale_frete.por_que_nao(pedido)   // "o pedido passa de R$ 100"

com_frete := pedidos.que(vale_frete)     // a MESMA regra, como consulta

As combinações são e, ou e nao. Uma regra que estoura levanta, em vez de responder "não vale": devolver falso esconderia o defeito, e o usuário seria recusado por um bug.

Contexto delimitado#

O "Cliente" de Vendas tem limite de crédito; o de Suporte tem plano e chamados abertos. São o mesmo nome e não são o mesmo conceito. Passar o objeto inteiro de um lado ao outro é o que faz dois modelos virarem um só — e o único não serve a ninguém.

dataforge
suporte := D.contexto("Suporte")

suporte.receber("Vendas", "Cliente", {"nome": "Ana", "credito": 5000})
// erro: 'Suporte' nao sabe traduzir 'Cliente' de 'Vendas'.

suporte.traduzir_de("Vendas", "Cliente",
    lambda c => {"nome": c["nome"], "plano": "basico", "chamados": 0})

aqui := suporte.receber("Vendas", "Cliente", {"nome": "Ana", "credito": 5000})
assert "credito" not in aqui

É a camada anticorrupção: sem ela, o modelo de fora entra inteiro, e o de dentro passa a ter campos que só existem porque o outro time os tem.

Um ouvinte que estoura não impede os outros#

dataforge
mark @vendas.ao_acontecer("PedidoPago")
action faturar(fato):
    ...

falhas := vendas.publicar(D.evento("PedidoPago", {"pedido": "PED-7"}))
out len(falhas)      // quantos ouvintes quebraram — os demais rodaram

Eles reagem a um fato que já aconteceu: derrubar os demais por causa de um deixaria o mundo parcialmente atualizado sem ninguém saber. As falhas voltam como dado, para quem quiser agir sobre elas.

O exemplo completo#

examples/dominio_ddd.df percorre as sete peças com assert em cada afirmação — inclusive as recusas.