Porty i adaptery, a obiekty domenowe

0

Cześć,
ostatnio zacząłem myśleć bardziej portowo i adapterowo i doszedłem do pewnej sytuacji, mam swój obiekt domenowy - założmy Player - w tym samym pakiecie mam port do mojego DAO (tak aby moja domena była odcięta od jakiejś biblioteki/frameworku w którym stworzę dostęp do bazy), wtedy mam coś ala

interface PlayerDAO {
   Option<Player> findBy(PlayerId id);
}

No, ale to zmusza mnie do tego aby moja implementacja tego (czyli jakiś adapter) miała wiedzę o moim obiekcie domenowym Player (będzie publiczna, chyba że umieściłbym to w jednym pakiecie, ale wtedy gubi się całkowicie sens rozdzielania tego na port i adapter). Czy to jest dobre wyjście? W sensie czy u was też obiekty domenowe widziane są między domenami?

0

Z tego co ja się kiedyś nad tym zastanawiałem to na twoim miejscu bym umieścił implementacje DAO w tym samym pakiecie i tyle. IMHO Nie wszystko co teoretycznie jest łatwe / proste na papierze jest łatwe w implementacji. Z czystością domeny raczej chodzi o to aby mają klasę Player, nie była ona ubrusana adnotacjami np. JPA.

Edit:
Ewentualnie do zapisu do bazy używałbym dedykowanych klas np. PlayerDB które byłyby DTO bez żadnych metod biznesowych tak jak ma to miejsce w obiektach domenowych.

3

Adapter może mieć wiedzę o obiekcie domenowym. Istotne jest to, aby nie było na odwrót, tj. w domenie nie powinieneś mieć jakichś jsony, xmle albo Kafka Recordów. Taki kod jest testowalny bez zależności zewnętrznych i to jest clue.

Czasami przy małych projektach z Spring Data robi się mały skrót, tj. nie wprowadza się rozdzielenia encji domenowych od encji JPA. Po prostu interfejs ze Spring Data jest jednocześnie i portem i adapterem.

1

Dokładnie, infrastruktura zna domenę a nie odwrotnie :)

0

Tak, słyszałem że do małych domen, gdzie wystarczają w zasadzie metody Spring Data (praktycznie CRUD) nie ma po co już tego rozbijać.

Dobrze, czyli aby domena sama w sobie nie miała infrastruktury, natomiast infrastruktura może wiedzieć coś o domenie.
Jeszcze mam pytanie: jak testujecie takie porty? Na przykładzie DAO - InMemory z jakąś HashMapą? InMemory z jakąś H2? Albo np. jak podpinacie sobie Kafke? Jak takie coś testować prawidłowo?

1

Cały myk polega na tym, że przy takim designie możesz testować jednostkowo cała aplikacje, bez potrzeby czytania z plików, komunikacji po sieci. Dzięki temu masz super szybkie testy logiki biznesowej. Do tego trzeba kilka testów integracyjnych/akceptacyjnych z jakaś baza embedded albo testcontainers i gotowe.

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