<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Domain Driven Design - bdabek.pl</title>
	<atom:link href="https://www.bdabek.pl/tag/domain-driven-design/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bdabek.pl/tag/domain-driven-design/</link>
	<description>Bartosz Dąbek</description>
	<lastBuildDate>Sat, 03 Dec 2022 11:10:34 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.bdabek.pl/wp-content/uploads/2020/10/cropped-5986134a-46ba-41ac-9c82-bb4ffb3a7bf3_200x200-1-150x150.png</url>
	<title>Domain Driven Design - bdabek.pl</title>
	<link>https://www.bdabek.pl/tag/domain-driven-design/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Bounded context w DDD 👀</title>
		<link>https://www.bdabek.pl/bounded-context/</link>
					<comments>https://www.bdabek.pl/bounded-context/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 26 Sep 2020 10:00:08 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1713</guid>

					<description><![CDATA[<p>Technika Bounded Context jest najbardziej wyrafinowaną i subtelną z technik DDD. Zakłada ona istnienie różnych modeli opisujących te same byty, używanych w różnych kontekstach. Cześć  Jest to trzeci wpis z serii o DDD. Dziś porozmawiamy o tym czym jest Bounded Context (BC). W dzisiejszym artykule: Zrozumieć Bounded Context Subdomena vs Bounded Context Przykład BC Zrozumieć&#8230;&#160;<a href="https://www.bdabek.pl/bounded-context/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Bounded context w DDD 👀</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/bounded-context/">Bounded context w DDD 👀</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Technika Bounded Context jest najbardziej wyrafinowaną i subtelną z technik DDD. Zakłada ona istnienie różnych modeli opisujących te same byty, używanych w różnych kontekstach.</p>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>Jest to trzeci wpis z <strong><a href="https://www.bdabek.pl/tag/domain-driven-design/">serii o DDD</a></strong>. Dziś porozmawiamy o tym czym jest Bounded Context (<em>BC</em>).</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Zrozumieć Bounded Context"><strong>Zrozumieć Bounded Context</strong></a></li>
<li><a href="#Subdomena vs Bounded Context"><strong>Subdomena vs Bounded Context</strong></a></li>
<li><a href="#Przykład BC"><strong>Przykład BC</strong></a></li>
</ul>
<hr id="Zrozumieć Bounded Context" />
<h3><strong>Zrozumieć Bounded Context</strong></h3>
<p>Czym jest Bounded Context (<em>BC</em>)? Tłumacząc to bezpośrednio na nasz polski język to jest to <em>Ograniczony kontekst</em>. Prawdę mówiąc to, ta translacja jest w 100% poprawna. Ale jeżeli jesteś nowy w DDD i pierwszy raz słyszysz o BC, to możesz się zastanawiać co w rzeczywistości oznacza ograniczony kontekst?</p>
<p>Bounded Context definiuje granice podsystemu. <strong>Zawiera swój model domenowy</strong> i co jest bardzo ważne <strong>nie współdzieli danych modelu z innym kontekstami</strong>. W praktyce oczywiście jest tak, że różne Bounded Context&#8217;y muszą komunikować się ze sobą. Komunikacja taka nie jest niczym złym &#8211; bez tego nasze oprogramowanie miałoby ciało ale nie miało przykładowo rąk czy nóg, innymi słowy &#8211; nie działałoby jako całość. BC komunikują się między sobą przez jasno zdefiniowane API.</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1731" rel="attachment wp-att-1731"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-1731" src="https://www.bdabek.pl/wp-content/uploads/2020/09/bc.jpg" alt="" width="709" height="679" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/bc.jpg 709w, https://www.bdabek.pl/wp-content/uploads/2020/09/bc-300x287.jpg 300w" sizes="(max-width: 709px) 100vw, 709px" /></a></p>
<p>Razem z pojęciem BC często pojawia się także pojęcie <strong>Ubiquitous Language</strong> (<em>wszechobecny język</em>). Oznacza ono, używanie wspólnego języka w danym podsystemie przez wszystkich. Kim są wszyscy? Ludzie od biznesu, product owner, scrum master, developerzy &#8211; wszyscy, którzy pracują w danym podsystemie.</p>
<p>Język ten jest platformą komunikacji pomiędzy tymi wszystkimi ludźmi &#8211; tylko trzeba pamiętać &#8211; w ramach danego bounded context&#8217;u. Jak jest to przedstawione na obrazku wyżej, <em>Produkt</em> w kontekście Shopping Context będzie charakteryzował się innymi właściwościami niż ten w <em>Offers Context</em>. W ofercie ważne będzie podkreślenie jego charakterystycznych cech np. w czym pomoże potencjalnemu użytkownikowi oraz jaka jest jego cena. W kontekście sprzedaży cena również będzie ważna ale dodatkowo istotne będzie czy produkt jest dostępny i można go kupić. W kontekście samego produktu istotne może być np. moment dodania produktu do sklepu czy też ilość produktu w magazynie. Dodatkowo, z czasem <strong>język może ewoluować</strong>. Eksperci domenowi mają większą wiedzę, wymagania biznesu się zmieniają lub po prostu dochodzą nowe.</p>
<hr id="Subdomena vs Bounded Context" />
<h3><strong>Subdomena vs Bounded Context</strong></h3>
<p>Nie będę się specjalnie rozpisywał w tej sekcji.</p>
<p>Najważniejsza różnica pomiędzy obiema definicjami jest taka: <strong>subdomena opisuje problem a bounded context jest jego rozwiązaniem</strong>. Subdomeny odkrywamy a bounded context definiujemy. Jest to po prostu <strong>przełożenie wszystkich informacji jakie do tej pory zebraliśmy na model</strong>. Model, który za pomocą wszechobecnego języka definiuje zachowanie konkretnego bounded context&#8217;u.</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1739" rel="attachment wp-att-1739"><img decoding="async" class="aligncenter size-full wp-image-1739" src="https://www.bdabek.pl/wp-content/uploads/2020/09/bc-vs-subdomain.png" alt="" width="821" height="746" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/bc-vs-subdomain.png 821w, https://www.bdabek.pl/wp-content/uploads/2020/09/bc-vs-subdomain-300x273.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/09/bc-vs-subdomain-768x698.png 768w" sizes="(max-width: 821px) 100vw, 821px" /></a></p>
<hr id="Przykład BC" />
<h3><strong>Przykład BC</strong></h3>
<p>Przykład został zaczerpnięty z <strong><a href="https://docs.microsoft.com/en-us/azure/architecture/microservices/model/domain-analysis" target="_blank" rel="noopener noreferrer">dokumentacji MS</a> </strong>i nieco zmodyfikowany.</p>
<p><strong>Scenariusz: Usługa dostaw przy pomocy dronów.</strong><br />
Firma XYZ uruchamia usługę dostaw przy pomocy dronów. XYZ zarządza całą flotą dronów.  Jej użytkownicy mogą poprosić o drona do odbioru towaru. Kiedy klient planuje odbiór, system backendowy przydziela drona i powiadamia użytkownika o przewidywanym czasie dostawy. W trakcie realizacji dostawy klient może śledzić lokalizację drona, dzięki stale aktualizowanemu systemowi. XYZ pozwala również na usługi firm zewnętrznych &#8211; firma chcąca być podwykonawcą rejestruje się w serwisie i również może dostarczać przesyłki. Z punktu widzenia klienta końcowego usługi nadal są świadczone przez firmę XYZ.</p>
<p><strong>Analiza:</strong></p>
<p>Problem opisany powyżej można podzielić na kilka subdomen (<em>nie wszystko zostało ujęte w scenariuszu</em>):</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1719" rel="attachment wp-att-1719"><img decoding="async" class="aligncenter size-full wp-image-1719" src="https://www.bdabek.pl/wp-content/uploads/2020/09/ddd1.jpg" alt="" width="1280" height="708" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/ddd1.jpg 1280w, https://www.bdabek.pl/wp-content/uploads/2020/09/ddd1-300x166.jpg 300w, https://www.bdabek.pl/wp-content/uploads/2020/09/ddd1-1024x566.jpg 1024w, https://www.bdabek.pl/wp-content/uploads/2020/09/ddd1-768x425.jpg 768w" sizes="(max-width: 1280px) 100vw, 1280px" /></a></p>
<p><b>Shipping </b>&#8211; jest umieszczony w centrum diagramu, ponieważ jest to rdzeń biznesu.<br />
<strong>Zarządzanie Dronami</strong> &#8211; również jest podstawą działalności firmy. Funkcjonalność, która jest ściśle związana z zarządzaniem dronami, obejmuje naprawę dronów oraz wykorzystanie analizy prognostycznej do przewidywania, kiedy drony będą wymagały obsługi i konserwacji.<br />
<strong>Analiza ETA</strong> &#8211; umożliwia oszacowanie czasu odbioru i dostawy.<br />
<strong>Third party</strong> &#8211; umożliwia aplikacji planowanie alternatywnych metod transportu, jeżeli paczka nie może być wysłana w całości przez drona.<br />
<strong>Dzielenie dronów</strong> &#8211; jest możliwym rozszerzeniem podstawowej działalności. Firma może mieć nadmierną pojemność dronów w określonych godzinach i może wynajmować drony, które w przeciwnym razie pozostałyby bezczynne. Ta cecha nie pojawi się w początkowym wydaniu.<br />
<strong>Nadzór wideo</strong> &#8211; to kolejny obszar, w którym firma może rozwinąć się później.<br />
<strong>Konta użytkowników</strong>, <strong>fakturowanie</strong> i <strong>call center</strong> to subdomeny, które wspierają podstawową działalność firmy.</p>
<p>&nbsp;</p>
<p>Teraz, mając już zdefiniowane subdomeny naszego problemu możemy przejść do definiowania <strong>Bounded Context&#8217;ów</strong> (<em>BC&#8217;s</em>).</p>
<p>Modelem, znajdującym się w centrum domeny jest model drona. Obojętne z jakiej subdomeny spojrzysz na projekt &#8211; dron jest w jego centrum. Zarządzanie dronami (<em>Drone Management</em>) będzie definiowało historię konserwacji, przebieg, rocznik, numer modelu, itd. Ale kiedy jest czas na zaplanowanie dostawy, nie dbamy o te rzeczy. Podsystem planowania musi tylko wiedzieć, czy dron jest dostępny oraz jaki jest przewidywalny czas odbioru i dostawy.</p>
<p>Idąc starym podejściem (<em>moim zdaniem biorącym się z chęci szybkiego dostarczenia wartości i braku myślenia nad tym co robimy</em>) po 3 miesiącach pracy mogłoby się okazać, że nasz model wyglądałby w taki sposób:</p><pre class="crayon-plain-tag">class Drone {
    // Drone Management
    MaintenanceHistory maintenanceHistory;
    int mileage;
    int age;
    String modelNumber;

    // Shipping
    boolean isAvailable;
    LocalDateTime pickUp;
    LocalDateTime delivery;
    
    // pozostale sub-domeny
    //...
}</pre><p>Do czego to końcowo doprowadzi? Do kodu, który jest</p>
<ol>
<li><strong>Nieutrzymywalny</strong> &#8211; dodanie czegoś nowego / modyfikacja istniejących właściwości to zmora i tylko pogłębienie problemu.</li>
<li><strong>Trudny w zrozumieniu</strong> &#8211; jak wejdzie ktoś nowy na projekt, to chcąc nie chcąc musisz wytłumaczyć mu działanie wszystkiego co kręci się wokół modelu drona, inaczej może tylko dodatkowo nabałaganić.</li>
</ol>
<p>Jak można rozwiązać ten problem? <strong>Wprowadzając BC</strong>! Po pierwsze trzeba zastanowić się jak zdefiniować granice pomiędzy sub-domenami. Mogłoby to wyglądać następująco:</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1721" rel="attachment wp-att-1721"><img decoding="async" class="aligncenter size-full wp-image-1721" src="https://www.bdabek.pl/wp-content/uploads/2020/09/ddd2.jpg" alt="" width="1280" height="711" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/ddd2.jpg 1280w, https://www.bdabek.pl/wp-content/uploads/2020/09/ddd2-300x167.jpg 300w, https://www.bdabek.pl/wp-content/uploads/2020/09/ddd2-1024x569.jpg 1024w, https://www.bdabek.pl/wp-content/uploads/2020/09/ddd2-768x427.jpg 768w" sizes="(max-width: 1280px) 100vw, 1280px" /></a></p>
<p>I teraz najistotniejsze. Chcemy aby nasz <strong>model drona był czymś innym</strong> w zależności od tego w jakiej sub-domenie się znajdujemy! Czyli <strong>zamiast jednego wielkiego modelu będziemy mieli kilka innych</strong>! Takich, które będą odpowiadać tym właściwościom jakie są wykorzystywane w konkretnej sub-domenie.</p><pre class="crayon-plain-tag">// Drone Management
class Drone {
    MaintenanceHistory maintenanceHistory;
    int mileage;
    int age;
    String modelNumber;
    
    // metody specifyczne do wykonania w tej domenie
    // ...
}

// Shipping
class Drone {
    boolean isAvailable;
    LocalDateTime pickUp;
    LocalDateTime delivery;

    // metody specifyczne do wykonania w tej domenie
    // ...
}</pre><p>W taki sposób definiujemy zachowania i właściwości specyficzne dla danego Bounded Context&#8217;u. <strong>Zwiększamy również czytelność i możliwość łatwiejszego wdrożenia nowych osób</strong>. Nowa osoba nie musi już wiedzieć wszystkiego o wszystkim. Jeżeli ma zająć się sub-domeną zarządzania dronami to wystarczy jej wiedza w obrębie tego konkretnego modelu.</p>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Bounded Context (<em>ograniczony kontekst</em>) nie jest czymś specjalnie trudnym do zrozumienia. W nowych projektach, gdzie mamy okazję modelować subdomena &#8211; bounded context  w relacji 1:1 wszystko wydaje się być łatwe. Problem pojawia się kiedy wchodzimy w świat legacy (lub sami go tworzymy) i okazuje się, że nie jest już tak idealnie. Nasz bounded context zaczyna rozwiązywać problemy z kilku domen a po kilku miesiącach zostaje już tylko context &#8211; bounded zostało zjedzone.</p>
<p>Oczywiście tak nie musi być :). Jako programiści / architekci musimy zawsze czuwać nad kodem i <strong>myśleć </strong>jaki wpływ będzie mieć zmiana, którą właśnie implementuję. Niestety, z doświadczenia wiem, że biznes chce wszystko na już i niespecjalnie daje nam czas na zastanowienie się nad kodem. Co robić w takich sytuacjach? Może to zabrzmi arogancko ale.. nie zawsze spełniać na hura zachcianki klienta. Ile razy spotkałeś się, że klient coś chciał a za miesiąc się rozmyślał? Mi kilka razy się zdarzyło&#8230; <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://martinfowler.com/bliki/BoundedContext.html" target="_blank" rel="noopener noreferrer">BoundedContext</a></strong></li>
<li><strong><a href="https://docs.microsoft.com/en-us/azure/architecture/microservices/model/domain-analysis#define-bounded-contexts" target="_blank" rel="noopener noreferrer">Define bounded contexts</a></strong></li>
<li><strong><a href="https://droganowoczesnegoarchitekta.pl/" target="_blank" rel="noopener noreferrer">Kurs DNA</a></strong></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Chcę poruszyć swoje indywidualne kwestie &#8211; tak jak zrobiłem to <strong><a href="https://www.bdabek.pl/co-jest-moim-celem/" target="_blank" rel="noopener noreferrer">w tym wpisie</a></strong>. Właściwie, to wydaje mi się to dobrym pomysłem żeby robić takie comiesięczne podsumowania + przemyślenia co dalej.</p>
<p>Artykuł <a href="https://www.bdabek.pl/bounded-context/">Bounded context w DDD 👀</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/bounded-context/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Domena w DDD. Jak ją poznać ❓🤔</title>
		<link>https://www.bdabek.pl/ddd-jak-poznac-domene/</link>
					<comments>https://www.bdabek.pl/ddd-jak-poznac-domene/#respond</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 19 Sep 2020 10:00:19 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1681</guid>

					<description><![CDATA[<p>Domena w kontekście DDD jest kluczem. Bez niej całe podejście do projektowania sterowanego domeną nie ma sensu. Dlatego też bardzo ważne jest abyśmy ją odkryli i poznali. Z tą wiedzą będzie można przejść do dalszych etapów DDD oraz utworzyć model kodu, który nie będzie przypominał kodu spaghetti. Cześć  Jest to drugi wpis z serii o&#8230;&#160;<a href="https://www.bdabek.pl/ddd-jak-poznac-domene/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Domena w DDD. Jak ją poznać ❓🤔</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/ddd-jak-poznac-domene/">Domena w DDD. Jak ją poznać ❓🤔</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Domena w kontekście DDD jest kluczem. Bez niej całe podejście do projektowania sterowanego domeną nie ma sensu. Dlatego też bardzo ważne jest abyśmy ją odkryli i poznali. Z tą wiedzą będzie można przejść do dalszych etapów DDD oraz utworzyć model kodu, który nie będzie przypominał kodu spaghetti.</p>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>Jest to drugi wpis z <strong><a href="https://www.bdabek.pl/tag/domain-driven-design/">serii o DDD</a></strong>. Dziś zdefiniujemy domenę oraz naprowadzę Cię jak możesz ją poznawać.</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Domena - czym jest?"><strong>Domena &#8211; czym jest?</strong></a></li>
<li><a href="#Rodzaje domen"><strong>Rodzaje domen</strong></a></li>
<li><a href="#Jak odkrywać domenę?"><strong>Jak odkrywać domenę?</strong></a></li>
</ul>
<hr id="Domena - czym jest?" />
<h3><strong>Domena &#8211; czym jest?</strong></h3>
<p>Aby odkryć domenę na początku dobrze byłoby ją zdefiniować. Według słownika PWN</p>
<blockquote><p>zakres zainteresowań lub działalności jakiejś osoby, instytucji lub dziedziny wiedzy</p>
<p><cite>&#8211; Słownik PWN</cite></p></blockquote>
<p>&nbsp;</p>
<p>A według bardziej programistycznych forów (<em>SO i SE</em>):</p>
<blockquote><p>Domena odnosi się do konkretnego tematu, dla którego projekt jest opracowywany. Jest przestrzenią problemową, którą należy rozwiązać projektując oprogramowanie.<cite></cite></p></blockquote>
<p>Czyli w prostych słowach &#8211; <strong>domena reprezentuje problem do rozwiązania</strong>.</p>
<p>Rozważmy metaforę producenta statków. Statek może składać się z setek tysięcy części, a pracownicy pracujący nad jego rozwojem nie mają pełnego kontekstu całej produkcji wymaganej do budowy statku ze względu na jego skalę. Pracownicy koncentrują się na jednym konkretnym obszarze statku i wykonują go, podczas gdy inni pracownicy pracują równolegle na innych częściach. Postęp zachodzi jednocześnie. Pracownik, który pracuje z tyłu statku, nie musi dokładnie wiedzieć, jak postępują prace z przodu, ponieważ wykracza to poza jego zakres i nie wpłynie na wykonywaną przez niego pracę.</p>
<p><a href="https://www.bdabek.pl/ddd-jak-poznac-domene/ship-manufacturer/" rel="attachment wp-att-1701"><img decoding="async" class="aligncenter size-full wp-image-1701" src="https://www.bdabek.pl/wp-content/uploads/2020/09/ship-manufacturer.jpeg" alt="" width="1000" height="749" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/ship-manufacturer.jpeg 1000w, https://www.bdabek.pl/wp-content/uploads/2020/09/ship-manufacturer-300x225.jpeg 300w, https://www.bdabek.pl/wp-content/uploads/2020/09/ship-manufacturer-768x575.jpeg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<p>Są jednak osoby, które mają za zadanie wiedzieć jaki jest dokładny stan produkcji statku z szerszej perspektywy. Osoby te mają lepszy przegląd pełnego postępu, ale nie muszą znać dokładnej szczegółów implementacji, ponieważ do tego wymagana jest konkretna wiedza. Są również osoby, które znają się doskonale właśnie na szczegółach, jak np. budowa kadłubu czy instalacja silników. Na każdym poziomie wymagana jest nowa wiedza, aby zrozumieć granice wykonywanej pracy i jak ją wykonać.</p>
<p>Jak więc poznać domenę? <strong>Angażując specjalistów, ekspertów danej dziedziny, ludzi, którzy faktycznie mają wiedzę o tym, dlaczego podejmujemy decyzje</strong>, które podejmujemy. Są to ludzie, którzy będą <strong>przekazywać wiedzę</strong>, która ostatecznie będzie odzwierciedlać podstawowe elementy domeny, aby stworzyć dobre oprogramowanie. Aby domena była dobrze odwzorowana w kodzie musisz ją <strong>poznać, zrozumieć i zamodelować</strong>.</p>
<p>Zauważ, że produkcja statku nie jest trywialnym procesem. Składa się z wielu odrębnych domen (dziedzin). Na pewno każdy z elementów jest istotny jednak często bywa tak, że niektóre domeny są ważniejsze od innych. Z tego powodu domeny można podzielić na trzy rodzaje.</p>
<hr id="Rodzaje domen" />
<h3><strong>Rodzaje domen</strong></h3>
<p><a href="https://www.bdabek.pl/ddd-jak-poznac-domene/rodzaje-domen/" rel="attachment wp-att-1703"><img decoding="async" class="aligncenter size-full wp-image-1703" src="https://www.bdabek.pl/wp-content/uploads/2020/09/rodzaje-domen.jpeg" alt="" width="700" height="524" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/rodzaje-domen.jpeg 700w, https://www.bdabek.pl/wp-content/uploads/2020/09/rodzaje-domen-300x225.jpeg 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>W przypadku złożonych domen &#8211; a zazwyczaj takie chcemy odkrywać i modelować &#8211; często okaże się, że tylko konkretna subdomena jest istotna z biznesowego punktu widzenia. Inne również są ważne i być może bez nich nasza główna domena nie miałaby sensu. Nie są one jednak aż tak istotne i nie musimy wkładać w nie tyle uwagi i poświęcenia.</p>
<p>Domeny możemy podzielić na 3 rodzaje:</p>
<ul>
<li><strong>główna</strong> (<em>core domain</em>) &#8211; najważniejsza część systemu. Dzięki niej biznes odnosi sukces i ma przewagę nad konkurencją. Odpowiada na pytania dlaczego powstaje (powstał) dany system i dlaczego go nie kupiliśmy.</li>
<li><strong>wspierająca</strong> (<em>supporting domain</em>) &#8211; zapewnia funkcje wspierające domenę główną. Nie zapewnia żadnej przewagi konkurencyjnej bez obecności <em>core domain</em>. Nie istnieje gotowy produkt by je dostarczyć ze względu np. na specyfikację naszej domeny głównej.</li>
<li><strong>generyczna</strong> (<em>generic domain</em>) &#8211; zapewnia ważne funkcje dla działania biznesu ale nie są one unikalne i istnieją już gotowe rozwiązania. Np. wysyłka maili czy też usługa monitorowania.</li>
</ul>
<hr id="Jak odkrywać domenę?" />
<h3><strong>Jak odkrywać domenę?</strong></h3>
<p><a href="https://www.bdabek.pl/ddd-jak-poznac-domene/event-storming/" rel="attachment wp-att-1709"><img decoding="async" class="aligncenter size-full wp-image-1709" src="https://www.bdabek.pl/wp-content/uploads/2020/09/event-storming.jpeg" alt="" width="700" height="368" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/event-storming.jpeg 700w, https://www.bdabek.pl/wp-content/uploads/2020/09/event-storming-300x158.jpeg 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>Nie jestem ekspertem w tej działce. Dlatego lepiej będzie jak po prostu powiem krótko o istnieniu czegoś takiego jak <strong><a href="https://www.eventstorming.com/" target="_blank" rel="noopener noreferrer">Event Storming</a></strong>. Jest to metoda odkrywania i konkretyzowania informacji o domenie biznesowej. Jest chyba najpopularniejszą formą odkrywania domeny. Wymaga zaangażowania co najmniej kilku osób &#8211; ekspertów. Ekspertów znających się na problemie jaki rozwiązujemy od strony biznesowej. Przy ich pomocy jesteśmy w stanie utworzyć <em>mapę</em> problemu jaki rozwiązujemy. Rozpisać występujące zdarzenia, przypisać ich aktorów oraz rozdzielić na odpowiednie subdomeny.</p>
<p>Przy pomocy event stroming&#8217;u jesteśmy w stanie:</p>
<ul>
<li>zrozumieć domenę</li>
<li>poznać język biznesowy</li>
<li>zidentyfikować problemy (znane lub nieznane do tej pory)</li>
<li>znaleźć subdomeny</li>
</ul>
<p>Więcej na temat Event Stromingu możesz przeczytać w tym <strong><a href="https://bulldogjob.pl/articles/1075-event-storming-pierwszy-krok-do-ddd" target="_blank" rel="noopener noreferrer">artykule</a></strong>.</p>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Dlaczego odkrywanie domeny jest ważne? Po pierwsze &#8211; rozumiemy działania biznesu, znamy kontekst, wiemy dokąd zmierzamy. Dwa, jesteśmy w stanie podzielić problem na mniejsze problemy a co za tym idzie zrównoleglić prace. Trzy &#8211; po podzieleniu problemu na mniejsze możemy nadać im odpowiedni priorytet decydując co jest najistostniejsze dla biznesu a co można outsourcować z zewnątrz.</p>
<p>Źródła:</p>
<ul>
<li><a href="https://medium.com/raa-labs/part-1-domain-driven-design-like-a-pro-f9e78d081f10" target="_blank" rel="noopener noreferrer"><strong>Part 1: Domain Driven Design like a pro <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c5.png" alt="🏅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></a></li>
<li><strong><a href="https://droganowoczesnegoarchitekta.pl/" target="_blank" rel="noopener noreferrer">Kurs DNA</a></strong></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Zajmiemy się definicją <strong>bounded contextów </strong>oraz tego jak to się ma do subdomen.</p>
<p>Artykuł <a href="https://www.bdabek.pl/ddd-jak-poznac-domene/">Domena w DDD. Jak ją poznać ❓🤔</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/ddd-jak-poznac-domene/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>👉 Domain Driven Design 😱</title>
		<link>https://www.bdabek.pl/domain-driven-design/</link>
					<comments>https://www.bdabek.pl/domain-driven-design/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 12 Sep 2020 10:00:46 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1663</guid>

					<description><![CDATA[<p>Z pewnością DDD nie jest dla każdego. Jeżeli dopiero zaczynasz swoją ścieżkę programisty to koncepty poruszane w tym artykule prawdopodobnie do Ciebie nie trafią. Mimo wszystko zachęcam do lektury. Cześć  Techniki DDD zyskały swą popularność w roku 2003, wraz z publikacją książki Erica Evansa. Mimo upływu lat koncepcja DDD jest wciąż żywo rozwijana i wzbogacana&#8230;&#160;<a href="https://www.bdabek.pl/domain-driven-design/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">👉 Domain Driven Design 😱</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/domain-driven-design/">👉 Domain Driven Design 😱</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Z pewnością DDD nie jest dla każdego. Jeżeli dopiero zaczynasz swoją ścieżkę programisty to koncepty poruszane w tym artykule prawdopodobnie do Ciebie nie trafią. Mimo wszystko zachęcam do lektury.</p>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>Techniki DDD zyskały swą popularność w roku 2003, wraz z publikacją książki Erica Evansa. Mimo upływu lat koncepcja DDD jest wciąż żywo rozwijana i wzbogacana o nowe techniki.</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Zrozumieć DDD"><strong>Zrozumieć DDD</strong></a></li>
<li><strong><a href="#Podstawowe koncepty DDD">Podstawowe koncepty DDD</a></strong></li>
<li><a href="#Trudności związane z DDD"><strong>Trudności związane z DDD</strong></a></li>
</ul>
<hr id="Zrozumieć DDD" />
<h3><strong>Zrozumieć DDD</strong></h3>
<p>Domain Driven Design jest zestawem technik i koncepcji służących do projektowania złożonych modeli biznesowych i ich dosłownej implementacji. Naszym zadaniem, jako programistów jest zrozumienie faktu, iż technologia w jakiej rozwiązujemy problem nie jest istotna. Nasza uwaga powinna skupiać się na biznesie. Dążymy do zrozumienia wartości biznesu, tego co robimy i w jaki sposób przekłada się to na $.</p>
<p>Fundamentalnym zagadnieniem DDD jest relacja <strong>biznes &lt;=&gt; zespół</strong>. Kod, wytwarzany przez zespół musi opierać się na domenie w jakiej pracujemy. Każda domena ma jakieś reguły, walidacje, kompromisy &#8211; generalnie <strong>zasady biznesowe</strong>. I tu pojawia się pierwsza ściana &#8211; <strong>musimy poznać domenę</strong>. W jaki sposób poznaje się domenę opiszę w kolejnym artykule &#8211; na dziś niech wystarczy Ci wiedza, że musisz znaleźć osobę / osoby, które bardzo dobrze znają problem od strony biznesu.</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1670" rel="attachment wp-att-1670"><img decoding="async" class="aligncenter size-full wp-image-1670" src="https://www.bdabek.pl/wp-content/uploads/2020/09/domain.jpg" alt="" width="512" height="427" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/domain.jpg 512w, https://www.bdabek.pl/wp-content/uploads/2020/09/domain-300x250.jpg 300w" sizes="(max-width: 512px) 100vw, 512px" /></a></p>
<p>Tak jak na obrazku powyżej &#8211; domena będzie się zazwyczaj składała z kilku subdomen. Podczas odkrywania domeny z biznesem będą pojawiały się zarysy, które na podstawie doświadczenia / przeczucia / konsultacji z innymi będziesz definiował.</p>
<p>A zatem jak rozumieć Domain Driven Design? Wyróżniłbym tutaj 3 główne zasady, DDD:</p>
<ul>
<li>koncentruje się na podstawowej domenie i logice domeny</li>
<li>opiera złożone projekty na modelach domeny (to domena jest najważniejsza)</li>
<li>polega na współpracy z ekspertami dziedzinowymi w celu ulepszania modelu aplikacji i rozwiązywania wszelkich pojawiających się problemów związanych z domeną</li>
</ul>
<hr id="Podstawowe koncepty DDD" />
<h3><strong>Podstawowe koncepty DDD</strong></h3>
<p>Kiedy czytamy o DDD na pewno spotkamy się z pojęciem <strong>Ubiquitous Language</strong>. W praktyce oznacza to wspólny język modelu, którym posługuje sią cały zespół, począwszy od eksperta domenowego po programistów warstwy logiki domenowej. Jest to przy okazji jedna z zalet aplikacji opartych o projektowanie domenowe.</p>
<p>Innym konceptem są <strong>Bulding Blocks</strong>, czyli język standardowych wzorców, z których budujemy modele. Tutaj pozwolę sobie skopiować część <strong><a href="https://bottega.com.pl/pdf/materialy/ddd/ddd1.pdf" target="_blank" rel="noopener noreferrer">artykułu bottegi</a></strong>, która jest zresztą doskonałą lekturą DDD (<em>w większość konceptów wejdziemy z czasem</em>):</p>
<ul>
<li><strong>Entity</strong> – identyfikowalne obiekty zawierające odpowiedzialność biznesową;</li>
<li><strong>Aggregate</strong> – hermetyczne grafy obiektów, z jedną encją będącą „korzeniem agregatu”, która stanowi API całości. Agregat jest główną jednostką logiki domenowej w DDD;</li>
<li><strong>Value Object</strong> – wrapper dla typów prostych, nadający im znaczenie biznesowe oraz wygodny interfejs;</li>
<li><strong>Service</strong> – specyficzne operacje, które nie pasują do żądnego agregatu;</li>
<li><strong>Policy</strong> – model wariacji operacji biznesowych, Strategy Design Pattern;</li>
<li><strong>Specification</strong> – model złożonych warunków biznesowych, wywodzi się z Composite Design pattern;</li>
<li><strong>Event</strong> – model wydarzeń biznesowych, może służyć do przetwarzania równoległego lub komunikacji pomiędzy Bounded Context;</li>
<li><strong>Saga</strong> – model złożonego procesu, który stan jest trwały oraz zależy od wielu zdarzeń;</li>
<li><strong>Factory</strong> – tworzy nowe instancje złożonych Agregatów, dbając o ich poprawność. Zwiększa testowalność, biorąc niejako na siebie operatory new;</li>
<li><strong>Repository</strong> – zarządza trwałością Agregatu/Encji.</li>
</ul>
<hr id="Trudności związane z DDD" />
<h3><strong>Trudności związane z DDD</strong></h3>
<p>Podstawowym problemem jest komunikacja i znalezienie eksperta domenowego. Jeżeli takiej osoby nie ma to nic nie wyczarujemy. Możemy zgadywać jak ma wyglądać domena ale to nie jest dobre rozwiązanie. Prędzej lub później okaże się, że pomyliliśmy koncept i nie o to chodziło biznesowi &#8211; a wtedy zmiany mogą być bolesne&#8230;</p>
<p>Kolejną <em>trudnością</em> są kompetencje zespołu developerskiego. Jeżeli żaden z programistów całkowicie nie wie o co chodzi w DDD to prawdopodobnie nic z tego nie wyjdzie. Albo i wyjdzie ale ogromnym kosztem. Na szczęście jest <strong><a href="https://bottega.com.pl/ddd-cqrs-sample-project" target="_blank" rel="noopener noreferrer">kilka przykładowych projektów</a> </strong>w sieci na bazie której możemy czerpać wiedzę i inspirację.</p>
<p>Choć ten przykład w dzisiejszych czasach nie stanowi już aż tak wielkiego problemu to mimo wszystko warto o tym wspomnieć. DDD wymaga pracy w procesie iteracyjnym. Domena jest żywa &#8211; dochodzą nowe reguły, inne się zmieniają, zmienia się prawo. To kieruje projekty rozwijane w metodologii DDD do bycia <em>agile</em>.</p>
<p>DDD nie pasuje wszędzie. Techniki te są opłacalne dla projektów operujących na złożonych i nietrywialnych domenach. Nie każdy projekt jest na tyle skomplikowany, że musimy ich używać . Jeżeli mamy prosty proces CRUD&#8217;owy z zerową lub marginalną warstwą reguł biznesowych to osadzenie domeny (<em>ciekawe czym ona jest w takim crudzie</em>) tylko niepotrzebnie skomplikuje projekt. Nie po to pojawił się koncept Domain Driven Design.</p>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Projektowanie oparte na domenie to podejście inżynierii oprogramowania do rozwiązywania konkretnego modelu domeny. Rozwiązanie krąży wokół modelu biznesowego, łącząc wykonanie z kluczowymi zasadami biznesowymi. W dużych projektach zwykle tylko część modelu (<em>Core Domain</em>) będzie spełniać warunek gdzie DDD powinno być zastosowane. Moim zdaniem jest to jak najbardziej poprawne aby tylko dla części projektu zastosowane było to podejście. Jasne jest, że wpływają na to inne czynniki, np. kompetencje zespołu :).</p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://www.infoq.com/articles/ddd-in-practice/" target="_blank" rel="noopener noreferrer">Domain Driven Design and Development In Practice</a></strong></li>
<li><strong><a href="https://bottega.com.pl/pdf/materialy/ddd/ddd1.pdf" rel="nofollow">Domain Driven Design krok po kroku</a></strong></li>
<li><strong><a href="https://youtu.be/pMuiVlnGqjk" rel="nofollow">What is DDD &#8211; Eric Evans &#8211; DDD Europe 2019</a></strong></li>
<li><strong><a href="https://youtu.be/sWvS8GC2AO4" rel="nofollow">WJUG #177 &#8211; Domain Driven Design w praktyce &#8211; Krzysztof Muchewicz</a></strong></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Lecimy w świat DDD &#8211; omówimy <strong>w jaki sposób poznawać domenę</strong>.</p>
<p>Artykuł <a href="https://www.bdabek.pl/domain-driven-design/">👉 Domain Driven Design 😱</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/domain-driven-design/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
