Sem resumo de edição
Enzo Tavares (discussão | contribs)
SNAPSHOT 1.0.1
Linha 1: Linha 1:
* Objetivo  
= Objetivo =
** Desenvolver um conteúdo que demonstre os conceitos fundamentais sobre o DDD, a importância desse conhecimento para o desenvolvimento profissional e pessoal do programador e como esse tópico se relaciona com outros temas importantes na área da computação 
<br>
<br>
Desenvolver um conteúdo que demonstre os conceitos fundamentais sobre o '''DDD''', a importância desse conhecimento para o desenvolvimento profissional e pessoal do programador e como esse tópico se relaciona com outros temas importantes na área da computação 


* Introdução  
<br>
** No processo de desenvolvimento de sistemas, o design de software assume um papel importantíssimo ao tentar converter um problema do mundo real, tangível ou não, em software por meio de ferramentas, processos, metodologias e dentre outros métodos. Dentre essas diversas metodologias, assim como escrito na obra de referência [2], encontra-se o DDD, o qual significa Domain-Driven Design, ou seja, Design Dirigido à Domínio. Essa ramificação do design de software, o qual auxilia na estruturação e no desenvolvimento de aplicações, tem mais relação em mostrar ao programador sobre como lidar com a necessidade do cliente e traduzir para uma linguagem de domínio (o conceito central quando se fala de DDD) do que com o código propriamente dito, não havendo muito código e nem descrição de ferramentas, linguagens, frameworks ..., sendo uma maneira de estabelecer uma comunicação clara e padronizada entre todas as partes (grupos de pessoas) envolvidas na criação do sistema.  
 
= Introdução =
<br>
No processo de desenvolvimento de sistemas, o '''design de software''' assume um papel importantíssimo ao tentar converter um '''problema do mundo real''', tangível ou não, em software por meio de ferramentas, processos, metodologias e dentre outros métodos. Dentre essas diversas metodologias, assim como escrito na obra de referência [2], encontra-se o '''DDD''', o qual significa ''Domain-Driven Design'', ou seja, '''Design Dirigido à Domínio'''. Essa ramificação do design de software, o qual auxilia na estruturação e no desenvolvimento de aplicações, tem mais relação em mostrar ao programador sobre como lidar com a necessidade do cliente e traduzir para uma '''linguagem de domínio''' (o conceito central quando se fala de DDD) do que com o código propriamente dito, não havendo muito código e nem descrição de ferramentas, linguagens, frameworks ..., sendo uma maneira de estabelecer uma '''comunicação clara e padronizada''' entre todas as partes (grupos de pessoas) envolvidas na criação do sistema.
 
<br>
 
= DDD (''Domain-Driven Design'') =
<br>
A obra de referência [2] traz uma reflexão interessante acerca do desenvolvimento de software. Ao considerar a fabricação de carros como metáfora, o autor ressalta que a especialização na confecção de partes do carro pode limitar a visão do todo:
 
:: ''"The workers involved in auto manufacturing [...] often have a limited view of the entire car manufacturing process. [...] A good car starts with a vision. [...] Software development is similar. [...] You cannot create a banking software system unless you have a good understanding of what banking is all about."''
 
O autor estabelece que, assim como na engenharia automotiva, o software complexo exige design e visão prévia. Conclui-se, então, que o '''domínio do problema''' é pré-requisito para a codificação. Sem esse conhecimento de domínio, o software torna-se apenas um amontoado de funcionalidades desconexas, falhando em entregar o valor real esperado pela visão original do projeto. Mas afinal, o que é o domínio?
 
O '''domínio''' pode ser entendido como o conceito central no ''Domain-Driven Design''. A obra de referência [1] define o domínio como a '''área de conhecimento à qual o usuário aplica o software'''. Consequentemente, o design da aplicação deve se construir em torno desse conceito e das necessidades de quem o utiliza. Nesse contexto, é crucial que a equipe técnica possua um entendimento profundo do domínio para o qual a aplicação é desenvolvida para que se possa criar um modelo computacional aderente à realidade. Para facilitar essa compreensão, existem alguns conceitos muito importantes que auxiliam na estruturação do problema de forma padronizada para os envolvidos.
 
O primeiro conceito a ser citado é o de ''Domain Experts'' ('''Experts de Domínio'''), que são as pessoas que vivenciam, dia a dia, as situações as quais o software tentará auxiliar e que entendem a problemática que a aplicação tenta resolver. Antes de começar a escrever código, o programador deve entender a fundo o problema do cliente para poder tratá-lo de forma fidedigna à realidade e clara para os que estão presentes no processo do desenvolvimento do software. Uma forma de compreender mais à fundo problema, é conversando com os ''Domain Experts''. Dessa forma, torna-se clara a importância da '''comunicação''' para o DDD.
 
Além disso, outro conceito de suma importância para o Design Dirigido à Domínio é a '''Linguagem Ubíqua''' (''Ubiquitous Language''). Após múltiplas conversas estabelecidas com vários ''Domain Experts'', é possível criar um vocabulário universal. Esse conceito visa resolver a falha de comunicação gerada quando os ''Domain Experts'' e desenvolvedores utilizam vocabulários distintos: enquanto os primeiros têm um entendimento limitado acerca dos jargões técnicos, os segundos tendem a abstrair o sistema em termos puramente funcionais. Conforme exposto na obra de referência [1], depender de traduções constantes entre esses dois grupos resulta em perda de informações e em um software que não reflete a realidade do negócio; portanto, é importante estabelecer uma '''linguagem comum''' baseada no modelo de domínio, utilizada tanto nas discussões verbais e diagramas quanto na própria escrita do código-fonte.  


Para lidar com a complexidade de grandes sistemas, a abordagem de ''Domain-Driven Design'' propoe decompor o problema em áreas menores, em '''Subdomínios''', estabelecendo fronteiras lógicas explícitas conhecidas como ''Bounded Contexts'' ('''Contextos Delimitados'''). Dentro de cada uma dessas fronteiras, a linguagem é unificada e livre de ambiguidades, protegendo a integridade do modelo e permitindo que conceitos semelhantes possam ter comportamentos distintos dependendo do contexto em que estão inseridos (a palavra 'Cliente' pode significar algo totalmente diferente para o setor de Vendas e para o setor de Logística).
Dentro dessas fronteiras, a riqueza do modelo é expressa através da distinção entre '''Entidades''' — objetos que têm uma identidade única e continuidade ao longo do tempo — e ''Value Objects'' ('''Objetos de Valor'''), que são imutáveis e definidos apenas pelos seus atributos descritivos. Para assegurar a consistência dos dados e impor regras de negócio invariantes, esses objetos são organizados em ''clusters'' chamados '''Agregados'''. O Agregado funciona como uma 'cápsula' de segurança: nada de fora pode mexer nas peças internas diretamente, garantindo que as regras de negócio nunca sejam quebradas.
Por fim, a operacionalização desse modelo ocorre na camada de aplicação através dos '''Casos de Uso''', que são basicamente os roteiros das tarefas que o usuário deseja realizar (como 'Finalizar Compra'). Quando uma regra de negócio é satisfeita e gera uma mudança de estado relevante, o sistema dispara '''Eventos de Domínio'''. Esses eventos atuam como 'mensageiros' do que ocorreu no passado, permitindo que outras partes do sistema fiquem sabendo o que aconteceu e reajam a esse fato do passado, sem que uma parte do código precise ficar rigidamente presa à outra.
<br>
<br>
= Conclusão =
<br>
Portanto, o ''Domain-Driven Design'' é essencial para a construção de softwares complexos que sejam '''robustos, estáveis e fiéis à realidade do negócio'''. Mais do que uma abordagem técnica, a adoção do método impulsiona a evolução do desenvolvedor, exigindo o aprimoramento de ''hard'' e ''soft skills''. Logo, o DDD, apenas de elevar a qualidade da aplicação final, auxilia na reputação profissional de quem o pratica.


* DDD (''Domain-Driven Design'')
** A obra de referência [2] traz uma reflexao interessante acerta do desenvolvimento de software, fazendo uma comparacao {ESCREVER MAIS SOBRE}
** Assim como dito anteriormente, o domínio pode ser entendido como o conceito central no Domain-Driven Design. A obra de referência [1] define o domínio como a área de conhecimento à qual o usuário aplica o software. Consequentemente, o design da aplicação deve se construir em torno desse conceito e das necessidades de quem o utiliza. Nesse contexto, é crucial que a equipe técnica possua um entendimento profundo do domínio para o qual a aplicação é desenvolvida para que se possa criar um modelo computacional aderente à realidade. Para facilitar essa compreensão, existem alguns conceitos muito importantes que auxiliam na estruturação do problema de forma padronizada para os envolvidos.
**  O primeiro conceito a ser citado é o de Domain Experts (Experts de Domínio), que são as pessoas que vivenciam, dia a dia, as situações as quais o software tentará auxiliar e que entendem a problemática que a aplicação tenta resolver. Antes de começar a escrever código, o programador deve entender a fundo o problema do cliente para poder tratá-lo de forma fidedigna à realidade e clara para os que estão presentes no processo do desenvolvimento do software. Uma forma de compreender mais à fundo problema, é conversando com os Domain Experts. Dessa forma, torna-se clara a importância da comunicação para o DDD.
** Além disso, outro conceito de suma importância para o Design Dirigido à Domínio é a linguagem ubíqua. Após múltiplas conversas estabelecidas com vários Domains Experts, é possível criar uma linguagem universal na qual todas as pessoas envolvidas na construção do software conseguem entender e se comunicar uns com os outros.
<br>
<br>


