DDD: Introdução ao Domain Driven Design

DDD: Introdução ao Domain Driven Design


Entenda como podemos separar nossa empresa em Domínios e Subdomínios para facilitar o entendimento dos objetivos da companhia, tornando mais fácil o gerenciamento e priorização das tarefas que podemos receber como desenvolvedores.

Introdução

DDD, ou Domain Driven Design é uma abordagem de desenvolvimento de software que coloca o foco primordial no entendimento profundo do domínio de negócios. Ao invés de começar pelo código ou pela tecnologia, prioriza-se a compreensão das regras, processos e conceitos da empresa que a aplicação está destinada a atender.

Apesar de DDD não ser uma metodologia de projeto, já criamos uma cultura de comunicação e documentação que vai nos ajudar a evitar os pontos supracitados, assim como Vaughn Vernon diz no livro Implementing Domain Driven Design.

”O conhecimento do negócio nunca é centralizado, times de desenvolvimento precisam balancear e priorizar as necessidades e requisições de negócios de múltiplos membros do time, além de engajar com diversas pessoas que possuem habilidades muito distintas. Tudo isso com o objetivo de descobrir os requerimentos funcionais e não funcionais do software” (VERNON, 2013, pág. 37)

Ou seja, essa abordagem de desenvolvimento nos guia quanto ao que, por que e quando (prioridade) devemos fazer.

Design Estratégico

Um ponto importante de se destacar é com relação a estratégia que devemos aplicar ao DDD, pois quando sabemos o que queremos fazer, e porque queremos fazer, nós conseguiremos ter uma visão mais clara de onde queremos chegar. Aumentando assim as chances de construirmos um software que seja condizente ao que foi inicialmente proposto.

E para atingir esse objetivo o DDD divide seu projeto em diferentes segmentos como: Domínios e Subdominios que serão explicados em mais detalhes em suas respectivas sessões.

Identificando Subdomínios

Uma forma de descobrir que subdomínios estamos analisando é utilizar o seguinte fluxograma:

Fluxograma-de-Subdomínios

Podemos utilizar os exemplos que serão apresentados e encaixá-los nesse fluxograma, de forma a melhor identificar cada um. Aqui podemos realizar exercícios de inferência de quais os subdomínios de cada um, identificando similaridades entre negócios distintos, e até mesmo como alguns Subdomínios serão de um tipo para um negócio e de outro tipo para outro negócio.

Domínios

O Domínio de maneira resumida, é aquilo que a empresa faz, sendo seu foco principal, podendo ser também assimilado ao motivo da empresa existir. Mas, para que fique mais claro vamos dar um exemplo.

O Domínio de uma Escola Primária é a educação de crianças e adolecentes, por meio do ensino de conteúdos e desenvolvimento de habilidades que possam ser levados e aplicados para toda a vida. Ou seja, o Domínio de uma escola é a Educação.

A frase de Eric Evans em seu livro Domain-Driven Design: Tackling Complexity in the Heart of Software nos traz uma visão de Domínio mais próxima ao desenvolvimento de software em sí, o que facilita um pouco a compreensão do assunto.

”Todo programa se alinha com alguma atividade ou interesse de seu usuário. Esta área a qual o usuário aplica o programa é o Domínio do programa. Alguns domínios envolvem o mundo físico: o domínio de um programa de reserva de passagens de avião, envolve pessoas reais entrando em um avião real. Alguns domínios são intangíveis: o domínio de programas de contabilidade é dinheiro e finanças.” (Evans, 2003, pág. 23)

Baseado em sua frase podemos tirar algumas conclusões com relação a aplicação do DDD no desenvolvimento de software.

  1. Alinhamento com o Usuário: Todo programa de software é criado para atender a uma necessidade ou interesse específico do usuário. Isso significa que devem ser projetados e implementados de uma maneira que esteja alinhada com as atividades e interesses do usuário.
  2. Domínio do Programa: O Domínio é a área específica na qual o usuário aplica o programa. Pode ser considerado como o mundo no qual o programa opera, definindo o contexto e o escopo do software.
  3. Domínios Físicos e Intangíveis: Os domínios podem ser tanto físicos quanto intangíveis. Um domínio físico envolve elementos do mundo real, enquanto um domínio intangível envolve conceitos abstratos.

Sua frase enfatiza a importância de entender profundamente o domínio do programa para criar um software eficaz. Isso é fundamental para o DDD, que coloca o domínio no centro do processo de design e desenvolvimento de software. O objetivo é criar um modelo de domínio rico e expressivo que capture com precisão as complexidades e nuances do domínio, permitindo que o software atenda melhor às necessidades e interesses do usuário.

Subdomínios

O DDD implica a decomposição do Domínio em Subdomínios, o que facilita nossa compreensão. Dessa forma, conseguimos separar o que de fato gera valor e retorno financeiro para a companhia, e assim, estrategicamente podemos colocar nossos maiores esforços nessa parte do Domínio.

Independentemente do tamanho da empresa todo Domínio sempre poderá ser dividido em Subdomínios, fazendo isso dividimos toda a complexidade do Domínio da companhia em partes menores, e teremos especialistas em Domínio que vão entender muito bem os aspectos do negócio por se tratar de um Subdomínio específico.

