O que é DDD (Domain-Driven Design)? Um resumo para iniciantes!

Se você está no mundo do desenvolvimento de software, especialmente em projetos mais complexos, provavelmente já deve ter ouvido falar de DDD, ou Domain-Driven Design. . Eric Evans popularizou esse conceito em seu livro “Domain-Driven Design: Tackling Complexity in the Heart of Software”. Mas afinal, o que isso significa e como o DDD pode ajudar no desenvolvimento de aplicações? Para responder a essas perguntas, vamos explorar esse conceito de forma simples e objetiva.

O que é o Domain-Driven Design (DDD)?

O Domain-Driven Design é uma abordagem de desenvolvimento de software que, principalmente, foca em resolver problemas complexos do domínio de um negócio, colocando o domínio no centro do processo de desenvolvimento. Ao invés disso, em vez de se concentrar apenas em tecnologia ou infraestrutura, o DDD busca alinhar o código com as regras, conceitos e necessidades do negócio, assim, criando sistemas que realmente reflitam a realidade empresarial.

Por que o DDD é importante?

Em sistemas complexos, frequentemente, a parte mais difícil de entender e construir é o que chamamos de “domínio” – que são as regras e o conhecimento específicos do negócio. Nesse contexto, o DDD ajuda a criar uma conexão direta entre o conhecimento do negócio e a solução técnica, consequentemente, melhorando a clareza, a colaboração e a evolução do software ao longo do tempo.

Em resumo, o DDD:

  • Promove uma linguagem comum: Ajuda os desenvolvedores e especialistas do negócio a falarem a mesma linguagem através do conceito de Ubiquitous Language (Linguagem Ubíqua), facilitando a comunicação e o entendimento entre as partes.
  • Foca no domínio: O desenvolvimento é baseado nas necessidades reais do negócio, não apenas na implementação técnica.
  • Divide o sistema em contextos menores: Usa o conceito de Bounded Context (Contexto Delimitado) para separar as diferentes áreas do sistema, tornando mais fácil lidar com a complexidade.

Promove uma linguagem comum

No Domain-Driven Design (DDD), um dos conceitos centrais é o uso da Linguagem Ubíqua (ou Ubiquitous Language, em inglês). Basicamente, a ideia é que todos no projeto — desenvolvedores, analistas, gerentes e especialistas no negócio — falem a mesma linguagem. Em outras palavras, isso significa que todos utilizam os mesmos termos e definições para se referir às coisas que estão sendo desenvolvidas no sistema.

Imagine que você está trabalhando em um sistema de e-commerce. Inicialmente, durante as reuniões com os especialistas do negócio, você aprende que eles chamam as pessoas que compram no site de “clientes” e os produtos vendidos de “itens”. No entanto, se no código você decidir usar termos diferentes, como “usuários” para clientes ou “produtos” para itens, isso pode causar confusão e até erros no entendimento entre a equipe de desenvolvimento e os especialistas do negócio. Portanto, no DDD, você garante que o termo “cliente” no negócio seja o mesmo “cliente” no código, assim como “item” no negócio seja “item” no código.

A Linguagem Ubíqua:

  • Primeiramente, facilita a comunicação: Todos, desde os desenvolvedores até os gestores, falam a mesma linguagem. Como resultado, isso evita ambiguidades e erros de interpretação.
  • Além disso, reflete diretamente no código: Os nomes de classes, métodos e variáveis no código seguem essa linguagem comum, o que torna o sistema mais compreensível.
  • Finalmente, ela participa ativamente de todas as conversas e documentações: Em vez de utilizar termos técnicos em reuniões de negócio, você utiliza os termos que fazem sentido no domínio, como “cliente”, “pedido”, “pagamento”, etc.

Foca no domínio

Outro princípio fundamental do DDD é o foco no domínio. Mas, afinal, o que significa isso exatamente?

O domínio é o conhecimento e as regras específicas do negócio que o sistema precisa resolver. Ao invés de começar o desenvolvimento pensando apenas em tecnologias, banco de dados ou frameworks, no DDD o desenvolvimento começa com uma compreensão profunda do problema do negócio.

Por exemplo, em um sistema bancário, o domínio envolve entender como contas bancárias funcionam, como os clientes fazem transações e como os juros são calculados. O código que você escreve precisa refletir fielmente as regras e processos do domínio do banco.

Focar no domínio significa que o modelo de negócio deve guiar o design do sistema. Embora as decisões técnicas, como qual banco de dados usar ou como estruturar o código, sejam importantes, elas vêm posteriormente, depois de compreender o que o negócio realmente precisa. Isso garante que o software resolva o problema certo.

Divide o sistema em contextos menores

Em sistemas complexos, frequentemente, é comum que existam diferentes partes do sistema que tratam de conceitos e problemas distintos. Por exemplo, em um sistema de e-commerce, você pode ter as seguintes áreas:

  • Gestão de Produtos: Parte do sistema que cuida dos itens à venda.
  • Gestão de Pedidos: Parte que cuida dos pedidos feitos pelos clientes.
  • Gestão de Pagamentos: Parte que cuida das transações financeiras.

Cada uma dessas áreas tem suas próprias regras e lógicas. Nesse sentido, no DDD, usamos o conceito de Bounded Context (ou Contexto Delimitado) para separar essas áreas em “mini-mundos” dentro do sistema. Isso significa que cada parte do sistema possui seu próprio contexto, com suas regras e linguagem.

