Olá Gabriel! Tudo bem?
Sua dúvida é bastante pertinente no contexto da Clean Architecture.
A ideia de mover a lógica de conversão de um DTO para a entidade diretamente dentro do DTO, como você sugeriu com o método converterParaUsuario()
, pode parecer conveniente, mas vamos analisar sob a perspectiva da Clean Architecture.
A Clean Architecture sugere uma separação clara entre as camadas da aplicação, mantendo especialmente a lógica de negócio e as regras da aplicação isoladas de frameworks e detalhes de infraestrutura, como a camada de apresentação onde os DTOs geralmente residem. O objetivo é garantir que o núcleo da aplicação (entidades e casos de uso) não seja influenciado por mudanças externas, como alterações em frameworks ou bancos de dados.
Ao colocar a lógica de conversão dentro do UsuarioDto
, você estaria, de certa forma, misturando responsabilidades que pertencem à camada de domínio (a criação de entidades) com a camada de infraestrutura/adaptação (DTOs). Isso pode levar a uma violação dos princípios da Clean Architecture, onde cada camada deve ter responsabilidades bem definidas e isoladas.
Uma abordagem mais alinhada com a Clean Architecture seria manter a lógica de conversão fora dos DTOs, possivelmente em um componente dedicado que poderia ser um conversor ou mesmo dentro dos casos de uso, onde você recebe o DTO, converte para a entidade e então prossegue com as operações de negócio. Isso mantém a camada de domínio pura e desacoplada de detalhes específicos de como os dados são recebidos ou enviados pela aplicação.
Exemplo:
public class UsuarioConversor {
public static Usuario converterDtoParaUsuario(UsuarioDto dto) {
return new Usuario(dto.cpf(), dto.nome(), dto.nascimento(), dto.email());
}
}
E no seu controller, você usaria esse conversor:
@PostMapping
public UsuarioDto cadastrarUsuario(@RequestBody UsuarioDto dto) {
Usuario usuario = UsuarioConversor.converterDtoParaUsuario(dto);
Usuario salvo = criarUsuario.cadastrarUsuario(usuario);
return new UsuarioDto(salvo.getCpf(), salvo.getNome(), salvo.getNascimento(), salvo.getEmail());
}
Dessa forma, você mantém a separação clara de responsabilidades e adere aos princípios da Clean Architecture.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.