Walidacja value object i intefejs

0

Mam taki value object:

public final class TaskDescription {

    private final String text;

    private TaskDescription(String text) {
        this.text = text;
    }

    public static TaskDescription create(String text, DescriptionLengthValidator textLengthDescriptionLengthValidator) {

        var length= text.length();

        var result = textLengthDescriptionLengthValidator.isCorrect(length);

        if (result) {

            return new TaskDescription(text);
        }

        throw new IllegalArgumentException("Wrong text length: " + length);
    }

}

Czym według DDD jest ten DescriptionLengthValidator? Moim zdaniem to jest domain service. Kolejne pytanie, w jakim pakiecie powinienem trzymać ten intefejs i jego implementację? Czy ten intefejs to nie jest taki wewnętrzny port a jego implementacja wewnętrzny adapter?

0
Edelner napisał(a):

Kolejne pytanie, w jakim pakiecie powinienem trzymać ten intefejs i jego implementację?

Może jestem ślepy, ale nie widzę tu interfejsu

0

@KamilAdam:
Przecież napisałem, że ten DescriptionLengthValidator to interfejs.

1
Edelner napisał(a):

Czy ten intefejs to nie jest taki wewnętrzny port a jego implementacja wewnętrzny adapter?

Nie znam się na DDD, ale czy jesli implementacja DescriptionLengthValidator będzie czytać wartość do porównania z bazy danych lub zewnętrznego serwisu to będzie pełnoprawnym (zewnętrznym) adapter?

UPDATE
IMHO to zależy ile implementacji DescriptionLengthValidator będziesz mieć i jak często będą się one zmieniać. Bo jeśli jedyna implementacja DescriptionLengthValidator to będzie length -> length < 1000 to nawet robienie interfejsu będzie przeniżynierowaniem. Z drugiej strony jak length będzie zależeć od klienta, wersji systemu i fazy księżyca to robi się tu już skomplikowana logika/implementacja

0

Też się nie znam na DDD, ale tak na marginesie, to Value Objecty można teraz w javie pisać prosto za pomocą record

1

Cały twój problem wygląda dosyć sztucznie. Po co Ci ta walidacja długości? Czy nie jest tak że potrzebujesz jej tylko żeby nie zapisać zbyt długiego ciągu znaków do bazy?

W mojej opinii z punktu widzenia domeny prawie nigdy max długość nie ma znaczenia. Jeżeli masz typ TaskDescription to zakładam że może tam być dowolny niepusty napis i tyle.

Radzę zinline'ować kod walidatora do value-obiektu - jeżeli jest to faktycznie if (s != null && s.length > 0 && s.length < 100) lub wyrzucić to ograniczenie w ogóle z domeny do warstwy aplikacji jako validator na DTO/Command/czy co tam masz...

1

Może być Domain Service. Natomiast nawet z perspektywy DDD, nie mówiąc już o pragmatyzmie, ten problem jest irrelewantny. Nie robisz DDD po to, żeby robić DDD. Skup się na rozdzieleniu modelu od technikaliów i unikaniu anemicznych encji.

2

@Pinek: No tak średnio bym powiedział. Nie widze jakoś sensu żeby Pesel był recordem. Może być klasą z prywatnym konstruktorem i metodą fabryczną która zwraca Optional<Pesel>, albo jakimś sealed interface z implementacją ValidPesel i InvalidPesel.

1 użytkowników online, w tym zalogowanych: 0, gości: 1