SlideShare a Scribd company logo
WSTĘP DO DDD
Domain Driven Design w świecie PHP
Piotr Kacała
O mnie
GOG.com
Senior Web Developer
Czym się zajmuję?
Utrzymywanie i rozwój kodu,
szukanie rozwiązań
GOG.com
Historia Start w 2008 pod skrzydłami CD Projekt - zespół 10 osób
Obecnie zatrudnionych jest ponad 70 osób
Obecna
pozycja
#1 globalnej dystrybucji klasycznych gier na PC i Mac
#2 globalnej dystrybucji gier indie na PC i Mac
Partnerzy 220+ twórców i wydawców gier
Klienci Ponad 2.7 miliona unikalnych wejść miesięcznie z całego świata
Gry Ponad 800 tytułów w katalogu
Ponad 39 milionów gier na kontach użytkowników
Agenda
1. Teoria chaosu (w kodzie)
2. Wprowadzenie do DDD
3. Design strategiczny
4. Krótko o architekturze
5. Design taktyczny
6. Podsumowanie i wnioski
Teoria chaosu
CZYM OBJAWIA SIĘ ROZKŁAD APLIKACJI?
• Niska podatność kodu na zmiany
• Zbyt mocno powiązane ze sobą komponenty
• Niespójna architektura
Teoria chaosu
JAK PRÓBUJEMY SOBIE PORADZIĆ?
• Przepisanie całości od podstaw
• Nowy framework
• Inny, modny język programowania
Teoria chaosu
SKĄD BIERZE SIĘ CHAOS?
• Nieumiejętność odnalezienia się w modelu biznesowym
• Reguły biznesowe ulegają ciągłym zmianom
Wprowadzenie do DDD
DOMAIN DRIVEN DESIGN
Zestaw narzędzi do projektowania i ochrony procesów
zachodzących w złożonej domenie
DOMENA
Sfera wiedzy, w której obraca się dana organizacja
Wprowadzenie do DDD
DOMAIN DRIVEN DESIGN
DESIGN STRATEGICZNY DESIGN TAKTYCZNY
Design strategiczny
WSZECHOBECNY JĘZYK
• Zbudowanie jednolitego słownika pojęć w domenie
• Używany zarówno przez developerów, jak i ekspertów domenowych
• Pomaga developerom zrozumieć biznes, w którym funkcjonują
• Pomaga ekspertom domenowym spojrzeć na problem oczami developera
• Ciągle udoskonalany
Design strategiczny
WSZECHOBECNY JĘZYK
Klient zamawia produkty i za nie płaci
”“
Design strategiczny
OGRANICZONY KONTEKST
• Koncept książki
• Znalezienie autorów
• Proces pisania i poprawek
• Zaprojektowanie layoutu książki i ilustracji
• Przełożenie książki na inne języki
• Produkcja fizycznych kopii
• Format elektronicznych kopii
• Marketing
• Sprzedaż
Krótko o architekturze
Domena Logika biznesowa
Aplikacja Łączenie warstw, cross-cutting concerns
Prezentacja Kontrolery, widoki, UI
Infrastruktura Wypełnianie kontraktów technicznych
Krótko o architekturze
KOD W WARSTWIE DOMENY
• Baza danych nie istnieje
• Obiekty POPO
• Synergia z TDD
• Spójny, czytelny kod zorientowany na język biznesowy
Design taktyczny
KIM JEST DEVELOPER RAFAŁ?
• Rafał jest senior developerem w dobrze prosperującej firmie
• Rafał pracuje w kilkuosobowym zespole
• Rafał jest ewangelistą OOP i zaczął czytać Fowlera
• Rafał jakiś czas temu odkrył Symfony 2 i Doctrine 2
Design taktyczny
ZADANIE RAFAŁA
• Klient dodaje produkty do zamówienia
• Maksymalna liczba przedmiotów, które klient może
zamówić w jednym zamówieniu to 3
• Po zapisaniu zamówienia klient otrzymuje maila z
potwierdzeniem
Design taktyczny
// ...
$totalCost = 0;
$orderLines = [];
foreach ($products as $product) {
$totalCost += $product->getPrice();
$orderLines[] = new OrderLine($product->getId(), $product->getPrice());
}
if (count($product) > 3) {
throw new LogicException('Maksymalnie trzy produkty kliencie');
}
$order = new Order();
$order->setCustomer($customer);
$order->setOrderLines($orderLines);
$order->setTotalCost($totalCost);
$order->setStatus(OrderStatus::NEW);
$em = $this->getDoctrine()->getManager();
$em->persist($order);
$em->flush();
$message = new Swift_Message();
// ...
IMPLEMENTACJA RAFAŁA
Design taktyczny
// ...
$totalCost = 0;
foreach ($products as $product) {
$totalCost += $product->getPrice();
}
OPERACJE NA WARTOŚCIACH
Design taktyczny
VALUE OBJECT
• Określa wartość lub miarę
• Nie posiada identyfikatora
• Niezmienny w obrębie tej samej instancji (immutability)
• Stanowi zamkniętą całość
• Zapewnia walidację w obrębie klasy
• Side-Effect-Free
Design taktyczny
$total = new Money(0, new Currency('PLN')); // or Money::PLN(0);
$total = $total->add($product->getPrice());
VALUE OBJECT
Design taktyczny
ENTITY
Posiadają ID Unikalne Cykl życia
Design taktyczny
if (count($product) > 3) {
throw new LogicException('Maksymalnie trzy produkty kliencie');
}
$order = new Order();
$order->setCustomer($customer);
$order->setOrderLines($orderLines);
$order->setTotalCost($totalCost);
$order->setStatus(OrderStatus::NEW);
AGREGAT
Design taktyczny
class Order extends AggreagateRoot
{
public function __construct(Customer $customer)
{
$this->id = Uuid::uuid4();
$this->lines = new ArrayCollection();
$this->totalPrice = Money::PLN(0);
$this->customer = $customer;
}
public function add(Product $product)
{
if ($this->lines->count() > self::PRODUCT_LIMIT) {
throw new DomainException('...');
}
$line = new OrderLine($product->id(), $product->price());
$this->lines->add($line);
$this->totalPrice = $this->totalPrice->add($product->price());
$this->raise(new ProductWasAddedToCart($this->customer, $product->id());
}
}
PRZYKŁAD AGREGATU
Design taktyczny
DEFINICJA AGREGATU
• Graf obiektów
• Jeden punkt wejścia - poprzez Aggregate Root
• Operacje w agregacie są granicami transakcji
• Ochrona reguł biznesowych
• Aggregate Root dostępne z poziomu repozytoriów
• Aggregate Root jest z technicznego punktu widzenia encją
Design taktyczny
AGREGAT ORDERU
ORDER LINE ORDER LINE ORDER LINE
ORDER
Design taktyczny
$em = $this->getDoctrine()->getManager();
$em->persist($order);
$em->flush();
REPOZYTORIUM
Design taktyczny
// Domain (!) layer
interface OrderRepository
{
public function orderOfId($orderId);
public function save(Order $order);
}
// Infrastructure layer
class OrderDoctrineOrmRepository implements OrderRepository {
// ...
}
class OrderMongoDbRepository implements OrderRepository {
// ...
}
REPOZYTORIUM
Design taktyczny
EVENTY DOMENOWE
• Wyrażają wydarzenia istotne z punktu widzenia domeny
• Sposób na rozłączność kodu przez wprowadzenie listenerów
Design taktyczny
class Order
{
public function add(Product $product)
{
// ...
$this->raise(new ProductWasAddedToCart($this->customer, $product->id());
}
}
class OrderCreatedMessageSender
{
public function sendEmail(ProductWasAddedToCart $event)
{
// ... send email
}
}
EVENTY DOMENOWE
Podsumowanie
CZY DDD JEST DLA MNIE?
Tak jeśli:
• Twoja aplikacja dotyka złożonych procesów biznesowych
• Twoja aplikacja będzie się rozrastać
• Reguły biznesowe w aplikacji będą ulegać częstym zmianom
Nie jeśli:
• Twoja aplikacja jest w całości data-centryczna (CRUD)
• Jeżeli Twój model jest nieskomplikowany (i nie będzie) - blog, strona o kotkach
Podsumowanie
CO ZYSKUJE BIZNES?
• Organizacja zyskuje użyteczny model własnej domeny
• Kształtowanie definicji i zrozumienia zasad biznesowych
• Określenie wspólnego języka między developerami a ekspertami domenowymi
• Eksperci domenowi aktywnie przyczyniają się rozwoju aplikacji
• Czyste modele o ukierunkowaniu biznesowym
• Jasny podział na granice kontekstu ułatwia późniejszą integrację między teamami
• Ukierunkowanie na ciągły rozwój i dopracowanie modelu
Podsumowanie
CO ZYSKUJE DEVELOPER?
• Projektowanie ukierunkowane na biznes
• Prawdziwe OOP
• Uporządkowanie architektury
• Spójny, czytelny, łatwy w rozwijaniu kod
• Dobre wykorzystanie wzorców projektowych
• Łatwość w testowaniu
• Chronienie zasad biznesowych
• Odporność na zmiany
• Skupienie się na regułach biznesowych
SZUKAMY WEBDEVÓW
Więcej informacji u mnie lub na stronie GOG.com/work
…i zapraszam po darmowego Wiedźmina :)
DZIĘKUJĘ ZA UWAGĘ

More Related Content

PDF
Czym jest złożoność ?
GOG.com dev team
 
PDF
Jak wydaliśmy wiedźmina, GOG.com IT
GOG.com dev team
 
PDF
Wykorzystanie technologii webowych w aplikacjach desktopowych (1)
GOG.com dev team
 
PDF
GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej...
GOG.com dev team
 
PDF
Dystrybucja gier w świecie online, przykład architektury webowego systemu ro...
GOG.com dev team
 
PDF
multi-tier cache at gog.com - 4developers
Maciej Włodarkiewicz
 
PDF
The story of GOG.com Cache
Maciej Włodarkiewicz
 
PDF
DynamoDB – podstawy modelowania danych dla opornych
The Software House
 
Czym jest złożoność ?
GOG.com dev team
 
Jak wydaliśmy wiedźmina, GOG.com IT
GOG.com dev team
 
Wykorzystanie technologii webowych w aplikacjach desktopowych (1)
GOG.com dev team
 
GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej...
GOG.com dev team
 
Dystrybucja gier w świecie online, przykład architektury webowego systemu ro...
GOG.com dev team
 
multi-tier cache at gog.com - 4developers
Maciej Włodarkiewicz
 
The story of GOG.com Cache
Maciej Włodarkiewicz
 
DynamoDB – podstawy modelowania danych dla opornych
The Software House
 

What's hot (6)

PDF
Websockety w PHP
The Software House
 
PPTX
[BDD] Introduction to Behat (PL)
Piotr Pelczar
 
PDF
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Droptica
 
PDF
Swoole w PHP. Czy to ma sens?
The Software House
 
PDF
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
The Software House
 
PDF
Drupal jako modularny i rozszerzalny CMS [PL]
Droptica
 
Websockety w PHP
The Software House
 
[BDD] Introduction to Behat (PL)
Piotr Pelczar
 
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Droptica
 
Swoole w PHP. Czy to ma sens?
The Software House
 
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
The Software House
 
Drupal jako modularny i rozszerzalny CMS [PL]
Droptica
 
Ad

Similar to Intro do Domain Driven Design. ( PL ) (20)

PPTX
Zawód: programista gier. Jak zacząć pracę w branży?
GameDesire Company
 
PDF
CI oraz CD w złożonym projekcie o małym budżecie
Grzegorz Godlewski
 
PDF
JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
PROIDEA
 
PPTX
[JUG, PL] Strategiczna refaktoryzacja
Michał Bartyzel
 
PPTX
Oss w software house
Ryszard Dałkowski
 
PDF
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Piotr Horzycki
 
ODP
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Wojciech Sznapka
 
PPTX
Dwa sposoby na pisanie aplikacji bez błędów
Michal Lukaszewski
 
PPTX
Techniczna organizacja zespołu cz 2
intive
 
PPT
Extjs & netzke
GaldoMedia
 
PDF
It od kuchni w nokaut.pl
Przemyslaw Wroblewski
 
PDF
IT od kuchni w Nokaut.pl
3camp
 
PPTX
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
PROIDEA
 
PDF
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PROIDEA
 
PDF
SOLIDWORKS 2016 Enterprise PDM
DPS Software Sp. z o.o.
 
PDF
Aplikacje Oracle w WĘGLOKOKS SA
Comarch
 
PPT
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
Fundacja Rozwoju Branży Internetowej Netcamp
 
PDF
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Grzegorz Bartman
 
PDF
Delphi 8 .NET. Kompendium programisty
Wydawnictwo Helion
 
PDF
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
PROIDEA
 
Zawód: programista gier. Jak zacząć pracę w branży?
GameDesire Company
 
CI oraz CD w złożonym projekcie o małym budżecie
Grzegorz Godlewski
 
JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
PROIDEA
 
[JUG, PL] Strategiczna refaktoryzacja
Michał Bartyzel
 
Oss w software house
Ryszard Dałkowski
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Piotr Horzycki
 
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Wojciech Sznapka
 
Dwa sposoby na pisanie aplikacji bez błędów
Michal Lukaszewski
 
Techniczna organizacja zespołu cz 2
intive
 
Extjs & netzke
GaldoMedia
 
It od kuchni w nokaut.pl
Przemyslaw Wroblewski
 
IT od kuchni w Nokaut.pl
3camp
 
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
PROIDEA
 
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PROIDEA
 
SOLIDWORKS 2016 Enterprise PDM
DPS Software Sp. z o.o.
 
Aplikacje Oracle w WĘGLOKOKS SA
Comarch
 
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
Fundacja Rozwoju Branży Internetowej Netcamp
 
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Grzegorz Bartman
 
Delphi 8 .NET. Kompendium programisty
Wydawnictwo Helion
 
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
PROIDEA
 
Ad

More from GOG.com dev team (11)

PDF
In-depth caching in Varnish - GOG Varnish Meetup, march 2019
GOG.com dev team
 
PDF
Always up to date, testable and maintainable documentation with OpenAPI
GOG.com dev team
 
PDF
Symfony without the framework
GOG.com dev team
 
PPTX
Versioning challenges in micro services of Gwent
GOG.com dev team
 
PPTX
Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze...
GOG.com dev team
 
PDF
Event sourcing w PHP (by Piotr Kacała)
GOG.com dev team
 
PDF
Design Thinking Workshop: Empathy in the User Experience
GOG.com dev team
 
PDF
Lean UX - How to start with Lean Startup in User Experience
GOG.com dev team
 
PDF
Varnish cache
GOG.com dev team
 
PDF
The story of GOG.com Cache - 4developers 2014 ( PL )
GOG.com dev team
 
PDF
The story of GOG.com Cache - PHPers 2014 ( PL )
GOG.com dev team
 
In-depth caching in Varnish - GOG Varnish Meetup, march 2019
GOG.com dev team
 
Always up to date, testable and maintainable documentation with OpenAPI
GOG.com dev team
 
Symfony without the framework
GOG.com dev team
 
Versioning challenges in micro services of Gwent
GOG.com dev team
 
Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze...
GOG.com dev team
 
Event sourcing w PHP (by Piotr Kacała)
GOG.com dev team
 
Design Thinking Workshop: Empathy in the User Experience
GOG.com dev team
 
Lean UX - How to start with Lean Startup in User Experience
GOG.com dev team
 
Varnish cache
GOG.com dev team
 
The story of GOG.com Cache - 4developers 2014 ( PL )
GOG.com dev team
 
The story of GOG.com Cache - PHPers 2014 ( PL )
GOG.com dev team
 

Intro do Domain Driven Design. ( PL )

