SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
Enriquecendo um
Modelo de Domínio
Anêmico
Gabriela Mattos & Maniero
Integrando
negócio com
desenvolvimento
Legado
Legado
● Projeto em micro serviços com equipe multidisciplinar;
● Regras de negócio espalhadas pelo sistema;
● Código duplicado e sem padronização;
● Documentação de funcionamento do software
descontinuada ou inexistente.
Contexto
Application Service
Legado Controller
Spring Data Repository “Domain” (JPA Entity)
"Quanto mais comportamento você
encontrar nos serviços, maior a
probabilidade de você estar roubando
os benefícios de um modelo de domínio
[...]"
Martin Fowler
Modelo Anêmico
"O principal problema desse anti
padrão é que ele é contraditório a ideia
básica de Orientação a Objetos, que é a
combinação de dados e processos. [...]"
Martin Fowler
Modelo Anêmico
Evolução da
Arquitetura
- Centralizar as regras de
negócio na camada de
domínio;
- Definição de uma
arquitetura comum para o
time com introdução de
uma nova funcionalidade;
Evolução da Arquitetura
Definição dos
Padrões
Aproximação
com especialistas
de domínio
- Pessoas desenvolvedoras
participando das reuniões
de definição de negócio;
- Linguagem ubíqua;
Regras de
negócio no
modelo
Application Service
Legado Controller
Spring Data Repository “Domain” (JPA Entity)
Application Service
Evolução da arquitetura Controller
Spring Data Repository Domain / (JPA Entity)
Modelo anêmico
public class UserService {
...
public void changeEmail(UserId userId, String newEmail) {
if (!isValidEmail(newEmail)) {
throw new IllegalArgumentException("Invalid Email");
}
User user = userRepository.findById(userId);
user.setEmail(newEmail);
userRepository.save(user);
}
}
Enriquecendo o Modelo
public class UserService {
...
public void changeEmail(UserId userId, String newEmail) {
User user = userRepository.findById(userId);
user.changeEmail(newEmail);
userRepository.save(user);
}
}
Enriquecendo o Modelo
public class User {
private String email;
...
public void changeEmail(String newEmail) {
if (!isValidEmail(newEmail)) {
throw new IllegalArgumentException("Invalid Email");
}
this.email = newEmail;
}
}
Primitive Obsession
public class Email {
private final String email;
private Email(String email) {
this.email = email;
}
public static Email of(String email) {
if (!isValidEmail(email)) {
throw new IllegalArgumentException("Invalid Email");
}
return new Email(email);
}
}
Primitive Obsession
public class User {
private Email email;
...
public void changeEmail(Email newEmail) {
this.email = newEmail;
}
}
Pronto, agora só
refatorar né?
Não!
Fase de Refatoração
● Definição da pirâmide de testes
para garantir a refatoração segura:
○ Importância de Testes de
Componente;
Application Service
Controller
Spring Data Repository
Domain / JPA Entity
Banco de dados em
memória
Teste de Componente
Testing Strategies in a Microservice Architecture - Toby Clemson
https://martinfowler.com/articles/microservice-testing/
Application Service
Evolução da arquitetura Controller
Spring Data Repository Domain / (JPA Entity)
Application Service
Refatoração Controller
Spring Data Repository Domain / (JPA Entity)
Fase de Refatoração
● Criação de uma documentação
comum para o time, possibilitando
que a arquitetura continue
evoluindo;
Archunit
@ArchTest
public static ArchRule
classes_named_controller_should_be_in_a_controller_package =
classes()
.that().haveSimpleNameContaining("Controller")
.should().resideInAPackage("..controller..");
Exemplo
Resumindo...
Arquitetura
documentado via
código com
ArchUnit
Cliente passou a
fazer questão de
ter pessoas
desenvolvedoras
durante a análise
de features
Onboarding
simplificado
Regras de negócio
centralizadas em
um único lugar
Codebase
padronizado
Produtividade
Gabriela Mattos - @gabrielavmattos
Carlos Maniero - @carlosmaniero
Obrigada!

Mais conteúdo relacionado