Por exemplo, no contexto de produtos, você fala sobre itens, categorias, preços e estoque. Enquanto isso, no contexto de pedidos, você fala sobre carrinhos, clientes, formas de pagamento e status do pedido.

Cada Bounded Context tem uma linguagem própria e regras específicas, e não há necessidade de misturar conceitos de um contexto em outro. Consequentemente, dessa forma, você evita confusões e mantém o sistema organizado e fácil de entender. É como dividir um grande problema em problemas menores, mais fáceis de resolver.

Ao fazer isso, o sistema se torna:

  • Mais escalável: Se uma parte do sistema precisar ser alterada ou reescrita, as outras partes permanecem intactas.
  • Mais modular: Cada contexto pode ser trabalhado e mantido de forma independente.
  • Menos propenso a erros: As regras de negócio de uma área não interferem nas regras de outra área.

      O que o DDD não é?

      É comum que alguns mitos e confusões sobre o DDD circulem entre desenvolvedores e equipes. Por isso, vamos esclarecer o que o DDD não é:

      Primeiramente, DDD não é sobre tecnologia específica: DDD é uma abordagem conceitual, não está atrelado a uma linguagem de programação, framework ou tecnologia específica. Você pode aplicar o DDD em qualquer tecnologia, desde que você siga os princípios.

      Além disso, DDD não é um design “rápido”: O DDD exige um entendimento profundo do negócio e uma colaboração constante com especialistas no domínio. Como resultado, esse início mais lento pode produzir uma solução muito mais alinhada com as necessidades reais do negócio.

      Adicionalmente, DDD não resolve todos os problemas: Se o problema do software for simples ou não houver muita complexidade nas regras de negócio, o DDD pode ser excessivo. Ele é indicado para projetos onde há complexidade significativa no domínio, e o uso de DDD em sistemas simples pode gerar sobrecarga desnecessária.

      Por outro lado, DDD não é um padrão de arquitetura: Embora o DDD ajude a estruturar a organização do código, ele não dita uma arquitetura específica, como Microservices, Monolítica, etc. Sendo assim, o DDD pode ser usado em qualquer tipo de arquitetura, contanto que a complexidade do domínio esteja sendo bem modelada.

      Finalmente, DDD não é uma “bala de prata”: Não é uma solução mágica que resolve todos os problemas do desenvolvimento de software. Para ser eficaz, o DDD exige esforço na modelagem, comunicação e compreensão profunda do domínio do negócio.

      Principais Conceitos do DDD

      1. Domínio: O domínio é o “assunto” ou o “conhecimento” do problema que estamos tentando resolver. Por exemplo, se estamos criando um sistema bancário, o domínio seria todo o conhecimento relacionado a como um banco funciona.
      2. Entidades: São objetos com identidade única, que possuem um ciclo de vida longo, como um cliente ou uma conta bancária.
      3. Value Objects (Objetos de Valor): São objetos que não possuem identidade, ou seja, são definidos pelos seus atributos. Exemplo: uma moeda (R$ 50) ou um endereço.
      4. Aggregates (Agregados): Um agregado é um grupo de entidades e objetos de valor que estão logicamente relacionados e devem ser manipulados juntos. Você manipula os agregados juntos, já que estão logicamente relacionados, e a entidade raiz controla o acesso às outras entidades.
      5. Repositories (Repositórios): São responsáveis por recuperar e armazenar agregados, permitindo que você trabalhe com eles como se estivessem em memória.
      6. Factories (Fábricas): Criam e instanciam agregados, especialmente quando a criação é complexa ou depende de múltiplas regras.
      7. Bounded Context (Contexto Delimitado): Um sistema pode ter múltiplos contextos delimitados, que são áreas do sistema onde certos conceitos do domínio fazem sentido. Isso permite separar diferentes áreas do sistema, evitando confusões.

      Exemplo de DDD na prática

      Imagine que você está desenvolvendo um sistema de e-commerce. Nesse caso, o domínio seria o próprio e-commerce e todas as suas regras, como produtos, pedidos, clientes, pagamento e entrega.

      Dentro desse sistema, você teria:

      • Primeiramente, Entidades: Como Cliente e Pedido.
      • Em seguida, Objetos de Valor: Como um Endereço de entrega ou o Valor Total de um pedido.
      • Além disso, Repositórios: Um PedidoRepository recupera e armazena pedidos.
      • Por fim, Fábricas: Uma PedidoFactory cria novos pedidos a partir de uma série de informações, como cliente, itens e endereço de entrega.

      Conclusão

      O Domain-Driven Design (DDD) é uma abordagem poderosa para lidar com a complexidade de sistemas, principalmente colocando o foco no domínio do negócio e promovendo uma linguagem comum entre os desenvolvedores e os especialistas no assunto. Entretanto, o DDD não é uma solução mágica para todo projeto: ele é ideal para sistemas complexos e com muitas regras de negócio. Por outro lado, você pode considerar o Domain-Driven Design (DDD) excessivo em projetos menores ou menos complicados.

      Em resumo, espero que esse texto tenha te dado uma visão clara do que é e do que não é o Domain-Driven Design (DDD)! Se você está começando, sugiro que tente explorar os conceitos aos poucos e aplicá-los em projetos conforme a necessidade do domínio.

      Deixe um comentário

      O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

      Rolar para cima