2. 26/06/2016 Thiago Veiga 2
Definindo Domain Driven Design
Não é uma tecnologia ou metodologia, mas sim uma abordagem
de design de software disciplinada que reune um conjunto de conceitos,
técnicas e princípios com foco no domínio e na lógica do domínio para criar
um modelo do domínio.
Domain-Driven Design é uma abordagem de projeto de software que tem
como um dos objetivos permitir a criação de objetos de domínio que falem a
lingua do negócio e sejam indenpendentes da infraestrutura utilizada. Ou
seja, o foco passa a ser o domínio do negócio e não mais a tecnologia.
4. 26/06/2016 Thiago Veiga 4
Itens a definir
• O que é Design de Software ?
• O que é Modelo ?
• O que é Domínio ?
• Quais técnicas, conceitos e princípios estamos falando ?
5. 26/06/2016 Thiago Veiga 5
Definindo Design de Software
Software design is an art, and like any art it cannot be taught and learned as a
precise science, by means of theorems and formulas (Floyd Marinescu)
• Design de software geralmente envolve a resolução de problemas e
planejamento de uma solução de software . Isso inclui tanto um
componente de baixo nível (projeto de algoritmos) e um alto nível ,
projeto de arquitetura.
Design de software é o processo de implementação de soluções de software
para um ou mais conjuntos de problemas. Um dos principais componentes
do design de software é a análise de requisitos de software.
6. 26/06/2016 Thiago Veiga 6
Definindo Modelo
Modelo é uma simplificação. Ele é uma interpretação da realidade que destaca
os aspectos relevantes para resolver o problema que se tem em mãos
ignorando os detalhes estranhos (Eric Evans)
• Modelo pode ser expresso de muitas formas como rascunhos, desenhos, uml
ou código
• Modelo é uma forma de conhecimento seletivamente simplificada e
conscientemente estruturada
7. 26/06/2016 Thiago Veiga 7
Definindo o domínio
A Área de assunto em que o usuário aplica o programa é o domínio do software.
• Os domínio de software geralmente tem pouco a ver com
computadores, embora possa existir exceções
O domínio de um software é “a área de ação, conhecimento e influência do
software”. Sendo assim, focar no domínio é dar mais atenção à área de negócio
que o software pretende cobrir do que a detalhes sobre tecnologias a serem
empregadas em seu desenvolvimento.
8. 26/06/2016 Thiago Veiga 8
Algumas técnicas, conceitos e princípios dos quais estamos falando
• T.D.D. - Test-driven Design, mais uma metodologia de projeto do que uma estratégia de testes. O
principal conceito por trás disso é permitir que seus testes modelem a forma do design do sistema
• B.D.D. - Behavior-driven Design, uma evolução do TDD com alguns conceitos de DDD, focando
no comportamento do sistema somado a um desenvolvimento visando testes
• Orientação a Objetos - é um modelo de análise, projeto e programação de sistemas de software
baseado na composição e interação entre diversas unidades de software chamadas de objetos.
• D.S.L – Domain Specific Language, são os paradgimas e funções, ou códigos específicos, de
uma linguagem de programação ou linguagem de especificação em desenvolvimento de
software e engenharia de domínio, dedicada a um domínio de problema particular, uma técnica de
representação de problema particular e/ou uma técnica de solução particular.
• Arquitetura em camadas - Um programa de aplicação em n camadas é um aplicativo desenvolvido de
forma a ter várias camadas lógicas. Cada camada é auto-contida o suficiente de forma que a aplicação
pode ser dividida em vários computadores em uma rede distribuída.
• Design Pattern - é uma solução geral reutilizável para um problema que ocorre com frequência
dentro de um determinado contexto no projeto de software
• Strategic Design - é um princípio de design orientado para o futuro , a fim de aumentar as qualidades
inovadoras e competitivas de uma organização
• Ubiquitous Language - Linguagem ubíqua é o termo Eric Evans usa em Domain Driven Design para a
prática de construção de uma linguagem comum , rigorosa entre desenvolvedores e usuários. Esta
linguagem deve basear-se no modelo de domínio usada no software - daí a necessidade de que seja
rigorosa , uma vez que o software não lida bem com a ambiguidade. (Martin Fowler)
9. 26/06/2016 Thiago Veiga 9
Por que DDD ? Quais as vantagens ?
• Alinha o conhecimento dos desenvolvedores e dos domain experts
produzindo software mais coerente com o negócio e reduzindo as chances
de que o conhecimento sobre o domain model fique nas mãos de poucas ou
de uma única pessoa.
• O design É o código e não há traduções entre desenvolvedores e domain
experts porque todos compartilham a mesma linguagem.
• Fornece práticas em nível tático, na criação de um domain model sólido, e em
nível estratégico, auxiliando na identificação das áreas mais importantes a
serem atacadas e como essas áreas se comunicam.
• O maior valor da prática está no foco no negócio principal da empresa,
naquilo que é – ou pode ser – seu diferencial competitivo (chamado de Core
Domain).
• Melhor experiência de usuário, uma vez que as telas do software passam a
refletir uma operação de negócio
• Código expressando melhor o negócio e arquitetura da solução melhor
organizada.
10. 26/06/2016 Thiago Veiga 10
Quando usar DDD ?
• O software irá atender uma área de negócio muito específica e complexa,
onde ninguém ou poucos possuem conhecimento.
• Há muitas operações de negócio (dezenas).
• Há mudanças frequentes nas funcionalidades e regras.
• O software é um pequeno aplicativo de suporte da empresa, como, por
exemplo, um software composto basicamente de alguns CRUDs ou uma
API de consulta que basicamente busca alguns dados e os retorna em
algum formato específico.
Quando não usar DDD ?
11. 26/06/2016 Thiago Veiga 11
Como funciona ? Linguagem Ubíqua
Para ter um software que atenda perfeitamente a um determinado domínio,
é necessário que se estabeleça, em primeiro lugar, uma Linguagem
Ubíqua. Nessa linguagem estão os termos que fazem parte das conversas
diárias entre especialistas de negócio, times de desenvolvimento e todos os
envolvidos no projeto. Todos devem usar os mesmos termos tanto na
linguagem falada quanto no código, diagramas ou qualquer outro tipo de
documento relativo ao projeto.
A linguagem ubíqua deve ser compreendida por todos e não podem haver
ambigüidades. Toda vez que alguém perceber que um determinado
conceito do domínio possui várias palavras que o represente, deve-se
readequar tanto a linguagem falada e escrita, quanto o código.
Caso existam palavras de dificil compreensão estas devem ser esclarecidas e
caso não estejam de acordo com o domínio devem ser descartadas e/ou
substituidas. Em seguida toda a documentação, código e etc devem ser
revistos.
12. 26/06/2016 Thiago Veiga 12
Como funciona ? Linguagem Ubíqua
Se em um sistema de cobrança, por exemplo, o analista de negócio disser:
“Temos que emitir a fatura para o cliente antes da data limite“, vamos
tem no nosso código alguma coisa do tipo:
• uma classe para a entidade Cliente
• uma classe para a entidade Fatura
• um serviço que tenha um método emitir
• um atributo que chame data limite
13. 26/06/2016 Thiago Veiga 13
Como funciona ?
O DDD utiliza desenvolvimento em camadas para encapsular as regras de
negócio no domínio.
Arquitetura em camadas
14. 26/06/2016 Thiago Veiga 14
Arquitetura em camadas – Camada de apresentação
Fazem parte da camada de apresentação todos os componentes utilizados
para fazer interface com o usuário.
É crítica, pois, é através dela que o usuário completa suas tarefas. Ela precisa
ser efetiva, leve e agradável. Para isso, precisa:
• Ser orientada a tarefas (behavior driven)
• Ajustada para o device
• Amigável para o usuário.
A camada de apresentação deve "conversar" apenas com a camada de
Aplicação consumindo, apenas eventualmente, recursos fornecidos pela
Infraestrutura.
Em uma aplicação MVC, podemos assumir que as Views fazem parte da
camada de apresentação, bem como todo HTML.
15. 26/06/2016 Thiago Veiga 15
Arquitetura em camadas – Camada de Aplicação
Fazem parte da camada de aplicação todos os componentes responsáveis por
receber requisições da camada de apresentação e prover dados para ela.
A camada de aplicação deve:
• Fornecer dados "prontos para usar" para a apresentação. Não deveria ser
necessário nenhuma transformação ou processamento intensivo;
• Orquestrar a execução de tarefas iniciadas pelos elementos de interface;
• fornecer dados para a camada de Aplicação através de Input Models. De
outro lado, a Aplicação deve fornecer dados para a Apresentação via View
Models.
Em uma aplicação MVC, o controller faz parte da camada de aplicação.
Os componentes da camada de Aplicação são DTOs e serviços de aplicação.
16. 26/06/2016 Thiago Veiga 16
Arquitetura em camadas – Camada de Domínio
Fazem parte da camada de domínio todos os componentes que
implementam as regras de negócio e/ou organizam a lógica do negócio.
No DDD, é na camada de domínio que você implementa:
• Modelos de Domínio (Entidades, Value Types, Agregados, etc)
• Serviços de domínio (repositórios, processadores de comandos, etc.)
• Conexão com serviços/aplicativos externos
17. 26/06/2016 Thiago Veiga 17
Arquitetura em camadas – Camada de Infra-estrutura
Fazem parte da camada de infraestrutura todos os componentes necessários
para o suporte de execução da aplicação.
É responsabilidade da camada de Infraestrutura:
• Persistência
• Segurança
• Logging
• Containers de Inversão de Controle
• Caching
• Conectividade
18. 26/06/2016 Thiago Veiga 18
Como funciona ?
O Model Driven Design possuí vários Padrões, que são os blocos de
construção que fazem a representação do modelo abstrato
MDD - Model Driven Design
A abordagem MDD ao desenvolvimento de software permite que as
pessoas trabalhem juntas em um projeto, mesmo com níveis de
experiência individuais muito diferentes. O MDD permite que uma
empresa maximize o trabalho eficaz em um projeto enquanto
minimiza a sobrecarga necessária para produzir software que possa ser
validado pelos usuários finais no menor tempo possível. Em MDD , a
metodologia é ágil e está em constante evolução para atender às
necessidades do negócio.
19. 26/06/2016 Thiago Veiga 19
Como funciona ?
Para construir uma aplicação com DDD, levando a regra de negócio do
modelo para o software é necessário conhecermos os conceitos de
Entidades, Objetos de Valor, Repositórios, Serviços e Factores.
Blocos de Contrução
20. 26/06/2016 Thiago Veiga 20
Blocos de Contrução - Entity
• Têm significado no domínio.
• Possuem identidade.
• Uma entidade do domínio possui regras de
negócio.
• Também não conhece nenhuma outra classe fora do domínio.
• Ela não deve possuir dependências externas nem conhecer como será
persistida.
21. 26/06/2016 Thiago Veiga 21
Blocos de Contrução - Factory
• Criar objetos com todas as suas dependências e agregações e em estado
consistente
• No DDD, quando precisamos criar um Entidade complexa é necessário
utilizarmos uma fábrica para que possamos reutilizá-la ao longo do
projeto
22. 26/06/2016 Thiago Veiga 22
Blocos de Contrução – Objeto de valor
• Não têm identidade para o negócio.
• São reconhecidos pelos seus atributos.
• Não são persistidos.
23. 26/06/2016 Thiago Veiga 23
Blocos de Contrução – Repositório
• Padrão de Projeto Repository
• Acesso à dados
• Responsiveis por criar e destuir objetos
• geralmente fazem parte da camada de infra-estrutura
24. 26/06/2016 Thiago Veiga 24
Blocos de Contrução – Serviços
• Resolvem problemas do negócio
• Não são entidades nem objetos de valor
• Não controlam nem possuem estado do negócio
25. 26/06/2016 Thiago Veiga 25
Blocos de Contrução – Agregações
• Encapsulam entidades e objetos de valor de maneira que faça sentido
para o negócio.
• Possuem uma raiz.
• Definem fronteiras claras, provendo para um cliente externo da
classe uma interface de acesso aos objetos da agregação
27. 26/06/2016 Thiago Veiga 27
B.O. – Business Object
L.O. – Layer Object
V.O. – Value Object
Fuja da Arquitetura BOLOVOPara evitar
28. 26/06/2016 Thiago Veiga 28
Erros mais comuns
• Permitir que a persistência ou repositório de dados influencie no modelo.
• Não se envolver com os especialistas do domínio.
• Ignorar a linguagem dos especialistas do domínio.
• Não identificar a fronteira e a limitação dos contextos.
• Usar um modelo de domínio anêmico.
• Assumir que toda lógica é a lógica do domínio.
• Fazer uso excessivo de testes de integração.
• Tratar aspectos de segurança como parte do domínio (a menos que se esteja trabalhando em um
domínio de segurança).
• Concentrar-se na infraestrutura.
Para evitar
29. 26/06/2016 Thiago Veiga 29
Melhoria Continua Refatorando
O modelo deve ser refatorado na medida em que se compreende mais e mais
novos conceitos do domínio. Muitas vezes alguns conceitos do domínio estão
implícitos no código. Nosso trabalho é tentar identificar esse conceitos
implícitos e torná-los explícitos
• Interface de Intenção Revelada – usar nomes de métodos ou classes que
dizem exatamente o que essas classes e métodos fazem, mas não como elas
fazem.
• Funções sem Efeitos-Colaterais – tentar deixar o código com o maior
número possível de métodos que não alteram o estado dos objetos,
concentrando esse tipo de operação (alteração de estado) em Comandos.
• Asserções – para os Comandos que alteram estados, criar testes de
unidade, ou colocar asserções no código que validem, após a chamada
dos comandos, as alterações de estado esperadas.
30. 26/06/2016 Thiago Veiga 30
Planejamento Estratégico
Algumas estratégias são necessárias para lidar com sistemas complexos, onde vários modulos do sistema,
geralmente desenvolvidos por diferentes times interagem entre si.
Delimitar em que contexto cada time trabalha e qual será o grau de interação entre times e contextos.
Para isso os padrões:
• Contexto delimitado – um traçado perfeito sobre o que pertence e o que não pertence a um
contexto
• Mapa entre Contextos – uma forma de documentar claramente termos usados para um mesmo
conceito em vários contextos
• Camada Anti-corrupção – quando temos um sistema legado, com código muito bagunçado e uma
interface complexa, e estamos escrevendo um sistema novo com o código razoavelmente bem feito,
criamos uma camada entre esses dois sistemas
• Núcleo Compartilhado – Quando um recurso , geralmente o banco de dados é compartilhado
por mais de um time
31. 26/06/2016 Thiago Veiga 31
Conclusão
Em poucas palavras, DDD é uma coleção de padrões e princípios que ajudam
em seus esforços para construir aplicações que refletem uma compreensão e
a satisfação das exigências do seu negócio. Fora isso, é inteiramente uma
nova maneira de pensar sobre a sua metodologia de desenvolvimento. DDD
trata da modelagem do domínio real por primeiramente entendê-la
completamente e então colocar todas as terminologias, regras, e lógica em
uma representação abstrata dentro do seu código, tipicamente em forma de
um modelo de domínio. DDD não é um framework, mas ele tem um
conjunto de blocos ou conceitos que podem ser incorporados em sua
solução.
Podemos entender DDD como uma automatização do processo de negócio,
de modo que o foco é no domínio do software a fim de atender
completamente um determinado negócio.