Domain Driven Design com Python

99
Domain Driven Design com Python Frederico Cabral

Transcript of Domain Driven Design com Python

Page 1: Domain Driven Design com Python

Domain Driven Design com Python

Frederico Cabral

Page 2: Domain Driven Design com Python

Frederico Cabral

• Carioca

• Triatleta

• Primeiro software profissional em 2000

• Python, C#, Ruby

Page 3: Domain Driven Design com Python

Nosso Cliente

Page 4: Domain Driven Design com Python

Quero vender na WEB!!!Preciso de um programador RockStar!

Page 5: Domain Driven Design com Python

Programador Contratado

Page 6: Domain Driven Design com Python

Skills do Programador

• Mindset Ágil

• Manja dos paranuê de Django e Python

• PHD em Design Patterns

• Extremamente profissional

Page 7: Domain Driven Design com Python

“Vamos lá garoto!" Preciso de solução de ecommerce revolucionária

Page 8: Domain Driven Design com Python

NÃO! Tá achando que fazer um ecommerce é que nem abrir uma das suas lojinhas num shopping?

Page 9: Domain Driven Design com Python

Pq não começamos apenas com um catálogo de produtos?

Page 10: Domain Driven Design com Python

2 semanas depois…

Page 11: Domain Driven Design com Python

Boa garoto! Você é fantástico

Page 12: Domain Driven Design com Python

Vamos ver se você é bom mesmo! Agora quero que meu cliente feche a

compra direto pelo site

Page 13: Domain Driven Design com Python

Claro! Ta duvidando de mim? Vai ficar melhor que o da Amazon

Preciso apenas de 1 mes

Page 14: Domain Driven Design com Python

3 meses depois

Page 15: Domain Driven Design com Python

Cadê a compra?

Page 16: Domain Driven Design com Python

Preciso integrar com o meu sistema de estoque

Meus Deus! Tudo bem. Mas vou precisar de mais programadores

Page 17: Domain Driven Design com Python

Pleno Pleno Estagiário

Page 18: Domain Driven Design com Python

6 meses depois…

As coisas continuam acumulando

Page 19: Domain Driven Design com Python

Preciso de sistema de Pagamento

Online e Integração com o

SAP

Page 20: Domain Driven Design com Python

X

Page 21: Domain Driven Design com Python

Qual foi o erro?

Page 22: Domain Driven Design com Python

0

4.5

9

13.5

18

Janeiro Março Jun Setembro

Lead time

Page 23: Domain Driven Design com Python

CATALOGO SISTEMA

CLIENTE DEV

Page 24: Domain Driven Design com Python

CATALOGO

SISTEMA

COMPRA

CLIENTE DEV

Page 25: Domain Driven Design com Python

0

1.25

2.5

3.75

5

Janeiro Março

Lead time

Page 26: Domain Driven Design com Python

CATALOGO

SISTEMA

COMPRA

ESTOQUE

CLIENTE DEV

Page 27: Domain Driven Design com Python

0

2.5

5

7.5

10

Janeiro Março Jun

Lead time

Page 28: Domain Driven Design com Python

CATALOGO

SISTEMACOMPRA

ESTOQUE

PAGAMENTO

SAP

CLIENTE DEV

Page 29: Domain Driven Design com Python

0

4.5

9

13.5

18

Janeiro Março Jun Setembro

Lead time

Page 30: Domain Driven Design com Python

"Software Monolítico é o problema!!!"

SERÁ?

Page 31: Domain Driven Design com Python

http://wrd.cm/1UV07Xo

Google Is 2 Billion Lines of Code And It’s All in One Place

Page 32: Domain Driven Design com Python

Monolítico

Page 33: Domain Driven Design com Python

Monolítico Microservices

Page 34: Domain Driven Design com Python

TECNOLOGIANEGÓCIO GAP

Page 35: Domain Driven Design com Python

–Melvin Conway’s Law - 1968

“Organizations which design systems are constrained to produce designs which are

copies of the communication structures of these organizations.”

Page 36: Domain Driven Design com Python

NEGÓCIO TECNOLOGIA

ESSA PALESTRA

Page 37: Domain Driven Design com Python

Como resolvemos isso?

Page 38: Domain Driven Design com Python

–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.”

Page 39: Domain Driven Design com Python

DomainSubdomains

Bounded ContextsUbiquitous Language

Page 40: Domain Driven Design com Python

Domain

• Define o que a empresa faz

• É o motivo do seu software existir

• Faz parte do “Problem Space”

• Composto de vários Subdomains

Page 41: Domain Driven Design com Python

Domain & Subdomains

Estoque

Contabilidade

Catalogo

Compras

Pagamento

Page 42: Domain Driven Design com Python

Ubiquitous Language

Page 43: Domain Driven Design com Python

OBRA

OBRA

Page 44: Domain Driven Design com Python

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”

Page 45: Domain Driven Design com Python

