Atenção: esse artigo tem um vídeo complementar. Clique e assista!

De que se trata o artigo:

Utilização do Domain-Driven Design dentro de projetos de software, abordando conceitos técnicos como padrões de software e conceitos não técnicos igualmente importantes, como a comunicação. Definir uma linguagem comum, estruturada e em torno do domínio, para todos os envolvidos no projeto.


Para que serve:

O DDD traz uma comunicação melhor para a equipe envolvida no projeto e proporciona o foco no domínio principal (core domain). Define alguns design patterns incentivando uma modelagem simples e intuitiva, deixando o código do sistema claro e de fácil entendimento do domínio (domain model).


Em que situação o tema é útil:

O DDD é útil para início de projetos, organizar projetos com necessidade de manutenção, integração com sistemas legados e para todos os ambientes que necessítem de uma boa comunicação entre os envolvidos.

DDD & Java:

Nesse artigo aprendemos os conceitos e a filosofia do DDD, assim como seus patterns. Entendemos a importância da comunicação de uma linguagem ubíqua dentro dos projetos de desenvolvimento de software. Aprendemos como fazer um bom design de código seguindo boas práticas de refatoração e como manter a integridade do modelo utilizando mapa de contextos. No final foi apresentado um exemplo de código em Java para assimilar alguns conceitos do DDD.

O software foi criado para ajudar a resolver as complexidades do mundo moderno e globalizado. Ele é usado para vários fins, como a automatização de tarefas cotidianas, controle de bolsas de valores, vendas online e ensino à distância. Dependemos bastante do bom funcionamento desses sistemas para executarmos nossas funções durante o trabalho.

A criação de um software envolve muito investimento. Investimento de tempo, pessoal, recursos, e para isso o sistema deve ser prático e útil. Entretanto, fazer a tradução dos problemas da vida real em um programa executável não é uma tarefa trivial e exige muita preparação por parte da equipe do projeto.

O design de software é uma arte, e como qualquer arte ele não pode ser aprendido como uma ciência exata, conhecendo teoremas e fórmulas. Podemos descobrir princípios e técnicas úteis para serem aplicadas na criação de software, mas provavelmente não somos capazes de fornecer um caminho exato a seguir das necessidades do mundo real para o código, de maneira que satisfaça totalmente os clientes. As necessidades dos clientes variam bastante de projeto para projeto e o conhecimento empírico de quem constrói não é totalmente aproveitado em projetos futuros. A construção de um software envolve a criatividade do desenvolvedor e o conhecimento de bons princípios de design para criar projetos bem sucedidos.

O propósito desse artigo é fazer uma introdução ao Domain Driven Design, qual é sua filosofia e mostrar algumas formas de aplicá-lo com Java. Para mais detalhes sobre DDD, o livro “Domain-Driven Design: Tackling Complexity in the Heart of Software” de Eric Evans, é uma ótima referência.

Entendendo o DDD

Para entender o DDD é necessário saber o que é um domínio (domain). Os processos de negócio sendo automatizados, problemas da vida real com necessidade de sistema, são exemplos de domínios do software. Para criar um bom software é necessário ter um conhecimento amplo desse domínio. Não se pode criar um software Bancário complexo sem conhecer bem o domínio. E quem são os especialistas nesse domínio? Arquitetos, analistas de software, desenvolvedores, todos são envolvidos nos projetos, porém o domínio de um sistema Bancário está com as pessoas internas do banco que conhecem muito bem do negócio. Esses são os Especialistas no Negócio (Domain Experts).

DDD é para o entendimento do domínio e para resolver a complexidade envolvida nos projetos. O objetivo do DDD é aproximar a comunicação entre pessoas técnicas, como desenvolvedores e arquitetos, e os especialistas no domínio. Logo no início do desenvolvimento do projeto devemos estar focados nas regras do domínio que nossos usuários estão envolvidos. Devemos estar dedicados tanto ao entendimento desse domínio quanto à colaboração com os especialistas do domínio, para construir um software poderoso e flexível.

O propósito principal do projeto de software é assumir um domínio específico e ser capaz de evoluir harmoniosamente com esse domínio. Se essa evolução acontecer sem dificuldades o projeto tem grandes chances de ser bem sucedido. Para que isso aconteça, o software deve ser o reflexo desse domínio, isto é, deve modelar o domínio.

Um desenvolvedor sem o conhecimento bancário deveria ser capaz de aprender bastante do negócio apenas lendo o código fonte do sistema. Precisamos criar uma abstração desse domínio que seja fluente para pessoas técnicas e maleável às regras do cliente. Conversando com os especialistas do domínio nós aprendemos muito do negócio, porém esse conhecimento não é transformado facilmente na construção do software, a menos que haja uma boa abstração desse modelo de software. O modelo deve ser uma ferramenta para comunicação entre os especialistas no domínio e os desenvolvedores. Ele é a essência do software, mas precisamos criar maneiras para expressá-lo, para uso de comunicação. Temos que compartilhar conhecimentos e informações do projeto, de forma precisa e sem ambigüidade.

Outro item importante para o DDD é o design de código. Há diferenças entre o design de software e o design de código. O design de software seria o entendimento do domínio expressada em um diagrama UML, ou mesmo um desenho (Agile Draw, vide referências) em um quadro ou folha de papel. Já o ...

Quer ler esse conteúdo completo? Tenha acesso completo