  • 1. WSTĘP DO DDD Domain Driven Design w świecie PHP Piotr Kacała
  • 2. O mnie GOG.com Senior Web Developer Czym się zajmuję? Utrzymywanie i rozwój kodu, szukanie rozwiązań
  • 3. GOG.com Historia Start w 2008 pod skrzydłami CD Projekt - zespół 10 osób Obecnie zatrudnionych jest ponad 70 osób Obecna pozycja #1 globalnej dystrybucji klasycznych gier na PC i Mac #2 globalnej dystrybucji gier indie na PC i Mac Partnerzy 220+ twórców i wydawców gier Klienci Ponad 2.7 miliona unikalnych wejść miesięcznie z całego świata Gry Ponad 800 tytułów w katalogu Ponad 39 milionów gier na kontach użytkowników
  • 4. Agenda 1. Teoria chaosu (w kodzie) 2. Wprowadzenie do DDD 3. Design strategiczny 4. Krótko o architekturze 5. Design taktyczny 6. Podsumowanie i wnioski
  • 5. Teoria chaosu CZYM OBJAWIA SIĘ ROZKŁAD APLIKACJI? • Niska podatność kodu na zmiany • Zbyt mocno powiązane ze sobą komponenty • Niespójna architektura
  • 6. Teoria chaosu JAK PRÓBUJEMY SOBIE PORADZIĆ? • Przepisanie całości od podstaw • Nowy framework • Inny, modny język programowania
  • 7. Teoria chaosu SKĄD BIERZE SIĘ CHAOS? • Nieumiejętność odnalezienia się w modelu biznesowym • Reguły biznesowe ulegają ciągłym zmianom
  • 8. Wprowadzenie do DDD DOMAIN DRIVEN DESIGN Zestaw narzędzi do projektowania i ochrony procesów zachodzących w złożonej domenie DOMENA Sfera wiedzy, w której obraca się dana organizacja
  • 9. Wprowadzenie do DDD DOMAIN DRIVEN DESIGN DESIGN STRATEGICZNY DESIGN TAKTYCZNY
  • 10. Design strategiczny WSZECHOBECNY JĘZYK • Zbudowanie jednolitego słownika pojęć w domenie • Używany zarówno przez developerów, jak i ekspertów domenowych • Pomaga developerom zrozumieć biznes, w którym funkcjonują • Pomaga ekspertom domenowym spojrzeć na problem oczami developera • Ciągle udoskonalany
  • 11. Design strategiczny WSZECHOBECNY JĘZYK Klient zamawia produkty i za nie płaci ”“
  • 12. Design strategiczny OGRANICZONY KONTEKST • Koncept książki • Znalezienie autorów • Proces pisania i poprawek • Zaprojektowanie layoutu książki i ilustracji • Przełożenie książki na inne języki • Produkcja fizycznych kopii • Format elektronicznych kopii • Marketing • Sprzedaż
  • 13. Krótko o architekturze Domena Logika biznesowa Aplikacja Łączenie warstw, cross-cutting concerns Prezentacja Kontrolery, widoki, UI Infrastruktura Wypełnianie kontraktów technicznych
  • 14. Krótko o architekturze KOD W WARSTWIE DOMENY • Baza danych nie istnieje • Obiekty POPO • Synergia z TDD • Spójny, czytelny kod zorientowany na język biznesowy
  • 15. Design taktyczny KIM JEST DEVELOPER RAFAŁ? • Rafał jest senior developerem w dobrze prosperującej firmie • Rafał pracuje w kilkuosobowym zespole • Rafał jest ewangelistą OOP i zaczął czytać Fowlera • Rafał jakiś czas temu odkrył Symfony 2 i Doctrine 2
  • 16. Design taktyczny ZADANIE RAFAŁA • Klient dodaje produkty do zamówienia • Maksymalna liczba przedmiotów, które klient może zamówić w jednym zamówieniu to 3 • Po zapisaniu zamówienia klient otrzymuje maila z potwierdzeniem
  • 17. Design taktyczny // ... $totalCost = 0; $orderLines = []; foreach ($products as $product) { $totalCost += $product->getPrice(); $orderLines[] = new OrderLine($product->getId(), $product->getPrice()); } if (count($product) > 3) { throw new LogicException('Maksymalnie trzy produkty kliencie'); } $order = new Order(); $order->setCustomer($customer); $order->setOrderLines($orderLines); $order->setTotalCost($totalCost); $order->setStatus(OrderStatus::NEW); $em = $this->getDoctrine()->getManager(); $em->persist($order); $em->flush(); $message = new Swift_Message(); // ... IMPLEMENTACJA RAFAŁA
  • 18. Design taktyczny // ... $totalCost = 0; foreach ($products as $product) { $totalCost += $product->getPrice(); } OPERACJE NA WARTOŚCIACH
  • 19. Design taktyczny VALUE OBJECT • Określa wartość lub miarę • Nie posiada identyfikatora • Niezmienny w obrębie tej samej instancji (immutability) • Stanowi zamkniętą całość • Zapewnia walidację w obrębie klasy • Side-Effect-Free
  • 20. Design taktyczny $total = new Money(0, new Currency('PLN')); // or Money::PLN(0); $total = $total->add($product->getPrice()); VALUE OBJECT
  • 22. Design taktyczny if (count($product) > 3) { throw new LogicException('Maksymalnie trzy produkty kliencie'); } $order = new Order(); $order->setCustomer($customer); $order->setOrderLines($orderLines); $order->setTotalCost($totalCost); $order->setStatus(OrderStatus::NEW); AGREGAT
  • 23. Design taktyczny class Order extends AggreagateRoot { public function __construct(Customer $customer) { $this->id = Uuid::uuid4(); $this->lines = new ArrayCollection(); $this->totalPrice = Money::PLN(0); $this->customer = $customer; } public function add(Product $product) { if ($this->lines->count() > self::PRODUCT_LIMIT) { throw new DomainException('...'); } $line = new OrderLine($product->id(), $product->price()); $this->lines->add($line); $this->totalPrice = $this->totalPrice->add($product->price()); $this->raise(new ProductWasAddedToCart($this->customer, $product->id()); } } PRZYKŁAD AGREGATU
  • 24. Design taktyczny DEFINICJA AGREGATU • Graf obiektów • Jeden punkt wejścia - poprzez Aggregate Root • Operacje w agregacie są granicami transakcji • Ochrona reguł biznesowych • Aggregate Root dostępne z poziomu repozytoriów • Aggregate Root jest z technicznego punktu widzenia encją
  • 25. Design taktyczny AGREGAT ORDERU ORDER LINE ORDER LINE ORDER LINE ORDER
  • 26. Design taktyczny $em = $this->getDoctrine()->getManager(); $em->persist($order); $em->flush(); REPOZYTORIUM
  • 27. Design taktyczny // Domain (!) layer interface OrderRepository { public function orderOfId($orderId); public function save(Order $order); } // Infrastructure layer class OrderDoctrineOrmRepository implements OrderRepository { // ... } class OrderMongoDbRepository implements OrderRepository { // ... } REPOZYTORIUM
  • 28. Design taktyczny EVENTY DOMENOWE • Wyrażają wydarzenia istotne z punktu widzenia domeny • Sposób na rozłączność kodu przez wprowadzenie listenerów
  • 29. Design taktyczny class Order { public function add(Product $product) { // ... $this->raise(new ProductWasAddedToCart($this->customer, $product->id()); } } class OrderCreatedMessageSender { public function sendEmail(ProductWasAddedToCart $event) { // ... send email } } EVENTY DOMENOWE
  • 30. Podsumowanie CZY DDD JEST DLA MNIE? Tak jeśli: • Twoja aplikacja dotyka złożonych procesów biznesowych • Twoja aplikacja będzie się rozrastać • Reguły biznesowe w aplikacji będą ulegać częstym zmianom Nie jeśli: • Twoja aplikacja jest w całości data-centryczna (CRUD) • Jeżeli Twój model jest nieskomplikowany (i nie będzie) - blog, strona o kotkach
  • 31. Podsumowanie CO ZYSKUJE BIZNES? • Organizacja zyskuje użyteczny model własnej domeny • Kształtowanie definicji i zrozumienia zasad biznesowych • Określenie wspólnego języka między developerami a ekspertami domenowymi • Eksperci domenowi aktywnie przyczyniają się rozwoju aplikacji • Czyste modele o ukierunkowaniu biznesowym • Jasny podział na granice kontekstu ułatwia późniejszą integrację między teamami • Ukierunkowanie na ciągły rozwój i dopracowanie modelu
  • 32. Podsumowanie CO ZYSKUJE DEVELOPER? • Projektowanie ukierunkowane na biznes • Prawdziwe OOP • Uporządkowanie architektury • Spójny, czytelny, łatwy w rozwijaniu kod • Dobre wykorzystanie wzorców projektowych • Łatwość w testowaniu • Chronienie zasad biznesowych • Odporność na zmiany • Skupienie się na regułach biznesowych
  • 33. SZUKAMY WEBDEVÓW Więcej informacji u mnie lub na stronie GOG.com/work …i zapraszam po darmowego Wiedźmina :)