Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Witajcie,

zastanawia mnie od dłuższego czasu jedna kwestia. Poznając DDD można zauważyć, że wiele nacisku jest dane na to by nie produkować "anemicznego modelu domeny", czyli modelu, w którym cały kod przeniesiony jest do klas usługowych, a encje są kontenerami na dane.

Logicznym więc jest, że w tym wypadku to Encje (i również Aggregate Roots) będą obiektami w których najwięcej się "dzieje". Problem pojawia się w momencie, gdy encja potrzebuje jakieś obiekty kolaborujące by sprawnie działać.

Z drugiej strony, wszelakie biblioteki typu ORM, dzięki którym utrwalamy encje wymagają np. bezargumentowego konstruktora. Jak wobec tego rozwiązać ten dylemat ? Co będzie lepszą praktyką ?

1. dostarczanie obiektów kolaborujących w konstruktorze
2. dostarczanie obiektów kolaborujących jako argument konkretnej metody
3. użycie wzorca strategi, gdzie dla danej metody encji, dostarczamy jakiś "black box", który posiada już wszystkie zależności

Jakie jest Wasze zdanie ?
Andrzej Chodor

Andrzej Chodor architekt IT,
programista

Temat: Encje w DDD

Hej,

Zadałeś świetne pytanie, którym powinny zajmować się wszystkie porządne wprowadzenia w DDD dla programistów. Odpowiedź (z punktu widzenia wciąż raczkującego w DDD, jestem strasznie ciekaw opinii wyjadaczy:) jest prosta: używaj takiej techniki, która jest dla Ciebie/Twojego zespołu najwygodniejsza. DDD raczej nie bardzo interesują tak przyziemne sprawy.

Mnie przekonuje dwójka (nazywana też techniką double-dispatch):
1. Dzięki niej na pierwszy rzut oka widać w kodzie zależności.
2. Jest najszybsza.
3. Idealnie współpracuje z ORMami.
4. Jest elegancka (choć o gustach przecież się nie dyskutuje).

Ustawianie powiązań w konstruktorze też wchodzi w grę, choć faktycznie wymaga pewnych akrobacji z ORMami. Jak dla mnie gra niewarta świeczki. Wzorzec strategii zarezerwowałbym dla problemów, dla których został wymyślony. Poza tym ani trochę nie ułatwia pracy z ORMami.
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Też skłaniam się ku rozwiązaniu numer 2. Natomiast co do przyziemności, to problem jest taki, że w internecie jest dużo materiałów teoretycznych, natomiast samego kodu albo jest mało, albo nie jest on w żaden sposób konkretnie opisany. Dlatego też dla programisty, który chciałby wykorzystać choćby w ograniczonym stopniu metodykę DDD w swoim kodzie (małe projekty) oznacza to błądzenie we mgle.

Kolejna kwestia która mnie zastanawia, a którą już podnosiłem tu na forum jest kwestia powiązań między obiektami. Jarek Żeliński sugeruje by posługiwać się atrybutami bezpośrednio, czyli załóżmy mamy Zawodnika i on ma atrybut (string) drużyna i na tej podstawie sobie może coś zrobić np. znaleźć tą drużynę w jakimś repozytorium etc(przynajmniej ja to tak zrozumiałem), natomiast w praktyce ciężko to widzę, bo w końcu co będzie jak nazwa drużyny się zmieni ? Chociaż patrząc z punktu widzenia świata rzeczywistego to wszelkie tego typu zmiany pociągają za sobą tak naprawdę stworzenie nowej encji z nowym atrybutem (vel np. zmiana nazwy firmy w urzędzie).

Dlatego też ciekaw jestem zdania innych - powiązania między obiektami - zwykły atrybut, czy klasyczna referencja ?
Adrian C.

Adrian C.
projektant/programis
ta

Temat: Encje w DDD

Wojciech Soczyński:
Z drugiej strony, wszelakie biblioteki typu ORM, dzięki którym utrwalamy
encje wymagają np. bezargumentowego konstruktora. Jak wobec tego rozwiązać > ten dylemat ? Co będzie lepszą praktyką ?

