Top Banner
Domain Driven Design com Python Frederico Cabral
99

Domain Driven Design com Python

Jan 10, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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