Domínio e DDD
Valor, entidade, agregado, evento, regra, repositório e unidade de trabalho — cobrados, e não só nomeados.
`Arcane.Dominio` traz as peças do Domain-Driven Design. Ele não é um framework que obriga a modelar de um jeito, e não é uma camada sobre banco: DDD é um conjunto de distinções, e o valor delas está em serem cobradas.
Um blueprint chamado Pedido com um comentário // agregado em cima não impede ninguém de mexer nos itens por fora — e é justamente isso que faz a modelagem se desfazer em seis meses. O que este módulo acrescenta é a recusa.
dataforge
adopt Arcane.Dominio as D
pedido := D.agregado("Pedido", "PED-7", total := 0)
pedido.invariante("o total nunca e negativo",
lambda p => p.ler("total", 0) bigger_eq 0)
mark @pedido.comando("acrescentar")
action acrescentar(p, nome, preco):
p.mudar(total := p.ler("total", 0) + preco)
p.aconteceu("ItemAcrescentado", {"item": nome, "preco": preco})
pedido.acrescentar("cafe", 32)
out pedido.ler("total") // 32
pedido.mudar(total := 999999) // recusado: so muda dentro de um comandoAs sete peças#
| O que é | O que ela recusa | |
|---|---|---|
valor | igualdade por conteúdo, imutável | criar um valor que a regra não permite |
entidade | igualdade por identidade, estado muda | confundir duas pessoas de mesmo nome |
agregado | a única porta de escrita | escrever por fora, e sair de um comando inválido |
evento | um fato no passado, imutável | reescrever o que já aconteceu |
regra | condição de negócio combinável | um given que não dá para reaproveitar |
repositorio | guarda agregados inteiros | guardar algo sem identidade |
unidade | confirma tudo, ou nada | publicar um fato que a transação vai desfazer |