Osobiście nie miałbym oporów, przed tworzeniem publicznych konstruktorów. Są dwa sposoby na uzyskanie poprawnych encji: 1) fabryka, 2) repozytorium, jeśli ktoś świadomie tworzy instancję z konstruktora bezparametrowego, to jest już jego problem.
Co do serwisów współpracujących, publiczny seter dla serwisu, wstrzykiwany w momencie tworzenia, czyli fabryka lub wyciągania z repozytorium, jakiś handler, listener.
Wojciech Soczyński:
Kolejna kwestia która mnie zastanawia, a którą już podnosiłem tu na forum jest kwestia powiązań między obiektami. Jarek Żeliński sugeruje by posługiwać się atrybutami bezpośrednio, czyli załóżmy mamy Zawodnika i on ma atrybut (string) drużyna i na tej podstawie sobie może coś zrobić np. znaleźć tą drużynę w jakimś repozytorium etc(przynajmniej ja to tak zrozumiałem)....

W tym przypadku, to nie drużyna powinna być agregate root i zarządzać zawodnikami, tym samym w razie potrzeby serwować zawodników ?
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Co do zawodników i drużyn to problem jest wielowymiarowy. Ponieważ kreśląc szerszy obraz:

Jest klub sportowy, posiada kilka drużyn (młodzieżowa, rezerwy, pierwsza drużyna). Każda z tych drużyn ma swoje rozgrywki. Może się zdarzyć, że zawodnik będzie grał w tych trzech drużynach w ciągu jednego sezonu i teraz wchodząc głębiej - dla każdej drużyny możemy chcieć wyliczyć statystki różne i musimy uwzględnić tego zawodnika w każdym przypadku.

Z tego opisu wynika też, że drużyna nie może być aggregate root, posiadającym w sobie zawodników (oczywiście jeżeli przyjmiemy definicje, że AR w 100% enkapsuluje w sobie swoje encje i nie mamy do nich bezpośredniego dostępu)

Co do kwestii z fabryką i repozytorium - słuszne uwagi :)

konto usunięte

Temat: Encje w DDD

Siema,
zastanawiam się czy we dopuszczalne jest uzycie repozytorium w encji, (chodzi mi o metode setProfil)

