Afinal, o quê é Domain Driven Design (DDD)? (Parte 1)
Tags: learning, 100daysofcode, braziliandevs, beginners
Published: 2023-08-16 02:45:21

Olá! Meu nome é Luís Felipe Arten e este é meu primeiro post aqui no dev.to. Sou aluno de Engenharia de Software e desenvolvedor full-stack. Espero contribuir de alguma forma para a comunidade espalhando conhecimento e discutindo sobre programação, arquitetura de software, padrões de design, etc.

Afinal, o que é <u>**não**</u> é DDD?

<u>**DDD não é sobre arquitetura, metodologia de código, organização de pastas**</u>. Alguns devs em começo de carreira podem sentir um pouco de dificuldade em se adaptar, já que muito do que aprendemos no início se refere a código limpo, organização de projeto e arquitetura de software.

O DDD é uma **filosofia de desenvolvimento** cuja premissa básica é que <u>**o Software deve se relacionar diretamente ao problema (Domínio)**</u> a que se propõe resolver.

> "The heart of software is its ability to solve domain-related problems for its user." - Evans, Eric. Domain Driven Design: Tackling Complexity in the Heart of Software

Sendo assim, Eric Evans a proposta que o DDD traz é que devemos atacar diretamente as regras de negócio, onde coletamos as situações do mundo real e aplicamos lógica de programação para automatizar o processo.

"Tá bem, Arten, mas ainda não está claro o quê é Domínio!"

Ora, por Domínio podemos exemplificar o caso de um profissional especialista em direito tributário. A todo momento os órgãos e instituições competentes alteram as normas, orientações e leis do sistema de tributos. O papel do DDD é buscar entender como essas adptações de entendimento, mudanças de cálculo e demais representações do cotidiano real do profissional tributarista se dariam caso fossem feitas manualmente, para então criar possibilidades de automatização destas tarefas atacando diretamente o problema e sua complexidade.

Portanto, o Domínio é o guia do projeto. O profissional especialista em direito tributário é quem realmente conhece o funcionamento e os processos do negócio. É a figura central e com quem a troca de informações deve ser o ponto focal do time de desenvolvimento.

E aí entra a primeira dificuldade: como envolver um profissional que está habituado a Artigos, Incisos e Anexos no processo de desenvolvimento, onde Entidades, Classes, Métodos, e Casos de Uso são o bê-a-bá? Esbarramos novamente no grande paradoxo universal da linguagem?

A resposta é sim! E para resolver isso, a proposta do DDD é justamente lançar mão de padrões estratégicos e padrões táticos. Resumidamente: os padrões estratégicos permitem que os times de desenvolvimento de software mapeiem, entendam os padrões e regras de negócio; enquanto os padrões táticos são aqueles aplicados diretamente no código do projeto.

![Padrões Estratégicos e Padrões Táticos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/91yijcectg7ns4a18pmx.png)
fonte: [Domain-driven design in functional programming](https://www.thoughtworks.com/en-us/insights/blog/architecture/domain-driven-design-in-functional-programming)

Dentre os padrões que Evans propõe, há um que chamamos de Linguagem Ubíqua. Nela utilizamos conceitos do mundo real para que mesmo quem nunca escreveu uma linha de código possa entender quais são as Entidades, as Classes e seus atributos de um projeto.

No caso do nosso especialista em tributos, provavelmente iremos tratar de Regime de Impostos, Alíquotas, Natureza Jurídica, fatores de exclusão/isenção, fórmulas de cálculo, etc. E é com base nisto que iremos modelar nossas representações dentro do software, mantendo coesão e coerência com o mundo real e utilizando a linguagem por todo o código, sem adaptações tempestivas, introdução de conceitos técnicos ou ferramentais da programação, que por sua vez escapariam ao Domínio e, consequentemente, aumentariam a complexidade e entropia dentro do sistema.

E aí, ficou um pouco mais claro? Espero que sim! 

Na parte 2 vamos avançar mais sobre como o DDD pode ser isolado da Arquitetura, evitando que o código e as ferramentas utilizadas invadam o nosso Domínio. Muito obrigado pela leitura. Fique a vontade para deixar o seu comentário abaixo. Um grande abraço e até a próxima!

Fontes: 

[Domain-Driven Design: Atacando as complexidades no coração do software](https://www.amazon.com.br/Domain-Driven-Design-Eric-Evans/dp/8550800651)

[DDD - Domain-Driven Design com .NET](https://www.devmedia.com.br/ddd-domain-driven-design-com-net/14416)

[DDD não é sobre arquitetura - O que é Domain-Driven Design | Dias de Dev](https://youtu.be/SNdGV0c40yo)