Walidacja value object i intefejs

Walidacja value object i intefejs
ED
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

Mam taki value object:

Kopiuj
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?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
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

ED
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

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

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
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

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2787
0

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

99xmarcin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2420
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...

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1909
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.

S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1092
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.