[php]
class UserEntity
{
//jakies atrybuty

//jakies metody

/** @var ProfilEntity */
private $_oProfil;

public function addProfil(ProfilEntity $oProfilEntity)
{
$this->_oProfil = $oProfilEntity;
}

public functin getProfil()
{
if(!isset($this->_oProfil)
{
return $this->setProfil();
}
else
{
return $this->_oProfil;
}
}

private function setProfil()
{
$oProfilRepository = new ProfilRepository;

return $oProfilRepository->find();
}

}

class ProfilEntity
{
//jakies atrryburty i metody
}

[/php]

Czy powinienem odwoływac się do repozytorium z poziomu encji czy raczej przeslać obiekt (wykorzystujac metode addProfil). Jak wy robicie?
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Psikus Psajkus:
Siema,
zastanawiam się czy we dopuszczalne jest uzycie repozytorium w encji, (chodzi mi o metode setProfil)

[php]
class UserEntity
{
//jakies atrybuty

//jakies metody

/** @var ProfilEntity */
private $_oProfil;

public function addProfil(ProfilEntity $oProfilEntity)
{
$this->_oProfil = $oProfilEntity;
}

public functin getProfil()
{
if(!isset($this->_oProfil)
{
return $this->setProfil();
}
else
{
return $this->_oProfil;
}
}

private function setProfil()
{
$oProfilRepository = new ProfilRepository;

return $oProfilRepository->find();
}

}

class ProfilEntity
{
//jakies atrryburty i metody
}

[/php]

Czy powinienem odwoływac się do repozytorium z poziomu encji czy raczej przeslać obiekt (wykorzystujac metode addProfil). Jak wy robicie?

Ja tutaj osobiście widzę anemiczny model domeny i nie wiem jak się ustosunkować do wpisu w kontekście DDD.

konto usunięte

Temat: Encje w DDD

Witajcie,

zastanawia mnie [...] jest do klas usługowych, a encje są kontenerami na dane.

i tak właśnie powinno być ;)
Logicznym więc jest, że w tym wypadku to Encje (i również Aggregate Roots) będą obiektami w których najwięcej się "dzieje". Problem pojawia się w momencie, gdy encja potrzebuje jakieś obiekty kolaborujące by sprawnie działać.

Encja nie jest od tego, żeby realizować funkcjonalność biznesową.

Jakie jest Wasze zdanie ?

Obiekty domeny powinny mieć możliwość pobrania (na podstawie swojego ID) obiektów kolaborujących z fabryki / kontenera.
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Encje w DDD

Odpowiedź (z punktu widzenia wciąż raczkującego w DDD, jestem strasznie ciekaw opinii wyjadaczy:) jest prosta: używaj takiej techniki, która jest dla Ciebie/Twojego zespołu najwygodniejsza.

to jest moim zdaniem źródło wielu problemów z jakością oprogramowania, osobiście uważam, że należy używać techniki najlepiej pasującej do problemu a nie najwygodniejszej dla zespołu, bo jakie będą skutki tego samego twierdzenia gdy kowali wpuścimy do problemu z zepsutym zegarkiem?
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Encje w DDD

Też skłaniam się ku rozwiązaniu numer 2. Natomiast co do przyziemności, to problem jest taki, że w internecie jest dużo materiałów teoretycznych, natomiast samego kodu albo jest mało, albo nie jest on w żaden sposób konkretnie opisany. Dlatego też dla programisty, który chciałby wykorzystać choćby w ograniczonym stopniu metodykę DDD w swoim kodzie (małe projekty) oznacza to błądzenie we mgle.

moim zdaniem problem leży gdzie indziej, należy odróżniać projektowanie od implementacji, DDD to projektowanie a nie programowanie...
Kolejna kwestia która mnie zastanawia, a którą już podnosiłem tu na forum jest kwestia powiązań między obiektami. Jarek Żeliński sugeruje by posługiwać się atrybutami bezpośrednio, czyli załóżmy mamy Zawodnika i on ma atrybut (string) drużyna i na tej podstawie sobie może coś zrobić np. znaleźć tą drużynę w jakimś repozytorium etc(przynajmniej ja to tak zrozumiałem), natomiast w praktyce ciężko to widzę, bo w końcu co będzie jak nazwa drużyny się zmieni ? Chociaż patrząc z punktu widzenia świata rzeczywistego to wszelkie tego typu zmiany pociągają za sobą tak naprawdę stworzenie nowej encji z nowym atrybutem (vel np. zmiana nazwy firmy w urzędzie).\

udzieliłeś odpowiedzi na swoje pytanie w ostatnim zdaniu. Po drugie rezygnacja z asocjacji na rzecz atrybutów pozwala w dowolnym momencie rozłączyć kod na dwa niezależne. Jeżeli obiekty klasy Pracownik i obiekty klasy Projekt będą powiązane bezpośrednio (Pracownik zarządza projektem) nie będzie możliwe rozdzielenie modułu HR od Project, jeżeli identyfikacja danych kierownika projektu będzie się odbywała np. po jego PESELu to rozłączenie HR od Project jest "bezbolesne" podobnie jak integracja z innym cudzym modułem Sales gdzie Fakturę za Projekt wystawił Pracownik.

Patrząc przez pryzmat realizmu DDD: na prośbę "Podaj mi zielone piłeczki" podam właściwe piłeczki wybierając te zielone, a nie dlatego, że są "asocjowane z atrybutem kolor=zielony"
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Encje w DDD

Mam propozycję: uporządkujmy jakość rozmowy nie używając słowa encja w rozmowie o DDD bo tu mamy obiekty i klasy a nie encje...
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Encje w DDD

Obiekty domeny powinny mieć możliwość pobrania (na podstawie swojego ID) obiektów kolaborujących z fabryki / kontenera.

zwracam uwagę, że fabryka tworzy obiekty, repozytorium je przechowuje, a czym tu jest "kontener" bo chyba nie "kreatorem"? fabryka jest kreatorem, kontener raczej nie....
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Jakub Wojt:
Witajcie,

zastanawia mnie [...] jest do klas usługowych, a encje są kontenerami na dane.

i tak właśnie powinno być ;)
Logicznym więc jest, że w tym wypadku to Encje (i również Aggregate Roots) będą obiektami w których najwięcej się "dzieje". Problem pojawia się w momencie, gdy encja potrzebuje jakieś obiekty kolaborujące by sprawnie działać.

