SlideShare una empresa de Scribd logo
1 de 99
Descargar para leer sin conexión
Domain Driven Design
com Python
Frederico Cabral
Frederico Cabral
• Carioca 

• Triatleta
• Primeiro software profissional em 2000
• Python, C#, Ruby
Nosso Cliente
Quero vender na WEB!!!
Preciso de um programador RockStar!
Programador Contratado
Skills do Programador
• Mindset Ágil
• Manja dos paranuê de Django e Python
• PHD em Design Patterns

• Extremamente profissional
“Vamos lá garoto!"
Preciso de solução de ecommerce revolucionária
NÃO! Tá achando que fazer um ecommerce é que
nem abrir uma das suas lojinhas num shopping?
Pq não começamos
apenas com um catálogo
de produtos?
2 semanas depois…
Boa garoto! Você é fantástico
Vamos ver se você é bom mesmo!

Agora quero que meu cliente feche a
compra direto pelo site
Claro! Ta duvidando de mim?
Vai ficar melhor que o da Amazon
Preciso apenas de 1 mes
3 meses depois
Cadê a compra?
Preciso integrar com o
meu sistema de estoque
Meus Deus!
Tudo bem. Mas vou precisar
de mais programadores
Pleno Pleno Estagiário
6 meses depois…

As coisas continuam acumulando
Preciso de sistema
de Pagamento
Online
e Integração com o
SAP
X
Qual foi o erro?
0
4.5
9
13.5
18
Janeiro Março Jun Setembro
Lead time
CATALOGO SISTEMA
CLIENTE DEV
CATALOGO
SISTEMA
COMPRA
CLIENTE DEV
0
1.25
2.5
3.75
5
Janeiro Março
Lead time
CATALOGO
SISTEMA
COMPRA
ESTOQUE
CLIENTE DEV
0
2.5
5
7.5
10
Janeiro Março Jun
Lead time
CATALOGO
SISTEMA
COMPRA
ESTOQUE
PAGAMENTO
SAP
CLIENTE DEV
0
4.5
9
13.5
18
Janeiro Março Jun Setembro
Lead time
"Software Monolítico é o
problema!!!"
SERÁ?
http://wrd.cm/1UV07Xo
Google Is 2 Billion Lines of Code
And It’s All in One Place
Monolítico
Monolítico Microservices
TECNOLOGIANEGÓCIO GAP
–Melvin Conway’s Law - 1968
“Organizations which design systems are
constrained to produce designs which are
copies of the communication structures of these
organizations.”
NEGÓCIO TECNOLOGIA
ESSA PALESTRA
Como resolvemos
isso?
–Eric Evans
“Domain-driven design
(DDD) is an approach to
developing software for
complex needs by deeply
connecting the
implementation to an evolving
model of the core business
concepts.”
Domain
Subdomains
Bounded Contexts

Ubiquitous Language
Domain
• Define o que a empresa faz
• É o motivo do seu software existir
• Faz parte do “Problem Space”
• Composto de vários Subdomains
Domain & Subdomains
Estoque
Contabilidade
Catalogo
Compras
Pagamento
Ubiquitous Language
OBRA
OBRA
Taxa
Prazo
Classificação
Reservar()
Ativo IPO
Taxa
Prazo
Classificação
Comprar()
Vender()
Ativo Renda Fixa
Código
Nome
Atividade
Comprar()
Vender()
Ativo Ações
CLASSE “ATIVO”
Ao invés disso Nós fazemos isso
Bounded Context
• Delimita o “Domain Model"
• Faz parte do “Solution Space”
• Funciona como um fronteira para a
Linguagem Ubíqua
• Tenta conciliar a parte técnica com a
parte de negócios
Bounded Context x Subdomains
• O ideal seria uma relação de 1x1.
Porém, o mundo real não é tão simples
• Um subdomain pode ser composto de
vários Bounded Contexts
• Um bounded context pode representar
vários subdomínios
Subdomains x Bounded Contexts
Estoque
Contabilidade
Catalogo
Compras
Pagamento
Subdomains x Bounded Contexts
Estoque
Contabilidade
Catalogo
Compras
Pagamento
Subdomains x Bounded Contexts
Estoque
Contabilidade
Catalogo
Compras
Pagamento
Podem existir Bounded Contexts
não focados no negócio?
Estoque
Contabilidade
Catalogo
Compras
Pagamento
Authentication
Core
Suporte
Genérico
Bounded Context na prática
• Pode ser um simple diretório
• Pode ser uma App Django
• Pode ser um Microserviço
• Um software de terceiro
O que vai no Bounded Context?
• Entidades, Objetos de Valor,
Agregadores, Eventos, Serviços
• Tem autonomia técnica para usar
artefatos técnicos que achar melhor (Por
ex: BD)
• Fala a “Linguagem Ubíqua"
“O domínio muda o tempo todo.
O seu Bounded Context precisa
acompanhar essas mudanças”
– Vaughn Vernon -
Implementing Domain Driven
Design
“If our model were music,
they would have the
unmistakable sound of
completeness, purity, power,
and possibly event elegance
and beauty”
Context Maps
Protegendo seu domínio de influencias externas
Compras
Estoque
Up
Down
ACL
ANTICORRUPTION LAYER
ProdutoProduto
EstoqueCompras
Estoque não deve conhecer a classe Produto
que vem do Bounded de Context Compras!!!
ProdutoProduto
EstoqueCompras
ACL
Entity & Value Objects
O coração do coração
Muitos atributos!!
Método para nome do cliente
Método para endereço
Verbosidade
Value Object
Value Object
Nomes mais curtos
Value Objects são imutáveis!
Validação:
Ex: Final deve ser maior que Inicial
Entidades
• Contém estado(atributos) e comportamento(métodos)
• Local onde iremos processar a grande maioria das
nossas regras de negócio
• Devem ser “Persistent Ignorance"
Value Objects
• Api mais intuitiva. Nomes menores
• Organiza melhor as responsabilidades
• Pode ajudar com performance(fly-weight pattern)
• Pode ser reaproveitado
• Mais detalhes: http://bit.ly/1gL6AGL
Factories
Quando criar um objeto virou uma tarefa para Hércules
{
Dicas para Factories
• Usado para criar objetos complexos
• Pode acessar repositórios ou serviços
• Pode ser uma Factory Class ou um Factory Method
Domain Services
Regra de calculo de frete interage com vários objetos
Lembre das exceções!
Dicas para Domain Services
• Stateless
• Usado apenas quando determinada operação não se
encaixa em nenhum objeto de negócio
• Não se preocupa com transação ou qualquer outro
detalhes de infra-estrutura
• Se não for usado com cuidado, vai se transformar na
“bala de prata” para regras de negócio
• Uso excessivo vai gerar modelos anêmicos
Repository
Pq não me interessa onde estão os dados
Dicas para Repositórios
• Apenas uma abstração. Não sabe persistir os
dados
• Não é um DAO (Data Access Object)
• Deve parecer que está guardando tudo em
memória
• Para dados relacionais, um ORM vai tornar a vida
mais fácil
Domain Event
“Acontecimentos" empresariais
Dicas para Domain Events
• Dá pra implementar de várias maneiras
• Cuidado para não criar um Event Driven Design
• Só use mecanismo de fila se for muito necessário
• Não use para operações atômicas
O maior risco de Domain Events
Diversos patterns
Python Puro!
Nenhuma dependência
de frameworks
Recapitulando
• Bounded Contexts, demarcam uma linguagem única
• Nossos objetos, propriedades, métodos, etc
precisam expressar linguagem ubíqua, e evitar
“corrupção" de artefatos técnicos e de outros
contextos
• Suas regras de negócio estão nas entidades
• Todos os patterns tem apenas um propósito.
Proteger o seu domínio
Ciclo
Failing Test Make the
test pass
Refactor
TDD
Failing Feature
Make the
Feature pass
BDD
DDD
Domain Learning
CORE
Entities e Value Objects
Factories, Services, Repository,
Events, ACL
Django, Flask
Nunca é 100%!!!
Arquitetura Hexagonal
Trabalho num legadão!!
DDD é impossível pra mim!!
Vai valer à pena!
Dicas para começar…
• Descubra quem verdadeiramente é o seu domain
expert
• Identifique os domínios e subdomínios
• Identifique os Bounded Contexts
• Comece com o Bounded Context mais fácil
tecnicamente
Dicas para começar…
• No inicio, o foco é aprender. Não tente fazer isso
no Core.
• Exercite o hábito de colaborar com o domain
expert.
• Trate todo o resto do software como um Big Ball of
Mud
• Exercite a Linguagem Ubíqua
DDD
• Colaboração!!
• Um meio de aproximar negócio e
tecnologia
• Ágil
• Mantém a ideia artesanal do
desenvolvimento de software
DDD é um mindset!
–Napoleon Hill
“Não devemos ter medo das novas ideias!
Elas podem significar a diferença entre o
triunfo e o fracasso.”
OBRIGADO!
@fredportocabral

Más contenido relacionado

La actualidad más candente

Introducción a DDD
Introducción a DDDIntroducción a DDD
Introducción a DDDsergiopolo
 
Functional Design Patterns (DevTernity 2018)
Functional Design Patterns (DevTernity 2018)Functional Design Patterns (DevTernity 2018)
Functional Design Patterns (DevTernity 2018)Scott Wlaschin
 
Quick flask an intro to flask
Quick flask   an intro to flaskQuick flask   an intro to flask
Quick flask an intro to flaskjuzten
 
Introduction to Spring Cloud
Introduction to Spring Cloud           Introduction to Spring Cloud
Introduction to Spring Cloud VMware Tanzu
 
Introduction to Spring Boot!
Introduction to Spring Boot!Introduction to Spring Boot!
Introduction to Spring Boot!Jakub Kubrynski
 
JavaScript Fetch API
JavaScript Fetch APIJavaScript Fetch API
JavaScript Fetch APIXcat Liu
 
Spring boot
Spring bootSpring boot
Spring bootsdeeg
 
Spring Framework
Spring Framework  Spring Framework
Spring Framework tola99
 
Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)
Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)
Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)CODE WHITE GmbH
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Laurent Guérin
 
