Problema Comum: Em sistemas grandes, é difícil organizar o código de forma que seja fácil encontrar entidades, repositórios ou serviços de domínio.
Solução em DDD: A organização é feita por meio de módulos, que são blocos de código coesos, com pouca ou nenhuma dependência externa. Referências entre módulos podem ocorrer, mas referências cíclicas devem ser evitadas.
Módulos: Estrutura Hierárquica no Código
A estrutura de módulos segue uma hierarquia para facilitar a organização e navegação.
Exemplo: Talheres em uma cozinha organizados em compartimentos dentro de gavetas. Assim como na cozinha, o código é organizado de forma hierárquica com módulos e submódulos.
Implementação de Módulos no Código
Em Java, utiliza-se pacotes. Em .NET, usa-se namespaces.
A hierarquia é refletida na separação de nomes por pontos, indicando diferentes níveis de especialização e separação lógica do código.
Estrutura Hierárquica dos Módulos
Primeiro Nível: Deve conter o nome da empresa ou produto.
Cuidado com produtos: Se o nome do produto mudar, pode haver problemas no código.
Segundo Nível: Contextos delimitados devem ser claros e separados.
Um contexto delimitado deve ter poucas ou nenhuma referência a outros contextos.
Cada contexto possui um especialista de domínio que utiliza uma linguagem onipresente específica do contexto.
Terceiro Nível: Deve representar a natureza do código:
Domain para o modelo de domínio.
Infrastructure para infraestrutura.
UI ou Application para interface de usuário ou aplicação.
Lei de Conway
A estrutura da empresa é refletida na estrutura do código, e vice-versa. Ao separar módulos por contextos delimitados, a organização também tende a ser replicada na divisão de equipes.
Separação de Outros Tipos de Código
Além do código do modelo de domínio, há código de interface e infraestrutura que também precisa ser organizado.
A recomendação é seguir a hierarquia: empresa/produto → contextos delimitados → natureza do código.
Separação de Serviços e Modelo
Pode ser útil criar uma subdivisão para serviços separada do restante do modelo de domínio.
Cuidado: Evite exageros, como criar módulos separados para repositórios ou fábricas, pois isso cria dependências fortes entre os módulos, o que não é desejável.
Organizando o Modelo de Domínio
No nível mais baixo da hierarquia, pode-se separar o código por agregados.
Exemplo: O agregado Pedido teria uma estrutura própria contendo o Pedido (entidade raiz), itens do pedido, repositório de pedidos, etc. Essa separação facilita a navegação.
Resumo das Recomendações
A hierarquia recomendada é:
Nome da empresa/produto.
Contexto delimitado.
Natureza do código (domínio, infraestrutura, etc.).
Separação de serviços e modelo de domínio (se necessário).
Separação de agregados dentro do modelo de domínio.
Complexidade: Deve ser balanceada. Organize os módulos de forma eficiente, mas sem adicionar complexidade desnecessária.