68
Globalcode – Open4education Como Domain Driven Design e Strategic Design estão nos ajudando a modernizar um legado Luiz Costa [email protected] / @gutomcosta

Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Embed Size (px)

Citation preview

Page 1: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

Contexto

Page 4: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

Era só uma "Fila"…

Page 7: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

E hoje em dia até envia email

Page 8: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

+ 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

Depois de algum tempo em produção….

Page 10: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

•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

Aplicação Web tradicional algo assim

Page 12: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Page 13: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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
Page 15: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

WTF?

Page 16: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

• 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

Como melhorar este projeto?

Page 18: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Domain Driven Design

Page 19: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Domain Model

http://martinfowler.com/eaaCatalog/domainModel.html

Page 20: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

the blue and the red book

Page 21: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

ENTITIES REPOSITORIES VALUE OBJECTS

FACTORIES SERVICES

Building Blocks

Page 22: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

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

Big Domain Model?

Page 26: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

Como dividir o domínio?

Page 29: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Bounded Context

Page 30: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

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

Repensando as Fronteiras

Page 34: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Page 35: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Contexto A Contexto B Contexto C

Page 36: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Page 37: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Mesma entidade modelada em vários contextos

Page 38: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

Anatomia de um Bounded Context

Page 41: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

Application Layer

Domain Layer

Atendimento.Fila

Infrastructure Layer

Page 43: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

Foco total no Domain ModelDomain Model != Model

Page 45: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

Nossa estratégia para dominar o legado

Page 47: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Strangler Applicationwww.martinfowler.com/bliki/StranglerApplication.html

Page 48: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

…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

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

O design deve permitir atrasar decisões

Page 51: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

Identificar e evidenciar as fronteiras através de Libs

Page 52: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

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

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

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

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

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

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

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

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

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

Resumo da nossa estratégia

Page 64: Como DDD e Strategic Design estão nos ajudando a modernizar um Legado

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

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

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

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

Obrigado!