Encja nie jest od tego, żeby realizować funkcjonalność biznesową.

Jakie jest Wasze zdanie ?

Obiekty domeny powinny mieć możliwość pobrania (na podstawie swojego ID) obiektów kolaborujących z fabryki / kontenera.

Nie ma czegoś takiego jak "powinno być" jest wiele sposobów na rozwiązanie danego problemu. W przypadku DDD "encje" realizują funkcjonalność biznesową i na to się kładzie nacisk. Natomiast jeżeli w świecie obiektowym, jakiś obiekt jest tylko kontenerem na dane to jeżeli obracamy się w okolicach DDD to ja bym taki obiekt nazwał "DTO".
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Jarek Żeliński:
moim zdaniem problem leży gdzie indziej, należy odróżniać projektowanie od implementacji, DDD to projektowanie a nie programowanie...

Z dostępnych materiałów o DDD, z którymi się zapoznałem wynika, że projektowanie jest blisko powiązane z implementacją np "ubiquitous language" etc. Zresztą po co mi projekt, jeżeli nie będę mógł go przełożyć na kod ? Gdy zaprojektuje jakiś diagram klas to logiczne jest, że potem zaimplementuje te klasy w kodzie, jeżeli tak nie jest to jaki ma to sens ?
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Jarek Żeliński:
Mam propozycję: uporządkujmy jakość rozmowy nie używając słowa encja w rozmowie o DDD bo tu mamy obiekty i klasy a nie encje...

W moich wypowiedziach rozumiem Encję w kontekście DDD jako klasę w kodzie odpowiadającą Encji w modelu domeny, że temat dotyczy implementacji to uważam, że słowo to jest jak najbardziej na miejscu.Wojciech Soczyński edytował(a) ten post dnia 30.06.11 o godzinie 14:53
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Encje w DDD

Wojciech Soczyński:
Jarek Żeliński:
moim zdaniem problem leży gdzie indziej, należy odróżniać projektowanie od implementacji, DDD to projektowanie a nie programowanie...

Z dostępnych materiałów o DDD, z którymi się zapoznałem wynika, że projektowanie jest blisko powiązane z implementacją np "ubiquitous language" etc. Zresztą po co mi projekt, jeżeli nie będę mógł go przełożyć na kod ? Gdy zaprojektuje jakiś diagram klas to logiczne jest, że potem zaimplementuje te klasy w kodzie, jeżeli tak nie jest to jaki ma to sens ?

to miałem na myśli: analiza i projektowanie daje jako rezultat obiektowy model (wręcz symulację czyli DDD), ten jest "kodowany" przez programistów, którym pozostają "tylko" pozostałe aspekty takie jak wydajność czy bezpieczeństwo itp.. wspólnym językiem jest "opisanie rzeczywistości biznesowe językiem narzędzi obiektowych, wszystkich łączy obiektowy paradygmat".
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Encje w DDD

Wojciech Soczyński:
Jarek Żeliński:
Mam propozycję: uporządkujmy jakość rozmowy nie używając słowa encja w rozmowie o DDD bo tu mamy obiekty i klasy a nie encje...

W moich wypowiedziach rozumiem Encję w kontekście DDD jako klasę w kodzie odpowiadającą Encji w modelu domeny, że temat dotyczy implementacji to uważam, że słowo to jest jak najbardziej na miejscu.

uważam, że skoro słowo encja ma "konkretne znacznie" w modelu relacyjnym i na modelach ERD, to warto unikać innych jego znaczeń bo to prowadzi do nieporozumień, jeżeli umówimy się, że nie dotykamy implementacji utrwalania obiektów to znaczy, że pozostajemy na poziomie obiektowej abstrakcji jaką są obiektowe modele DDD, chyba, ze jawnie powiemy, ze mowa o wzorcu implementacyjnym. Model obiektowy to tylko obiekty, ich klasy i związki logiczne ... DDD nie ma tu moim zdaniem nic do rzeczy, DDD to raczej styl projektowania a nie nowy paradygmat...

