<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	
	>
<channel>
	<title>
	Komentarze do: Anemic Domain Model vs Rich Domain Model &#8211; Co to❔❓	</title>
	<atom:link href="https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/</link>
	<description>Bartosz Dąbek</description>
	<lastBuildDate>Sun, 10 Sep 2023 16:09:25 +0000</lastBuildDate>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>
		Autor: Domino		</title>
		<link>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comment-170</link>

		<dc:creator><![CDATA[Domino]]></dc:creator>
		<pubDate>Sun, 10 Sep 2023 16:09:25 +0000</pubDate>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1033#comment-170</guid>

					<description><![CDATA[Bardzo fajny artukuł, dzieki! Szkoda tylko, że RDM jest tak bagatelizowany, programuje od kilku lat i w każdym projekcie sytuacja była podobna, klasa posiada pola, gettery i settery a logika biznesowa roproszona  po różnych klasach typu service, helper itd.]]></description>
			<content:encoded><![CDATA[<p>Bardzo fajny artukuł, dzieki! Szkoda tylko, że RDM jest tak bagatelizowany, programuje od kilku lat i w każdym projekcie sytuacja była podobna, klasa posiada pola, gettery i settery a logika biznesowa roproszona  po różnych klasach typu service, helper itd.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		Autor: Bartosz Dąbek		</title>
		<link>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comment-143</link>

		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Tue, 30 Nov 2021 09:30:06 +0000</pubDate>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1033#comment-143</guid>

					<description><![CDATA[W odpowiedzi do &lt;a href=&quot;https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comment-142&quot;&gt;Mati cwaniak&lt;/a&gt;.

Niestety, ale z biegiem czasu co raz bardziej się przekonuję, że jest tak jak piszesz. Oczywiście zmiany zaczynają się od nas - więc jak chcemy coś zmienić to musimy wychodzić z inicjatywą. Pytanie tylko czy warto.]]></description>
			<content:encoded><![CDATA[<p>Niestety, ale z biegiem czasu co raz bardziej się przekonuję, że jest tak jak piszesz. Oczywiście zmiany zaczynają się od nas &#8211; więc jak chcemy coś zmienić to musimy wychodzić z inicjatywą. Pytanie tylko czy warto.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		Autor: Mati cwaniak		</title>
		<link>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comment-142</link>

		<dc:creator><![CDATA[Mati cwaniak]]></dc:creator>
		<pubDate>Tue, 30 Nov 2021 09:17:12 +0000</pubDate>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1033#comment-142</guid>

					<description><![CDATA[Cześć,
Rich Domain Model to czyste zło! Po pierwsze w RDM metody, które operują na danym obiekcie znajdują się wewnątrz tego obiektu. Powoduje to, że juniorom, bądź nowym członkom projektu łatwiej znaleźć zaimplementowane już funkcje (ponieważ są zdefiniowane w jednym miejscu). Jest to bardzo niekorzystne zjawisko, ponieważ&#160;wiadomo, że nowi programiści powinni najpierw przeiterować po całej warstwie serwisów (w większych projektach są to nawet setki klas) żeby sprawdzić, czy funkcjonalność, której akurat potrzeba nie została już zaimplementowana wcześniej. Najczęściej jednak źli programiści, nie wiedzieć czemu (może dziwnie implementować 1 mały ficzer przez tydzień?), nie chcą ogarnąć kodu całej aplikacji, żeby zrobić zmianę w jednym miejscu i duplikują zaimplementowane już zachowania tworząc je np. w nowych serwisach. To powoduje, że serwisów jest jeszcze więcej i iteracja po nich jest coraz trudniejsza i… you see where it goes. Także, ADM powoduje, że kod staje się trudniejszy w utrzymaniu, bardziej skomplikowany i próg wejścia w projekt staje się bardzo wysoki. To dobrze, bo to gwarantuje developerowi/developerom odpowiedzialnym za powstały bajzel pozycję w firmie (przecież nie zwolnimy jedynej osoby, która potrafi ogarnąć swój bajzel). Dzięki temu można potem negocjować wyższe stawki itp. Niestety taki stan rzeczy nie może trwać w nieskończoność. Zabawa kończy się kiedy stan obiektów na których pracujemy wpada w nieprzewidziany stan, bo coś, gdzieś, w pewnym momencie je modyfikuje i już nawet sam autor tego monumentu spaghetti nie wie gdzie leży tego przyczyna (na pewno nie w braku hermetyzacji). Wtedy oczywiście trzeba zwalić winę na wszystko inne, tylko nie na złą architekturę, a już na samym końcu, gdy implementacja czegokolwiek i utrzymanie projektu jest porównywalne tylko z wojną w Wietnamie, można najzwyczajniej zmienić pracę.
Powyższy wpis niestety, choć podkolorowany i przejaskrawiony, jest inspirowany rzeczywistością. Na studiach nauczyłem się czym jest OOP, czym różni się od programowania strukturalnego i dlaczego to drugie zostało ostatecznie wyparte przez obiektowość. W pracy jednak trafiłem na gości, dla których jedynym słusznym sposobem na projektowanie jest Anemic Domain Model. Zwracanie uwagi na problemy jakie się za tym ciągną nie dało nic. ADM broniony był przez autorytet seniorów, z których jeden się zwolnił, a drugi trafił do innego projektu. Ich dzieło było jeszcze chwile utrzymywane przez parę innych osób po czym ostatecznie projekt upadł. 
No cóż, dużo mnie to nauczyło. Wystarczy dostarczyć kod, który działa (do pewnego czasu), a jego jakość nie ma znaczenia. Ważne, by być pewnym siebie i dobrze sprzedawać managementowi swoje genialne, potwierdzone doświadczeniem pomysły. 
Kiedyś uważałem, że trzeba mieć wiedze, żeby być seniorem, teraz uważam, że seniorem się jest po to, żeby tej wiedzy nie musieć posiadać :( 
[Powyżej moja subiektywna opinia, dystans zalecany, nie bierzcie tego zbytnio do siebie ;)]]]></description>
			<content:encoded><![CDATA[<p>Cześć,<br />
Rich Domain Model to czyste zło! Po pierwsze w RDM metody, które operują na danym obiekcie znajdują się wewnątrz tego obiektu. Powoduje to, że juniorom, bądź nowym członkom projektu łatwiej znaleźć zaimplementowane już funkcje (ponieważ są zdefiniowane w jednym miejscu). Jest to bardzo niekorzystne zjawisko, ponieważ&nbsp;wiadomo, że nowi programiści powinni najpierw przeiterować po całej warstwie serwisów (w większych projektach są to nawet setki klas) żeby sprawdzić, czy funkcjonalność, której akurat potrzeba nie została już zaimplementowana wcześniej. Najczęściej jednak źli programiści, nie wiedzieć czemu (może dziwnie implementować 1 mały ficzer przez tydzień?), nie chcą ogarnąć kodu całej aplikacji, żeby zrobić zmianę w jednym miejscu i duplikują zaimplementowane już zachowania tworząc je np. w nowych serwisach. To powoduje, że serwisów jest jeszcze więcej i iteracja po nich jest coraz trudniejsza i… you see where it goes. Także, ADM powoduje, że kod staje się trudniejszy w utrzymaniu, bardziej skomplikowany i próg wejścia w projekt staje się bardzo wysoki. To dobrze, bo to gwarantuje developerowi/developerom odpowiedzialnym za powstały bajzel pozycję w firmie (przecież nie zwolnimy jedynej osoby, która potrafi ogarnąć swój bajzel). Dzięki temu można potem negocjować wyższe stawki itp. Niestety taki stan rzeczy nie może trwać w nieskończoność. Zabawa kończy się kiedy stan obiektów na których pracujemy wpada w nieprzewidziany stan, bo coś, gdzieś, w pewnym momencie je modyfikuje i już nawet sam autor tego monumentu spaghetti nie wie gdzie leży tego przyczyna (na pewno nie w braku hermetyzacji). Wtedy oczywiście trzeba zwalić winę na wszystko inne, tylko nie na złą architekturę, a już na samym końcu, gdy implementacja czegokolwiek i utrzymanie projektu jest porównywalne tylko z wojną w Wietnamie, można najzwyczajniej zmienić pracę.<br />
Powyższy wpis niestety, choć podkolorowany i przejaskrawiony, jest inspirowany rzeczywistością. Na studiach nauczyłem się czym jest OOP, czym różni się od programowania strukturalnego i dlaczego to drugie zostało ostatecznie wyparte przez obiektowość. W pracy jednak trafiłem na gości, dla których jedynym słusznym sposobem na projektowanie jest Anemic Domain Model. Zwracanie uwagi na problemy jakie się za tym ciągną nie dało nic. ADM broniony był przez autorytet seniorów, z których jeden się zwolnił, a drugi trafił do innego projektu. Ich dzieło było jeszcze chwile utrzymywane przez parę innych osób po czym ostatecznie projekt upadł.<br />
No cóż, dużo mnie to nauczyło. Wystarczy dostarczyć kod, który działa (do pewnego czasu), a jego jakość nie ma znaczenia. Ważne, by być pewnym siebie i dobrze sprzedawać managementowi swoje genialne, potwierdzone doświadczeniem pomysły.<br />
Kiedyś uważałem, że trzeba mieć wiedze, żeby być seniorem, teraz uważam, że seniorem się jest po to, żeby tej wiedzy nie musieć posiadać 🙁<br />
[Powyżej moja subiektywna opinia, dystans zalecany, nie bierzcie tego zbytnio do siebie ;)]</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		Autor: Bartosz Dąbek		</title>
		<link>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comment-44</link>

		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Fri, 24 Jul 2020 07:58:14 +0000</pubDate>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1033#comment-44</guid>

					<description><![CDATA[W odpowiedzi do &lt;a href=&quot;https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comment-43&quot;&gt;0xmarcin&lt;/a&gt;.

Hej, po pierwsze, dzięki za komentarz.

Sprawdzę na czym polega to podejście, które promuje Jimmy. 
Wydaje się, że ta &lt;a href=&quot;https://youtu.be/SUiWfhAhgQw&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer nofollow ugc&quot;&gt;prezentacja&lt;/a&gt; z 2018 będzie do tego dobrym wstępem.
A prezentację o której wspomniałeś na konferencji BuildStuff w Wilnie można znaleźć &lt;a href=&quot;https://youtu.be/v4jrYMsYSco&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer nofollow ugc&quot;&gt;tutaj&lt;/a&gt; (zgaduję na 99%, że to jest to).]]></description>
			<content:encoded><![CDATA[<p>Hej, po pierwsze, dzięki za komentarz.</p>
<p>Sprawdzę na czym polega to podejście, które promuje Jimmy.<br />
Wydaje się, że ta <a href="https://youtu.be/SUiWfhAhgQw" target="_blank" rel="noopener noreferrer nofollow ugc">prezentacja</a> z 2018 będzie do tego dobrym wstępem.<br />
A prezentację o której wspomniałeś na konferencji BuildStuff w Wilnie można znaleźć <a href="https://youtu.be/v4jrYMsYSco" target="_blank" rel="noopener noreferrer nofollow ugc">tutaj</a> (zgaduję na 99%, że to jest to).</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		Autor: 0xmarcin		</title>
		<link>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comment-43</link>

		<dc:creator><![CDATA[0xmarcin]]></dc:creator>
		<pubDate>Fri, 24 Jul 2020 07:07:08 +0000</pubDate>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1033#comment-43</guid>

					<description><![CDATA[Bardzo dobry wpis, gratulacje!


Chciałbym dodać od siebie że model &quot;anemiczny&quot; vs domenowy to fałszywa dychotomia.&#160;

Istnieje wiele podejść pomiędzy, np. jednym z moich ulubionych jest podejście promowane przez Jimmiego Bogarta (https://jimmybogard.com/) będące w duzym uproszczeniu połączeniem CQS (Command query separation - nie mylić z CQRS) z modelem anemicznym.

Cechy szczególne tego podejścia to podział serwisów na command i query handlery. Uzycie wzorca mediator do wywolania odpowiedniego command handlera gdy posiadamy obiekt komendy. Uzycie event publishera i event handlerow do obslugi efektow &quot;pobocznych&quot;. Operowanie bezposredion na encjach w command handlerach. I na koniec testowanie głównie na poziomie command handlerów (niektórzy mówią integracyjne z prawdziwą DB, ale ja się z tym nie zgadzam).

Podejscie to jest niestety niezbyt znane w swiecie JVMowym byc moze dlatego ze pan Bogart pracuje glownie z .NETem. Bogarta mozna było&#160;spotkac w ubiegłym roku na konferencji BuildStuff w Wilnie (polecam), gdzie miał prezentację na temat tego podejścia.

Jest tez cały świat programowania funkcyjnego, gdzie ścierają się rózne podejscia do enkapsulacji. Moje osobiste zdanie jest takie ze enkapsulacja to dobra rzecz nie wazne czy piszę obiektowo czy funkcyjnie. Sporo osob ma&#160;jednak inne zdanie i uwaza ze program powinien operowac na &quot;nagich danych&quot;. Immutowalność uprawsza tutaj wiele rzeczy.]]></description>
			<content:encoded><![CDATA[<p>Bardzo dobry wpis, gratulacje!</p>
<p>Chciałbym dodać od siebie że model &#8222;anemiczny&#8221; vs domenowy to fałszywa dychotomia.&nbsp;</p>
<p>Istnieje wiele podejść pomiędzy, np. jednym z moich ulubionych jest podejście promowane przez Jimmiego Bogarta (<a href="https://jimmybogard.com/" rel="nofollow ugc">https://jimmybogard.com/</a>) będące w duzym uproszczeniu połączeniem CQS (Command query separation &#8211; nie mylić z CQRS) z modelem anemicznym.</p>
<p>Cechy szczególne tego podejścia to podział serwisów na command i query handlery. Uzycie wzorca mediator do wywolania odpowiedniego command handlera gdy posiadamy obiekt komendy. Uzycie event publishera i event handlerow do obslugi efektow &#8222;pobocznych&#8221;. Operowanie bezposredion na encjach w command handlerach. I na koniec testowanie głównie na poziomie command handlerów (niektórzy mówią integracyjne z prawdziwą DB, ale ja się z tym nie zgadzam).</p>
<p>Podejscie to jest niestety niezbyt znane w swiecie JVMowym byc moze dlatego ze pan Bogart pracuje glownie z .NETem. Bogarta mozna było&nbsp;spotkac w ubiegłym roku na konferencji BuildStuff w Wilnie (polecam), gdzie miał prezentację na temat tego podejścia.</p>
<p>Jest tez cały świat programowania funkcyjnego, gdzie ścierają się rózne podejscia do enkapsulacji. Moje osobiste zdanie jest takie ze enkapsulacja to dobra rzecz nie wazne czy piszę obiektowo czy funkcyjnie. Sporo osob ma&nbsp;jednak inne zdanie i uwaza ze program powinien operowac na &#8222;nagich danych&#8221;. Immutowalność uprawsza tutaj wiele rzeczy.</p>
]]></content:encoded>
		
			</item>
	</channel>
</rss>
