O que é DDD (Domain Driven Design)? [fechadas]

276

Eu continuo vendo o DDD (Domain Driven Design) sendo muito usado em artigos - eu li a entrada da Wikipedia sobre DDD, mas ainda não consigo descobrir o que realmente é e como eu iria implementá-lo na criação de meus sites?

leen3o
fonte

Respostas:

595

Em primeiro lugar, se você não sabe que precisa, é possível que não precise. Se você não reconhece os problemas que o DDD resolve, talvez você não tenha esses problemas. Até mesmo os advogados do DDD apontam frequentemente que o DDD é destinado apenas a projetos grandes (> 6 meses).

Supondo que você ainda esteja lendo neste momento, minha opinião sobre o DDD é esta:

O DDD consiste em tentar tornar seu software um modelo de sistema ou processo do mundo real. Ao usar o DDD, você deve trabalhar em estreita colaboração com um especialista em domínio que pode explicar como o sistema do mundo real funciona. Por exemplo, se você estiver desenvolvendo um sistema que lida com apostas em corridas de cavalos, seu especialista em domínio pode ser um apostador experiente.

Entre você e o especialista em domínio, você cria uma linguagem onipresente (UL), que é basicamente uma descrição conceitual do sistema. A idéia é que você consiga anotar o que o sistema faz de maneira que o especialista em domínio possa lê-lo e verificar se está correto. No nosso exemplo de apostas, a linguagem onipresente incluiria a definição de palavras como 'raça', 'aposta', 'probabilidades' e assim por diante.

Os conceitos descritos pela UL formarão a base do seu design orientado a objetos. O DDD fornece algumas orientações claras sobre como seus objetos devem interagir e ajuda a dividir seus objetos nas seguintes categorias:

  • Objetos de valor, que representam um valor que pode ter sub-partes (por exemplo, uma data pode ter um dia, mês e ano)
  • Entidades, que são objetos com identidade . Por exemplo, cada objeto Customer tem sua própria identidade, então sabemos que dois clientes com o mesmo nome não são o mesmo cliente
  • Raízes agregadas são objetos que possuem outros objetos. Este é um conceito complexo e funciona com base no fato de que existem alguns objetos que não fazem sentido, a menos que tenham um proprietário. Por exemplo, um objeto 'Linha da ordem' não faz sentido sem que uma 'Ordem' pertença, por isso dizemos que a Ordem é a raiz agregada e os objetos da Linha da ordem só podem ser manipulados por métodos no objeto Ordem

O DDD também recomenda vários padrões:

  • Repositório , um padrão para persistência (salvando e carregando seus dados, geralmente de / para um banco de dados)
  • Factory , um padrão para criação de objetos
  • Serviço, um padrão para criar objetos que manipulam seus principais objetos de domínio sem fazer parte do próprio domínio

Agora, neste momento, devo dizer que se você nunca ouviu falar de alguma dessas coisas antes, não deveria tentar usar o DDD em nenhum projeto para o qual tenha um prazo. Antes de tentar o DDD, você deve estar familiarizado com os padrões de design e os padrões de design corporativo . Conhecer isso torna o DDD muito mais fácil de entender. E, como mencionado acima, há uma introdução gratuita ao DDD disponível na InfoQ (onde você também pode encontrar palestras sobre DDD).

Rob Knight
fonte
33
Uau ... Que ótima resposta! Muito apreciado e a melhor explicação que li em qualquer lugar por uma milha. Obrigado .. Vou baixar esse livro amanhã.
leen3o
3
"Raízes agregadas são objetos que possuem outros objetos. Esse é um conceito complexo e funciona com base em que existem alguns objetos que não fazem sentido a menos que tenham um proprietário." Acho que pode ser um equívoco aqui, a idéia que você menciona é "Valor Inteiro", enquanto Agregado está mais preocupado com o Limite da Transação, onde todas as regras invariantes dos negócios precisam ser aplicadas aqui.
precisa saber é o seguinte
6
Para ser honesto, isso parece praticamente todos os projetos em que os desenvolvedores colaboram com arquitetos por mais de um mês. (Bem, pelo menos de acordo com a minha experiência.) Que realização me faz apreciar ainda mais sua resposta. :)
Jaroslav Záruba
4
Não concordo com a afirmação de que o DDD é "destinado apenas a grandes projetos". DDD não é nada que você deva fazer totalmente ou não fazer. Você pode apenas fazer algumas práticas do DDD. Por exemplo, você pode simplesmente fazer "Value Objects" e "linguagem onipresente" e não agregar raízes em um projeto pequeno.
EasterBunnyBugSmasher
6
A propósito, não fazemos análise de domínio para cada projeto que fazemos ou modelamos. Já não temos conversas intermináveis ​​como BA com clientes e PME para entender o domínio e o escopo do projeto? Ainda não entendo o que há de extraordinário em DDD, em relação a qualquer outro projeto de desenvolvimento de software?
Supernova
51

Tome StackOverflow como um exemplo. Em vez de começar a projetar alguns formulários da Web, você se concentra primeiro na modelagem orientada a objetos das entidades no domínio do problema, por exemplo Usuários, Perguntas, Respostas, Votos, Comentários etc. Como o design é orientado pelos detalhes do problema domínio, é chamado de design orientado a domínio .

Você pode ler mais no livro de Eric Evans .

Matt Howells
fonte
5
Existe uma versão curta do livro de Eric Evans disponível gratuitamente .
troelskn
O problema é que você precisa de alguém que entenda o domínio de maneira suficientemente abstrata para que possa dizer algo útil antes de amarrar usando as páginas da web! Quando este for o caso, greate!
Ian Ringrose
3
Mas quem começaria projetando o formulário, honestamente? Qualquer curso acadêmico respeitável passaria por aplicativos de análise, design e modelagem de acordo com os requisitos de negócios. Eu simplesmente não entendo o que há de novo com esta técnica.
Sebas
6
Eu também, este é simplesmente um Design Orientado a Objetos, usado por todos antes mesmo que esse conceito viesse. Não vejo nenhuma nova invenção aqui.
Ronen Festinger
2
@ RonenFestinger, por favor, não julgue o DDD apenas por esta resposta. Há muitas idéias no livro de Eric Evans. Por exemplo, contextos limitados. O paradigma do contexto limitado é um dos pilares dos microsserviços que estamos construindo hoje. A leitura do livro também ajuda a entender os microsserviços.
Kerem Baydoğan