No total existem três tipos de subdomínios:

Subdomínios Principais

O Subdomínio Principal é onde devemos colocar nossos maiores esforços, é aquilo que faz a companhia funcionar, o que traz valor para o negócio, que diferencia a companhia dos concorrentes, é aonde se coloca o maior foco.

Aqui iniciamos com uma questão que nos ajuda a definir um Subdomínio Principal: o que faz o negócio especial, o que o faz diferente dos outros? Essa resposta é a que nos leva, em parte, ao Subdomínio Principal. É o negócio que o diferencia dos outros no mercado.

Seguindo o exemplo inicial da Escola Primária, podemos dizer que seu subdomínio principal são as Aulas e Metodologias.

Mas podemos utilizar outros exemplos de empresas, tais como:

  • O Subdomínio principal da Netflix são os vídeos.
  • O Subdomínio principal da Azul são os voos.
  • O Subdomínio principal da DHL são seus serviços logísticos.

Subdomínios Genéricos

O Subdomínio Genérico é o conjunto de processos que são comuns no mercado, por exemplo, o portal da empresa, a loja on-line, funções de autenticação e afins. Geralmente pode ser uma solução pronta, mas também pode ser terceirizado ou até mesmo desenvolvido internamente. Ele não traz uma regra específica para o seu negócio principal, portanto, na maioria dos casos poderíamos contratar como um serviço.

Por serem naturalmente complexos, e difíceis de se implementar, devido a existência de lógicas de negócios internas que podem ser únicas, não apresentam vantagem para o negócio, estes não diferenciam o produto ou serviço da empresa.

Tudo depende de um Contexto

O que é um Subdomínio Genérico para um, pode não ser para outro. Para exemplificar melhor essa ideia, podemos utilizar o próprio exemplo da Escola Primária, onde o Subdomínio Principal são as Aulas e Metodologias, e seu Subdomínio Genérico poderia ser a Criptografia aplicada ao acesso das aulas on-line.

Se levarmos em consideração que a Criptografia utilizada em nossa plataforma da Escola Primária foi fornecida por uma empresa de criptografia, podemos dizer que para essa empresa a qualidade da criptografia não é um Subdomínio Genérico e sim um Subdomínio Principal, pois sua qualidade é o que a diferencia no mercado.

Nesse exemplo, a criptografia de usuários para acesso a conteúdos protegidos na internet é algo extremamente comum e pode ser comprado como um serviço. Para a divisão de Domínios da Escola Primária, não importa o quão robusta seja a criptografia, pois ela não vai impactar na qualidade do Subdomínio Principal que são as Aulas e Metodologias, portanto a Criptografia será um Subdomínio Genérico.

Para complementar os exemplos de alguns dos Subdomínios Principais que citamos anteriormente, podemos dizer que:

  • Um Subdomínio Genérico da Netflix é a parte de faturamento.
  • Um Subdomínio Genérico da Azul é a parte de autenticação de seu portal.
  • Um Subdomínio Genérico da DHL é a contabilidade.

Subdomínios de Suporte

É o Domínio que complementa o Domínio Principal, sem ele, seu domínio principal não pode ser bem-sucedido, portanto, ele é muito importante, e exigirá desenvolvimento interno ou terceirização da mão de obra, pois não existe solução pronta para implementar.

O Subdomínio de Suporte, apoia o negócio da empresa, mas não como o Subdomínio Principal, esse não dá nenhuma vantagem estratégica para o negócio, e sim complementa o que o Subdomínio Principal faz.

Normalmente Subdomínios de Suporte são facilmente identificáveis por sua lógica simples, em geral são sistemas de operações básicas, os mais do que famosos CRUD (Create, Read, Update e Delete).

Dentro do nosso exemplo da Escola Primária podemos dizer que o Subdomínio de Suporte seria a gestão de dados de pais, alunos e professores.

Seguindo a mesma linha das sessões anteriores os Subdomínios de Suporte, usando os exemplos anteriores, são:

  • Um Subdomínio de Suporte da Netflix é o cadastro de filmes e séries.
  • Um Subdomínio de Suporte da Azul é o cadastro de pessoas no seu portal.
  • Um Subdomínio de Suporte da DHL é a integração com outros sistemas logísticos.

Conclusão

Agora que já temos noção do que se trata cada um dos domínios e como identifica-los devemos ouvir alguém que nos conte qual é o negócio da empresa, o que fazem, por que fazem e como fazem. Alguém com experiência, que conheça o negócio, que domine do que estamos falando: precisamos falar com os professores e administradores, todos que possam nos dar uma visão de como tudo funciona. Essa pessoa é o que chamamos de Domain Expert.

Domain Expert

É uma pessoa que inicialmente detectou a necessidade, uma pessoa que conhece do Negócio (Domínio ou Subdomínio), que é capaz de descrever todos os processos e procedimentos por trás do que estamos implementando, é quem conta a história. Em um Domínio, tal como temos vários Subdomínios, teremos diversos Domain Experts.

← Artigos