Functional programming with Java 8
Functional programming with Java 8Functional programming with Java 8
Functional programming with Java 8LivePerson
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action Alex Movila
 

La actualidad más candente (20)

Introduction to spring boot
Introduction to spring bootIntroduction to spring boot
Introduction to spring boot
 
Introducción a DDD
Introducción a DDDIntroducción a DDD
Introducción a DDD
 
Maven
MavenMaven
Maven
 
Functional Design Patterns (DevTernity 2018)
Functional Design Patterns (DevTernity 2018)Functional Design Patterns (DevTernity 2018)
Functional Design Patterns (DevTernity 2018)
 
.Net Core
.Net Core.Net Core
.Net Core
 
ReactJS presentation.pptx
ReactJS presentation.pptxReactJS presentation.pptx
ReactJS presentation.pptx
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
Quick flask an intro to flask
Quick flask   an intro to flaskQuick flask   an intro to flask
Quick flask an intro to flask
 
Introduction to Spring Cloud
Introduction to Spring Cloud           Introduction to Spring Cloud
Introduction to Spring Cloud
 
Introduction to Spring Boot!
Introduction to Spring Boot!Introduction to Spring Boot!
Introduction to Spring Boot!
 
JavaScript Fetch API
JavaScript Fetch APIJavaScript Fetch API
JavaScript Fetch API
 
Spring boot
Spring bootSpring boot
Spring boot
 
React JS
React JSReact JS
React JS
 
Intro to React
Intro to ReactIntro to React
Intro to React
 
Spring Framework
Spring Framework  Spring Framework
Spring Framework
 
Spring Boot Tutorial
Spring Boot TutorialSpring Boot Tutorial
Spring Boot Tutorial
 
Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)
Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)
Java Deserialization Vulnerabilities - The Forgotten Bug Class (DeepSec Edition)
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
 
Functional programming with Java 8
Functional programming with Java 8Functional programming with Java 8
Functional programming with Java 8
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action
 

Similar a Domain Driven Design com Python

Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Domain-Driven-Design
Domain-Driven-DesignDomain-Driven-Design
Domain-Driven-DesignWende Mendes
 
Domain-Driven-Design
 Domain-Driven-Design Domain-Driven-Design
Domain-Driven-DesignWende Mendes
 
Carreira de Desenvolvimento
Carreira de DesenvolvimentoCarreira de Desenvolvimento
Carreira de DesenvolvimentoAlvaro Viebrantz
 
Webinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidorWebinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidorAmazon Web Services LATAM
 
Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1
Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1
Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1Ueliton da Costa Leonidio
 
Clean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimentoClean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimentoPaulo Henrique da Silva
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDDGiovanni Bassi
 
Como funciona uma empresa ágil de desenvolvimento de software
Como funciona uma empresa ágil de desenvolvimento de softwareComo funciona uma empresa ágil de desenvolvimento de software
Como funciona uma empresa ágil de desenvolvimento de softwareElvis Lima
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorDickson S. Guedes
 
Bdd rails 3
Bdd rails 3Bdd rails 3
Bdd rails 3tchandy
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 
TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...tdc-globalcode
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!Isaac de Souza
 

Similar a Domain Driven Design com Python (20)

Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Domain driven-design
Domain driven-designDomain driven-design
Domain driven-design
 
Scrum na sua Empresa
Scrum na sua EmpresaScrum na sua Empresa
Scrum na sua Empresa
 
Domain-Driven-Design
Domain-Driven-DesignDomain-Driven-Design
Domain-Driven-Design
 
Domain-Driven-Design
 Domain-Driven-Design Domain-Driven-Design
Domain-Driven-Design
 
Carreira de Desenvolvimento
Carreira de DesenvolvimentoCarreira de Desenvolvimento
Carreira de Desenvolvimento
 
Webinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidorWebinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidor
 
Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1
Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1
Comércio Eletrônico - Aula 8 - Planejamento e Implementação - Parte 1
 
Clean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimentoClean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimento
 
Introdução a Domain-Driven Design
Introdução a Domain-Driven DesignIntrodução a Domain-Driven Design
Introdução a Domain-Driven Design
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDD
 
Como funciona uma empresa ágil de desenvolvimento de software
Como funciona uma empresa ágil de desenvolvimento de softwareComo funciona uma empresa ágil de desenvolvimento de software
Como funciona uma empresa ágil de desenvolvimento de software
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
 
Bi sobre Big Data - Como fazer?
Bi sobre Big Data - Como fazer?Bi sobre Big Data - Como fazer?
Bi sobre Big Data - Como fazer?
 
Azure Logic Apps
Azure Logic AppsAzure Logic Apps
Azure Logic Apps
 
Bdd rails 3
Bdd rails 3Bdd rails 3
Bdd rails 3
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...
TDC2017 | São Paulo - Trilha BigData How we figured out we had a SRE team at ...
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!
 

Domain Driven Design com Python