4. 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
6. "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
7. "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
9. - 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
12. 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);
}
}
13. Enriquecendo o Modelo
public class UserService {
...
public void changeEmail(UserId userId, String newEmail) {
User user = userRepository.findById(userId);
user.changeEmail(newEmail);
userRepository.save(user);
}
}
14. 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;
}
}
15. 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);
}
}
16. Primitive Obsession
public class User {
private Email email;
...
public void changeEmail(Email newEmail) {
this.email = newEmail;
}
}
19. 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/