Semelhante a Enriquecendo um Modelo de Domínio Anêmico

Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Transição - Orientação a objeto para Funcional
Transição - Orientação a objeto para FuncionalTransição - Orientação a objeto para Funcional
Transição - Orientação a objeto para FuncionalIsmael Velten
 
Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Paulo Victor Gomes
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosHenrique Gogó
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Rafael Sales Pavarina
 
Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Danilo Pereira De Luca
 
Planode Aula
Planode AulaPlanode Aula
Planode Aulasofteam
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dadosSérgio Souza Costa
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Escrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamentoEscrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamentoAndré Ricardo Barreto de Oliveira
 

Semelhante a Enriquecendo um Modelo de Domínio Anêmico (20)

Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Aula1
Aula1Aula1
Aula1
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Transição - Orientação a objeto para Funcional
Transição - Orientação a objeto para FuncionalTransição - Orientação a objeto para Funcional
Transição - Orientação a objeto para Funcional
 
Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018
 
Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days
 
Planode Aula
Planode AulaPlanode Aula
Planode Aula
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dados
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Escrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamentoEscrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamento
 

Mais de ThoughtWorks Brasil

[XConf Brasil 2020] Alinhando times em uma cultura DevOps
[XConf Brasil 2020] Alinhando times em uma cultura DevOps[XConf Brasil 2020] Alinhando times em uma cultura DevOps
[XConf Brasil 2020] Alinhando times em uma cultura DevOpsThoughtWorks Brasil
 