spotykam słowo encja w tekstach o obiektowych metodach ale "zwalam" to własnie na rozciąganie tego znaczenia... (powiedział bym przeciążanie :)))
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Encje w DDD

Jarek Żeliński:
Wojciech Soczyński:
Jarek Żeliński:
Mam propozycję: uporządkujmy jakość rozmowy nie używając słowa encja w rozmowie o DDD bo tu mamy obiekty i klasy a nie encje...

W moich wypowiedziach rozumiem Encję w kontekście DDD jako klasę w kodzie odpowiadającą Encji w modelu domeny, że temat dotyczy implementacji to uważam, że słowo to jest jak najbardziej na miejscu.

uważam, że skoro słowo encja ma "konkretne znacznie" w modelu relacyjnym i na modelach ERD, to warto unikać innych jego znaczeń bo to prowadzi do nieporozumień, jeżeli umówimy się, że nie dotykamy implementacji utrwalania obiektów to znaczy, że pozostajemy na poziomie obiektowej abstrakcji jaką są obiektowe modele DDD, chyba, ze jawnie powiemy, ze mowa o wzorcu implementacyjnym. Model obiektowy to tylko obiekty, ich klasy i związki logiczne ... DDD nie ma tu moim zdaniem nic do rzeczy, DDD to raczej styl projektowania a nie nowy paradygmat...

spotykam słowo encja w tekstach o obiektowych metodach ale "zwalam" to własnie na rozciąganie tego znaczenia... (powiedział bym przeciążanie :)))

Tak też Evans bodajże stwierdził, że DDD to nic nowego, tylko zebrane i usystematyzowane pewne praktyki. W każdym razie jest to jakaś metodyka konkretna skoro ma swoją nazwę. Jaki więc termin proponujesz jako synonim słowa Encja, dla Encji w rozumieniu DDD ?

konto usunięte

Temat: Encje w DDD

Obiekty domeny powinny mieć możliwość pobrania (na podstawie swojego ID) obiektów kolaborujących z fabryki / kontenera.

zwracam uwagę, że fabryka tworzy obiekty, repozytorium je przechowuje,

Trochę inaczej na to patrzę.
Obiekt to stan + zachowanie.

Repozytorium przechowuje stany obiektów.

Fabryka 'owija' te stany (przynajmniej identyfikator i typ obiektu) w jakieś 'zachowanie' w wyniku czego powstaje obiekt i ten zostaje zwrócony do systemu; przynajmniej tak jej działanie rozumiem w kontekście tworzenia obiektów domeny / wzorca DDD.
a czym tu jest "kontener" bo chyba nie "kreatorem"? fabryka jest kreatorem, kontener raczej nie....

Kontener to coś co przechowuje obiekty. :)

Hm.. 'kontener' wycofuję, nie powinien się znaleźć na liście a przynajmniej nie w tym kontekście ;)

konto usunięte

Temat: Encje w DDD

Jakie jest Wasze zdanie ?

Obiekty domeny powinny mieć możliwość pobrania (na podstawie swojego ID) obiektów kolaborujących z fabryki / kontenera.

Nie ma czegoś takiego jak "powinno być" jest wiele sposobów na rozwiązanie danego problemu. W przypadku DDD "encje" realizują funkcjonalność biznesową i na to się kładzie nacisk.

DDD definiuje je trochę inaczej:
Entity: An object that is not defined by its attributes, but rather by a thread of continuity and its identity.

dalej
... domain objects should be defined purely to implement the business behaviour of the corresponding domain concept, rather than be defined by the requirements of a more specific technology framework

Do implementacji funkc. biznesowej używane są obiekty domeny.
Jeśli w entity jest implementowany 'biznes' to jest to pomieszanie odpowiedzialności.

Następna dyskusja:

Przykład DDD




Wyślij zaproszenie do