Pular para o conteúdo

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 comando

As sete peças#

O que éO que ela recusa
valorigualdade por conteúdo, imutávelcriar um valor que a regra não permite
entidadeigualdade por identidade, estado mudaconfundir duas pessoas de mesmo nome
agregadoa única porta de escritaescrever por fora, e sair de um comando inválido
eventoum fato no passado, imutávelreescrever o que já aconteceu
regracondição de negócio combinávelum given que não dá para reaproveitar
repositorioguarda agregados inteirosguardar algo sem identidade
unidadeconfirma tudo, ou nadapublicar um fato que a transação vai desfazer

Onde continuar#