[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...
[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...
[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...ThoughtWorks Brasil
 
[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorks
[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorks[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorks
[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorksThoughtWorks Brasil
 
[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...
[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...
[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...ThoughtWorks Brasil
 
[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do app
[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do app[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do app
[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do appThoughtWorks Brasil
 
[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...
[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...
[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...ThoughtWorks Brasil
 
[XConf Brasil 2020] Redefining confidence: cognitive biases in development life
[XConf Brasil 2020] Redefining confidence: cognitive biases in development life[XConf Brasil 2020] Redefining confidence: cognitive biases in development life
[XConf Brasil 2020] Redefining confidence: cognitive biases in development lifeThoughtWorks Brasil
 
[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?
[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?
[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?ThoughtWorks Brasil
 
[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da Ásia
[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da Ásia[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da Ásia
[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da ÁsiaThoughtWorks Brasil
 
Quebrando silos por meio de uma cultura de produto
Quebrando silos por meio de uma cultura de produtoQuebrando silos por meio de uma cultura de produto
Quebrando silos por meio de uma cultura de produtoThoughtWorks Brasil
 
Desenvolvimento para Big-Screen - fragmentação = entropia infinita?
Desenvolvimento para Big-Screen - fragmentação = entropia infinita?Desenvolvimento para Big-Screen - fragmentação = entropia infinita?
Desenvolvimento para Big-Screen - fragmentação = entropia infinita?ThoughtWorks Brasil
 
DevOps e Plataformas Digitais de A a Z
DevOps e Plataformas Digitais de A a ZDevOps e Plataformas Digitais de A a Z
DevOps e Plataformas Digitais de A a ZThoughtWorks Brasil
 
Mundo Mobile: o que temos usado e o que vem por aí
Mundo Mobile: o que temos usado e o que vem por aíMundo Mobile: o que temos usado e o que vem por aí
Mundo Mobile: o que temos usado e o que vem por aíThoughtWorks Brasil
 
Integração entre design e tecnologia
Integração entre design e tecnologiaIntegração entre design e tecnologia
Integração entre design e tecnologiaThoughtWorks Brasil
 
Princípios de Arquitetura Evolutiva
Princípios de Arquitetura EvolutivaPrincípios de Arquitetura Evolutiva
Princípios de Arquitetura EvolutivaThoughtWorks Brasil
 
Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...
Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...
Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...ThoughtWorks Brasil
 
Padrão de estrangulamento na prática – A jornada de modernização de um legado...
Padrão de estrangulamento na prática – A jornada de modernização de um legado...Padrão de estrangulamento na prática – A jornada de modernização de um legado...
Padrão de estrangulamento na prática – A jornada de modernização de um legado...ThoughtWorks Brasil
 
Entrega Contínua aplicada a Machine Learning
Entrega Contínua aplicada a Machine LearningEntrega Contínua aplicada a Machine Learning
Entrega Contínua aplicada a Machine LearningThoughtWorks Brasil
 

Mais de ThoughtWorks Brasil (20)

[XConf Brasil 2020] Alinhando times em uma cultura DevOps
[XConf Brasil 2020] Alinhando times em uma cultura DevOps[XConf Brasil 2020] Alinhando times em uma cultura DevOps
[XConf Brasil 2020] Alinhando times em uma cultura DevOps
 
[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...
[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...
[XConf Brasil 2020] Ei, Tech Lead! Não se esqueça que você é LEAD...
 
[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorks
[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorks[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorks
[XConf Brasil 2020] Linguagens no Technology Radar da ThoughtWorks
 
[XConf Brasil 2020] Data mesh
[XConf Brasil 2020] Data mesh[XConf Brasil 2020] Data mesh
[XConf Brasil 2020] Data mesh
 
[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...
[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...
[XConf Brasil 2020] Abalos sísmicos e negócios digitais modernos: a visão da ...
 
[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do app
[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do app[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do app
[XConf Brasil 2020] Ajudando a Natura a escalar usando modularização do app
 
[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...
[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...
[XConf Brasil 2020] Modelo do queijo suíço: engajando todo o time na estratég...
 
[XConf Brasil 2020] Redefining confidence: cognitive biases in development life
[XConf Brasil 2020] Redefining confidence: cognitive biases in development life[XConf Brasil 2020] Redefining confidence: cognitive biases in development life
[XConf Brasil 2020] Redefining confidence: cognitive biases in development life
 
[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?
[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?
[XConf Brasil 2020] De volta ao front-end: o futuro já chegou?
 
[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da Ásia
[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da Ásia[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da Ásia
[XConf Brasil 2020] Escalando uma das principais startups de Insurtech da Ásia
 
Pessoas > Linguagens
Pessoas > LinguagensPessoas > Linguagens
Pessoas > Linguagens
 
Quebrando silos por meio de uma cultura de produto
Quebrando silos por meio de uma cultura de produtoQuebrando silos por meio de uma cultura de produto
Quebrando silos por meio de uma cultura de produto
 
Desenvolvimento para Big-Screen - fragmentação = entropia infinita?
Desenvolvimento para Big-Screen - fragmentação = entropia infinita?Desenvolvimento para Big-Screen - fragmentação = entropia infinita?
Desenvolvimento para Big-Screen - fragmentação = entropia infinita?
 
DevOps e Plataformas Digitais de A a Z
DevOps e Plataformas Digitais de A a ZDevOps e Plataformas Digitais de A a Z
DevOps e Plataformas Digitais de A a Z
 
Mundo Mobile: o que temos usado e o que vem por aí
Mundo Mobile: o que temos usado e o que vem por aíMundo Mobile: o que temos usado e o que vem por aí
Mundo Mobile: o que temos usado e o que vem por aí
 
Integração entre design e tecnologia
Integração entre design e tecnologiaIntegração entre design e tecnologia
Integração entre design e tecnologia
 
Princípios de Arquitetura Evolutiva
Princípios de Arquitetura EvolutivaPrincípios de Arquitetura Evolutiva
Princípios de Arquitetura Evolutiva
 
Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...
Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...
Como a colaboração entre artistas e engenheiros fomenta a pesquisa de tecnolo...
 
Padrão de estrangulamento na prática – A jornada de modernização de um legado...
Padrão de estrangulamento na prática – A jornada de modernização de um legado...Padrão de estrangulamento na prática – A jornada de modernização de um legado...
Padrão de estrangulamento na prática – A jornada de modernização de um legado...
 
Entrega Contínua aplicada a Machine Learning
Entrega Contínua aplicada a Machine LearningEntrega Contínua aplicada a Machine Learning
Entrega Contínua aplicada a Machine Learning
 

Enriquecendo um Modelo de Domínio Anêmico