Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Builder für DTOs #1214

Open
clean-coder opened this issue Nov 26, 2024 · 0 comments
Open

Builder für DTOs #1214

clean-coder opened this issue Nov 26, 2024 · 0 comments

Comments

@clean-coder
Copy link
Collaborator

clean-coder commented Nov 26, 2024

Eine technische Story: Builder für Java DTOs im Backend

Hintergrund
Ist aus der Story #1185 entstanden. Beim fixen der Tests ist aufgefallen, dass das Erstellen der DTOs mit vielen Parametern in den Tests mühsam und sehr unübersichtlich ist. Dies kann man mit Buildern verbessern.

Für die Model Klassen haben wir immer einen Builder. Dies ist sehr nützlich, wenn der Konstruktor für das Objekt viele Parameter hat. Mit dem Builder kann man das Objekt schrittweise aufbauen nur mit den Parametern (Daten), die man auch wirklich braucht. Bei den DTOs (sind als Record modelliert) haben wir das nicht. Es muss jeweils der Konstruktor mit allen Parametern verwendet werden.

Für die Klasse Completed ist das bereits umgesetzt. Da gibt es einen Builder, der bereits in den Tests verwendet wird.

(aus CompletedMapperTest.java)

mit Builder:

var completedDto = CompletedDtoBuilder.builder()
        .withId(COMPLETED_ID)
        .withComment(COMPLETED_COMMENT)
        .withObjectiveDto(ObjectiveDtoBuilder.builder()
                .withId(OBJECTIVE_ID)
        .build())
.build();

ohne Builder:

    private static final int NOT_USED_INT = 1;
    private static final long NOT_USED_LONG = 1L;
    private static final String NOT_USED_STRING = "not-used";
    private static final State NOT_USED_STATE = State.DRAFT;
    private static final boolean NOT_USED_BOOL = false;
    private static final LocalDateTime NOT_USED_DATE = LocalDateTime.now();


    public static CompletedDto createCompletedDto(long completedId, long objectiveId, String completedComment) {
        return new CompletedDto(completedId, createObjectiveDto(objectiveId), completedComment);
    }

    private static ObjectiveDto createObjectiveDto(long id) {
        return new ObjectiveDto(id,
                // ... and lots of unused values for the test
                NOT_USED_INT, NOT_USED_STRING, NOT_USED_LONG, NOT_USED_LONG, NOT_USED_STRING, NOT_USED_STRING,
                NOT_USED_STATE, NOT_USED_DATE, NOT_USED_DATE, NOT_USED_BOOL);
    }

AK

  • Liste aller DTOs im Backend machen und gerade in dieser Story dokumentieren
  • Für jedes DTO eine Builder implementieren analog CompletedDtoBuilder.java
  • Entscheiden bzw abklären, ob man die Builder direkt in die DTOs integrieren will (analog den Buildern in den Modell Klassen) oder als eigene Klassen wie beim CompletedDtoBuilder.java.
  • Die DTOs in den Test verwenden
  • Am Schluss sollen in den Tests nur mehr die Builder verwendet werden. Es sollten in den Tests keine Konstruktor Aufrufe (e.g. new CompletedDto(....) ) mehr vorhanden sein.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant