Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Classes, DTOs, Records comuns entre dois projetos

Olá, pessoal

Estava tentando fazer um elo de entendimento entre os cursos Java e refatoração: melhorando códigos com boas práticas e Boas práticas de programação: melhore o código de uma API Java, quando surgiu uma dúvida: como um dado DTO implementado na API REST pode ser reaproveitado nos projetos consumidores?

No curso Java e refatoração: melhorando códigos com boas práticas foi exemplificado um projeto Adopet Console, que para funcionar consumia recursos implementados no api.jar, cujo projeto foi usado no segundo curso Boas práticas de programação: melhore o código de uma API Java.

Se pensarmos que, de um lado, no Adopet Console podemos ter o record PetDto para requisitar um cadastramento, e do outro, o Adopet API é a que realmente implementa o record PetDto para tratar as requisições.

Como resolveria essa situação, evitando redundancia de fontes?

Penso que não é conveniente ter record PetDto codificado em ambos projetos, isto é, a implementação abaixo é de longe uma má prática:

// Record em Adopet Console
package br.com.alura.adopet.console.dto;

...

public record PetDto (

    @Enumerated(EnumType.STRING)
    @NotNull
    TipoPet tipo,

    @NotBlank
    String nome,

    @NotBlank
    String raca,

    @NotNull
    Integer idade,

    @NotBlank
    String cor,

    @NotNull
    Float peso) {}
    
// Record em Adopet Api
package br.com.alura.adopet.api.dto;

...

public record PetDto (

    @Enumerated(EnumType.STRING)
    @NotNull
    TipoPet tipo,

    @NotBlank
    String nome,

    @NotBlank
    String raca,

    @NotNull
    Integer idade,

    @NotBlank
    String cor,

    @NotNull
    Float peso) {}
    
1 resposta
solução!

Oi! Como vai?

Com o que você descreveu, faz bastante sentido pensar em evitar duplicação de PetDto nos dois projetos. Uma alternativa é centralizar esse tipo de classe em um módulo compartilhado (um jar comum, por exemplo) que tanto a API quanto o console possam importar, garantindo consistência e reduzindo redundância.

Uma dica interessante para o futuro é criar um módulo separado só para DTOs ou contratos de comunicação. Veja este exemplo:


// Projeto: adopet-dto
package br.com.alura.adopet.dto;

public record PetDto(String nome, String raca) {}

Esse módulo pode ser usado por diferentes aplicações Java, mantendo apenas uma fonte de verdade para o DTO. O código acima define um record simples com nome e raca, que poderia ser reutilizado em múltiplos projetos.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!