* Linguagem ubíqua
= FAQ =
** Linguagem universal em que todas as pessoas que estão envolvidas com a construção do software conseguem conversar com o mesmo vocabulário.
<br>
** O expertes têm nomenclaturas específicas para certas entidades que os programadores costumam nomear de outro jeito
* O que é DDD?
* Por exemplo:  
* Posso aplicar apenas os elementos táticos do DDD sem passar pelo design estratégico?
** Agregados
* Ser orientado à eventos é necessário para implementar DDD?
** ''Value Objects''
 
** Eventos de domínio
<br>
** Subdomnios (''bounded contexts'')
 
* Entidades
= Referências = 
** Casos de uso
<br>
 
[1]
@book{evans2003domain,
  title={Domain-Driven Design: Tackling Complexity in the Heart of Software},
  author={Evans, Eric},
  year={2003},
  publisher={Addison-Wesley Professional},
  address={Boston, MA},
  isbn={978-0321125217}
}
<br>
 
[2]
@book{avram2006domain,
  title={Domain-Driven Design Quickly},
  author={Avram, Abel and Marinescu, Floyd},
  year={2006},
  publisher={C4Media},
  address={San Francisco, CA},
  isbn={978-1411609259}
}
<br>
 
[3]
@misc{dddpractitioners_faq,
  author      = {{DDD Practitioners}},
  title        = {{FAQs - DDD Practitioners}},
  howpublished = {\url{https://ddd-practitioners.com/home/faqs/}},
  note        = {Acessado em: 25 nov. 2025},
  year        = {n.d.}
}
 
 
= Autor =
<br>
<br>


* Referências bibliográficas:
* Enzo Santos Tavares
** [1] https://fabiofumarola.github.io/nosql/readingMaterial/Evans03.pdf
** {enzo.tavares@ufu.br}
** [2] https://ebel-kliniken.com/fileadmin/user_upload/demo/dokument-2.pdf

Edição das 22h29min de 25 de novembro de 2025

Objetivo


Desenvolver um conteúdo que demonstre os conceitos fundamentais sobre o DDD, a importância desse conhecimento para o desenvolvimento profissional e pessoal do programador e como esse tópico se relaciona com outros temas importantes na área da computação


Introdução


No processo de desenvolvimento de sistemas, o design de software assume um papel importantíssimo ao tentar converter um problema do mundo real, tangível ou não, em software por meio de ferramentas, processos, metodologias e dentre outros métodos. Dentre essas diversas metodologias, assim como escrito na obra de referência [2], encontra-se o DDD, o qual significa Domain-Driven Design, ou seja, Design Dirigido à Domínio. Essa ramificação do design de software, o qual auxilia na estruturação e no desenvolvimento de aplicações, tem mais relação em mostrar ao programador sobre como lidar com a necessidade do cliente e traduzir para uma linguagem de domínio (o conceito central quando se fala de DDD) do que com o código propriamente dito, não havendo muito código e nem descrição de ferramentas, linguagens, frameworks ..., sendo uma maneira de estabelecer uma comunicação clara e padronizada entre todas as partes (grupos de pessoas) envolvidas na criação do sistema.


DDD (Domain-Driven Design)


A obra de referência [2] traz uma reflexão interessante acerca do desenvolvimento de software. Ao considerar a fabricação de carros como metáfora, o autor ressalta que a especialização na confecção de partes do carro pode limitar a visão do todo:

"The workers involved in auto manufacturing [...] often have a limited view of the entire car manufacturing process. [...] A good car starts with a vision. [...] Software development is similar. [...] You cannot create a banking software system unless you have a good understanding of what banking is all about."

O autor estabelece que, assim como na engenharia automotiva, o software complexo exige design e visão prévia. Conclui-se, então, que o domínio do problema é pré-requisito para a codificação. Sem esse conhecimento de domínio, o software torna-se apenas um amontoado de funcionalidades desconexas, falhando em entregar o valor real esperado pela visão original do projeto. Mas afinal, o que é o domínio?

O domínio pode ser entendido como o conceito central no Domain-Driven Design. A obra de referência [1] define o domínio como a área de conhecimento à qual o usuário aplica o software. Consequentemente, o design da aplicação deve se construir em torno desse conceito e das necessidades de quem o utiliza. Nesse contexto, é crucial que a equipe técnica possua um entendimento profundo do domínio para o qual a aplicação é desenvolvida para que se possa criar um modelo computacional aderente à realidade. Para facilitar essa compreensão, existem alguns conceitos muito importantes que auxiliam na estruturação do problema de forma padronizada para os envolvidos.

O primeiro conceito a ser citado é o de Domain Experts (Experts de Domínio), que são as pessoas que vivenciam, dia a dia, as situações as quais o software tentará auxiliar e que entendem a problemática que a aplicação tenta resolver. Antes de começar a escrever código, o programador deve entender a fundo o problema do cliente para poder tratá-lo de forma fidedigna à realidade e clara para os que estão presentes no processo do desenvolvimento do software. Uma forma de compreender mais à fundo problema, é conversando com os Domain Experts. Dessa forma, torna-se clara a importância da comunicação para o DDD.

Além disso, outro conceito de suma importância para o Design Dirigido à Domínio é a Linguagem Ubíqua (Ubiquitous Language). Após múltiplas conversas estabelecidas com vários Domain Experts, é possível criar um vocabulário universal. Esse conceito visa resolver a falha de comunicação gerada quando os Domain Experts e desenvolvedores utilizam vocabulários distintos: enquanto os primeiros têm um entendimento limitado acerca dos jargões técnicos, os segundos tendem a abstrair o sistema em termos puramente funcionais. Conforme exposto na obra de referência [1], depender de traduções constantes entre esses dois grupos resulta em perda de informações e em um software que não reflete a realidade do negócio; portanto, é importante estabelecer uma linguagem comum baseada no modelo de domínio, utilizada tanto nas discussões verbais e diagramas quanto na própria escrita do código-fonte.

Para lidar com a complexidade de grandes sistemas, a abordagem de Domain-Driven Design propoe decompor o problema em áreas menores, em Subdomínios, estabelecendo fronteiras lógicas explícitas conhecidas como Bounded Contexts (Contextos Delimitados). Dentro de cada uma dessas fronteiras, a linguagem é unificada e livre de ambiguidades, protegendo a integridade do modelo e permitindo que conceitos semelhantes possam ter comportamentos distintos dependendo do contexto em que estão inseridos (a palavra 'Cliente' pode significar algo totalmente diferente para o setor de Vendas e para o setor de Logística).

Dentro dessas fronteiras, a riqueza do modelo é expressa através da distinção entre Entidades — objetos que têm uma identidade única e continuidade ao longo do tempo — e Value Objects (Objetos de Valor), que são imutáveis e definidos apenas pelos seus atributos descritivos. Para assegurar a consistência dos dados e impor regras de negócio invariantes, esses objetos são organizados em clusters chamados Agregados. O Agregado funciona como uma 'cápsula' de segurança: nada de fora pode mexer nas peças internas diretamente, garantindo que as regras de negócio nunca sejam quebradas.

Por fim, a operacionalização desse modelo ocorre na camada de aplicação através dos Casos de Uso, que são basicamente os roteiros das tarefas que o usuário deseja realizar (como 'Finalizar Compra'). Quando uma regra de negócio é satisfeita e gera uma mudança de estado relevante, o sistema dispara Eventos de Domínio. Esses eventos atuam como 'mensageiros' do que ocorreu no passado, permitindo que outras partes do sistema fiquem sabendo o que aconteceu e reajam a esse fato do passado, sem que uma parte do código precise ficar rigidamente presa à outra.


Conclusão


Portanto, o Domain-Driven Design é essencial para a construção de softwares complexos que sejam robustos, estáveis e fiéis à realidade do negócio. Mais do que uma abordagem técnica, a adoção do método impulsiona a evolução do desenvolvedor, exigindo o aprimoramento de hard e soft skills. Logo, o DDD, apenas de elevar a qualidade da aplicação final, auxilia na reputação profissional de quem o pratica.


FAQ


  • O que é DDD?
  • Posso aplicar apenas os elementos táticos do DDD sem passar pelo design estratégico?
  • Ser orientado à eventos é necessário para implementar DDD?


Referências


[1]

@book{evans2003domain, 
  title={Domain-Driven Design: Tackling Complexity in the Heart of Software}, 
  author={Evans, Eric}, 
  year={2003}, 
  publisher={Addison-Wesley Professional}, 
  address={Boston, MA}, 
  isbn={978-0321125217} 
}



[2]

@book{avram2006domain, 
  title={Domain-Driven Design Quickly}, 
  author={Avram, Abel and Marinescu, Floyd}, 
  year={2006}, 
  publisher={C4Media}, 
  address={San Francisco, CA}, 
  isbn={978-1411609259} 
}



[3]

@misc{dddpractitioners_faq, 
  author       = Predefinição:DDD Practitioners, 
  title        = Predefinição:FAQs - DDD Practitioners, 
  howpublished = {\url{https://ddd-practitioners.com/home/faqs/}}, 
  note         = {Acessado em: 25 nov. 2025}, 
  year         = {n.d.} 
}


Autor


  • Enzo Santos Tavares
    • {enzo.tavares@ufu.br}