Ao invés disso Nós fazemos isso

Page 46: Domain Driven Design com Python

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

Page 47: Domain Driven Design com Python

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

Page 48: Domain Driven Design com Python

Subdomains x Bounded Contexts

Estoque

Contabilidade

Catalogo

Compras

Pagamento

Page 49: Domain Driven Design com Python

Subdomains x Bounded Contexts

Estoque

Contabilidade

Catalogo

Compras

Pagamento

Page 50: Domain Driven Design com Python

Subdomains x Bounded Contexts

Estoque

Contabilidade

Catalogo

Compras

Pagamento

Page 51: Domain Driven Design com Python

Podem existir Bounded Contexts não focados no negócio?

Estoque

Contabilidade

Catalogo

Compras

Pagamento

Authentication

Core

SuporteGenérico

Page 52: Domain Driven Design com Python

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

Page 53: Domain Driven Design com Python

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"

Page 54: Domain Driven Design com Python

“O domínio muda o tempo todo. O seu Bounded Context precisa acompanhar essas mudanças”

Page 55: Domain Driven Design com Python

– 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”

Page 56: Domain Driven Design com Python

Context MapsProtegendo seu domínio de influencias externas

Page 57: Domain Driven Design com Python

Compras

Estoque

Up

Down

ACL

ANTICORRUPTION LAYER

Page 58: Domain Driven Design com Python

ProdutoProduto

EstoqueCompras

Estoque não deve conhecer a classe Produto que vem do Bounded de Context Compras!!!

Page 59: Domain Driven Design com Python

ProdutoProduto

EstoqueCompras

ACL

Page 60: Domain Driven Design com Python
Page 61: Domain Driven Design com Python

Entity & Value ObjectsO coração do coração

Page 62: Domain Driven Design com Python

Muitos atributos!!

Método para nome do clienteMétodo para endereço

Verbosidade

Page 63: Domain Driven Design com Python

Value Object

Value Object

Nomes mais curtos

Page 64: Domain Driven Design com Python

Value Objects são imutáveis!

Validação:Ex: Final deve ser maior que Inicial

Page 65: Domain Driven Design com Python

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"

Page 66: Domain Driven Design com Python

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

Page 67: Domain Driven Design com Python

FactoriesQuando criar um objeto virou uma tarefa para Hércules

Page 68: Domain Driven Design com Python

{

Page 69: Domain Driven Design com Python
Page 70: Domain Driven Design com Python

Dicas para Factories

• Usado para criar objetos complexos

• Pode acessar repositórios ou serviços

• Pode ser uma Factory Class ou um Factory Method

Page 71: Domain Driven Design com Python

Domain Services

Page 72: Domain Driven Design com Python

Regra de calculo de frete interage com vários objetos

Page 73: Domain Driven Design com Python

Lembre das exceções!

Page 74: Domain Driven Design com Python

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

Page 75: Domain Driven Design com Python

RepositoryPq não me interessa onde estão os dados

Page 76: Domain Driven Design com Python
Page 77: Domain Driven Design com Python

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

Page 78: Domain Driven Design com Python

Domain Event“Acontecimentos" empresariais

Page 79: Domain Driven Design com Python
Page 80: Domain Driven Design com Python
Page 81: Domain Driven Design com Python
Page 82: Domain Driven Design com Python
Page 83: Domain Driven Design com Python

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

Page 84: Domain Driven Design com Python

O maior risco de Domain Events

Page 85: Domain Driven Design com Python

Diversos patterns

Python Puro!

Nenhuma dependência de frameworks

Page 86: Domain Driven Design com Python

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

Page 87: Domain Driven Design com Python

Ciclo

Failing Test Make the test pass

Refactor

TDD

Failing Feature

Make the Feature pass

BDD

DDD

Domain Learning

Page 88: Domain Driven Design com Python

CORE

Entities e Value Objects

Factories, Services, Repository, Events, ACL

Django, Flask

Nunca é 100%!!!

Arquitetura Hexagonal

Page 89: Domain Driven Design com Python

Trabalho num legadão!! DDD é impossível pra mim!!

Page 90: Domain Driven Design com Python
Page 91: Domain Driven Design com Python
Page 92: Domain Driven Design com Python

Vai valer à pena!

Page 93: Domain Driven Design com Python

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

Page 94: Domain Driven Design com Python

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

Page 95: Domain Driven Design com Python

DDD

• Colaboração!!

• Um meio de aproximar negócio e tecnologia

• Ágil

• Mantém a ideia artesanal do desenvolvimento de software

Page 96: Domain Driven Design com Python
Page 97: Domain Driven Design com Python

DDD é um mindset!

Page 98: Domain Driven Design com Python

–Napoleon Hill

“Não devemos ter medo das novas ideias! Elas podem significar a diferença entre o

triunfo e o fracasso.”

Page 99: Domain Driven Design com Python

OBRIGADO!

@fredportocabral