Domain-Driven Design.
Uma abordagem de desenvolvimento de software que centra o design em um modelo rico do domínio de negócio, expresso em uma linguagem compartilhada por engenheiros e especialistas do domínio.
##Intent
Enfrentar a complexidade no coração do software modelando o domínio de negócio explicitamente, e mantendo esse modelo — e o código que o expressa — em estreito alinhamento com a linguagem usada pelas pessoas que entendem o domínio.
##Problem
À medida que um sistema cresce, as regras de negócio tendem a se espalhar por controllers, services e queries de banco de dados. O código se distancia de como o negócio realmente fala sobre seu trabalho, então cada conversa precisa de tradução e cada mudança arrisca quebrar uma regra de que ninguém se lembrava.
Designs centrados em dados pioram isso: os modelos viram sacos anêmicos de getters e setters, as invariantes não vivem em lugar nenhum em particular, e o sistema lentamente se transforma em uma "grande bola de lama" que poucas pessoas se atrevem a tocar.
##Solution
O Domain-Driven Design ataca o problema em dois níveis.
O design estratégico divide um grande domínio em contextos delimitados — fronteiras explícitas dentro das quais um modelo e sua linguagem são consistentes — e mapeia as relações entre eles. Cada contexto é livre para modelar o mesmo conceito de forma diferente onde o negócio genuinamente o enxerga de forma diferente.
O design tático constrói um modelo rico dentro de um contexto a partir de um pequeno conjunto de blocos de construção, e insiste em uma linguagem ubíqua: os mesmos termos aparecem nas conversas, no modelo e no código.
##Structure
Os blocos de construção táticos:
- Entidades — objetos definidos por uma identidade que persiste ao longo do tempo (um
Customer, umOrder). - Objetos de valor — objetos imutáveis definidos por seus atributos (um
Money, umAddress). - Agregados — clusters de entidades e objetos de valor com uma única raiz de agregado que protege as invariantes do cluster e é o único ponto de entrada para mudanças.
- Repositórios — interfaces semelhantes a coleções que carregam e persistem agregados inteiros, escondendo os detalhes de armazenamento.
- Serviços de domínio — operações sem estado que não pertencem naturalmente a uma única entidade.
- Eventos de domínio — registros de algo significativo que aconteceu no domínio.
Os blocos estratégicos — contexto delimitado e mapa de contextos — organizam esses modelos entre equipes e subsistemas.
##Applicability
- Use-o quando a complexidade central está nas regras de negócio, não na tecnologia — logística, finanças, seguros, agendamento.
- Use-o quando várias equipes precisam concordar com um entendimento compartilhado e em evolução de um domínio.
- Evite-o em aplicações simples de CRUD ou entrada de dados, onde a sobrecarga de modelagem traz pouco retorno.
##How to Implement
- Converse com especialistas do domínio e destile a linguagem ubíqua; anote os termos e o que eles significam.
- Identifique o domínio central — a parte que dá vantagem competitiva — e concentre o esforço de modelagem nela.
- Divida o domínio em contextos delimitados e desenhe um mapa de contextos com suas relações.
- Dentro de um contexto, modele os agregados de forma que cada um imponha suas próprias invariantes em uma única transação.
- Carregue e salve agregados por meio de repositórios; publique eventos de domínio para coisas com as quais outros contextos se importam.
- Refine continuamente — o modelo nunca está “pronto”, ele evolui à medida que o entendimento se aprofunda.
##Pros & Cons
- Mantém o código alinhado ao negócio, então as mudanças mapeiam de forma limpa para os requisitos.
- Isola a complexidade por trás de contextos delimitados.
- Uma linguagem compartilhada reduz a má comunicação entre engenheiros e especialistas.
- A lógica de domínio rica é desacoplada da infraestrutura e fácil de testar unitariamente.
- Curva de aprendizado íngreme e um investimento real em modelagem de domínio.
- Exagero para aplicações simples ou majoritariamente de CRUD.
- Requer acesso contínuo a especialistas do domínio.
- Mal aplicados, os blocos de construção viram cerimônia sem benefício.