como ddd e strategic design estão nos ajudando a modernizar um legado
TRANSCRIPT
![Page 1: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/1.jpg)
Globalcode–Open4education
Como Domain Driven Design e Strategic Designestão nos ajudando a modernizar um legado
Luiz [email protected] / @gutomcosta
![Page 2: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/2.jpg)
twitter.com/gutomcosta github.com/gutomcosta
www.sagadoprogramador.com.br medium.com/saga-do-programador
![Page 3: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/3.jpg)
Contexto
![Page 4: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/4.jpg)
Sistema para um empresa de medicina do trabalho realizar atendimentos de medicina ocupacional por
todo o Brasil e fornecer uma análise inteligente sobre o perfil dos colaboradores de uma empresa.
![Page 5: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/5.jpg)
Mas como todo projeto, no início, tudo é muito
simples…
![Page 6: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/6.jpg)
Era só uma "Fila"…
![Page 7: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/7.jpg)
E hoje em dia até envia email
![Page 8: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/8.jpg)
+ de 5 anos de projeto + 10 desenvolvedores passaram no time
Python e Django 1.4 < 50% test coverage
14 servidores = 1 para cada clínica aberta
![Page 9: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/9.jpg)
Depois de algum tempo em produção….
![Page 10: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/10.jpg)
•bugs e mais bugs •altera uma parte, quebra outra •bug em uma parte, sistema fora do ar •demora nas entregas •pressão do cliente para entregar mais
os problemas começaram…
![Page 11: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/11.jpg)
Aplicação Web tradicional algo assim
![Page 12: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/12.jpg)
![Page 13: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/13.jpg)
Isso não é uma service layer, é algo parecido com um TransactionScript
models sendo um espelho do banco de
dados
![Page 14: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/14.jpg)
![Page 15: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/15.jpg)
WTF?
![Page 16: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/16.jpg)
• lógica de domínio espalhada em Controllers, Models e Services
• models espelhando exatamente o modelo de dados
• foco no framework e não no domínio do problema
![Page 17: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/17.jpg)
Como melhorar este projeto?
![Page 18: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/18.jpg)
Domain Driven Design
![Page 19: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/19.jpg)
Domain Model
http://martinfowler.com/eaaCatalog/domainModel.html
![Page 20: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/20.jpg)
the blue and the red book
![Page 21: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/21.jpg)
ENTITIES REPOSITORIES VALUE OBJECTS
FACTORIES SERVICES
Building Blocks
![Page 22: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/22.jpg)
Strategic Design…modeling and design decisions that apply to large parts of the system. Such decisions affect the entire project and have to be decided at team level.
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 335Eric Evans - Blue Book
![Page 23: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/23.jpg)
Strategic Design…modeling and design decisions that apply to large parts of the system. Such decisions affect the entire project and have to be decided at team level.
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 335 Eric Evans - Blue Book
![Page 24: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/24.jpg)
BOUNDED CONTEXT CONTEXT MAP
ANTI-CURRUPTION LAYER SHARED KERNEL
OPEN HOST SERVICE PUBLISHED LANGUAGE
…
Existe vida além parte 1 do livro azul
![Page 25: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/25.jpg)
Big Domain Model?
![Page 26: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/26.jpg)
Not all of a large system will be well designed.
Eric Evans on Strategic Design presentationshttps://www.infoq.com/presentations/strategic-design-evans
![Page 27: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/27.jpg)
Total unification of the domain model for a large system will not feasible or cost-effective
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 332 Eric Evans - Blue Book
![Page 28: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/28.jpg)
Como dividir o domínio?
![Page 29: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/29.jpg)
Bounded Context
![Page 30: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/30.jpg)
Bounded Context…delimits the applicability of a particular model so that team members have a clear and shared understanding of what has to be consistent and how it relates to other contexts.
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 336 Eric Evans - Blue Book
![Page 31: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/31.jpg)
Bounded Context…delimits the applicability of a particular model so that team members have a clear and shared understanding of what has to be consistent and how it relates to other contexts.
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 336 Eric Evans - Blue Book
![Page 32: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/32.jpg)
Bounded Context…delimits the applicability of a particular model so that team members have a clear and shared understanding of what has to be consistent and how it relates to other contexts.
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 336 Eric Evans - Blue Book
![Page 33: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/33.jpg)
Repensando as Fronteiras
![Page 34: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/34.jpg)
![Page 35: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/35.jpg)
Contexto A Contexto B Contexto C
![Page 36: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/36.jpg)
![Page 37: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/37.jpg)
Mesma entidade modelada em vários contextos
![Page 38: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/38.jpg)
Paciente
Atendimento
+ qual nome, nascimento…? + qual dia do agendamento? + qual empresa pertence? + qual é a função que exerce?
Paciente
Gestor de Periódicos
+ qual é o proximo exame? + quantos dias faltam para vencer?
Paciente
Financeiro
+ qual custo dos exames feitos? + alguma condição de desconto?
É responsabilidade de cada contexto modelar os dados da me lh or m ane i ra , de a c o rd o c om a a s s u a s responsabilidades.
![Page 39: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/39.jpg)
Como implementamos? E o que micro-serviços tem com isso?
![Page 40: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/40.jpg)
Anatomia de um Bounded Context
![Page 41: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/41.jpg)
Bounded Context
Domain LayerApplication Layer
use case
use case
use case
Repository
Entity
Value Object
Infrastructure Layer
Entity
DAO
Logger
Service
Module
![Page 42: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/42.jpg)
Application Layer
Domain Layer
Atendimento.Fila
Infrastructure Layer
![Page 43: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/43.jpg)
Implementação de um Caso de Uso
o fluxo de execução é simples e limpo
todas as dependências são
declaradas o construtor
![Page 44: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/44.jpg)
Foco total no Domain ModelDomain Model != Model
![Page 45: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/45.jpg)
Todas as regras de negócio são programadas aqui. Normalmente são
objetos python puros, sem relação com persistência ou infra-estrutura
Expostas através de
casos de uso
![Page 46: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/46.jpg)
Nossa estratégia para dominar o legado
![Page 47: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/47.jpg)
Strangler Applicationwww.martinfowler.com/bliki/StranglerApplication.html
![Page 48: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/48.jpg)
…An alternative route is to gradually create a new system around the edges of the old, letting it grow slowly over several years until the old system is strangled.
www.martinfowler.com/bliki/StranglerApplication.html
![Page 49: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/49.jpg)
www.martinfowler.com/bliki/StranglerApplication.html
Legado
Nova Funcionalidade
Nova Funcionalidade
Nova Funcionalidade
![Page 50: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/50.jpg)
O design deve permitir atrasar decisões
![Page 51: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/51.jpg)
Identificar e evidenciar as fronteiras através de Libs
![Page 52: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/52.jpg)
Don’t distribute your objects.http://martinfowler.com/books/eaa.html
![Page 53: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/53.jpg)
O isolamento do legado se dá através de indireções nos objetos da fronteira. Nesta visão de alto nível, é possível ver como uma funcionalidade é anexada ao código do Legado. A ideia básica é o novo módulo definir um conjunto de interfaces/conectores para troca de informações.
Em uma abordagem de lib, estes conectores se materializam em um
conjunto de interfaces que devem ser implementadas pela Lib.
fronteira do sistema
Inicialmente, os novos contextos são projetos novos, que devem funcionar
como Libs. Deve ser possível extrair a lib para rodar em um runtime diferente
sem muitas dificuldades.
![Page 54: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/54.jpg)
O que fazer quando é preciso usar dados do
legado no módulo novo?
![Page 55: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/55.jpg)
Dependency Inversion Principle
https://en.wikipedia.org/wiki/Dependency_inversion_principle
![Page 56: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/56.jpg)
Um módulo ou contexto novo define um conjunto de interfaces que serão implementadas diretamente no legado.
interfaces definidas pelo módulo
o contexto “Atendimento” depende de dados que estão definidos no legado. Neste caso, o
módulo que necessita dos dados, define o contrato de comunicação e o legado
implementa este contrato, reutilizando objetos existentes ou escrevendo código novo. O importante é que a definição das
interfaces é feita de acordo com as intenções do módulo novo e não com os
detalhes do código legado
![Page 57: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/57.jpg)
O que fazer se o legado precisar de dados do
módulo novo?
![Page 58: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/58.jpg)
Publish/Subscribe ou Observers
https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern https://en.wikipedia.org/wiki/Observer_pattern
![Page 59: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/59.jpg)
A solução mais comum para este caso é o uso de eventos. O módulo publica um conjunto de eventos e o legado assina estes eventos.
no lado do Legado, dentro da ACL, são definido casos de uso que serão estimulados pelos
handlers de tratamento dos eventos.
o caso de uso PatientCheckin, durante sua execução, publica o eventos “PatientCheckedIn”. Este evento
contem os dados necessários para comunicação com o legado,
normalmente serializado em um JSON ou usando um Hash.
![Page 60: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/60.jpg)
Como juntar isso tudo e extrair um micro-serviço?
![Page 61: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/61.jpg)
Este exemplo, mostra com a arquitetura permite separar os componentes em runtimes diferentes, inclusive com banco de dados próprio.
aqui, a lib foi incluída em uma aplicação web e isolada através de uma Anti-Corruption Layer (ACL). A
vantagem de se usar uma ACL é o isolamento do código já criado. As alterações necessárias na lib são muito
pequenas e a própria ACL pode tratar os problemas de comunicação com o legado, logar, lançar exceções, etc.
do lado do legado, a própria api já funciona como uma ACL.
Normalmente esta api vai ser implementada com Http puro, usando formatos simples como
JSON para troca de dados
![Page 62: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/62.jpg)
Chamadas diretas na api do legado ou através de uma arquitetura event-driven.
Broker de mensagens, por exemplo: JMS, ActiveMQ , RabbitMQ , etc
conjunto de EventHandlers interessados nas mensagens
![Page 63: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/63.jpg)
Resumo da nossa estratégia
![Page 64: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/64.jpg)
1 - Reúna o time com algum especialista do domínio e
faça um desenho inicial dos Bounded Contexts
![Page 65: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/65.jpg)
2 - Evidencie as fronteiras inicialmente através
módulos no código fonte
![Page 66: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/66.jpg)
3 - Extraia os módulos que compõem um Bounded Context para uma lib
![Page 67: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/67.jpg)
4 - Se necessário, exponha a mesma lib como micro-
serviço
![Page 68: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado](https://reader033.vdocuments.site/reader033/viewer/2022052705/58f2eafc1a28ab16068b4631/html5/thumbnails/68.jpg)
Obrigado!