SlideShare a Scribd company logo
1 of 34
Download to read offline
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

What's hot

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

What's hot (6)

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

Similar to Intro do Domain Driven Design. ( PL )

Zawód: programista gier. Jak zacząć pracę w branży?
Zawód: programista gier. Jak zacząć pracę w branży?Zawód: programista gier. Jak zacząć pracę w branży?
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
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieGrzegorz Godlewski
 
JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
JDD2014: Strategiczna refaktoryzacja - Michał BartyzelJDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
JDD2014: Strategiczna refaktoryzacja - Michał BartyzelPROIDEA
 
[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacja[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacjaMichał Bartyzel
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPPiotr Horzycki
 
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...Wojciech Sznapka
 
Dwa sposoby na pisanie aplikacji bez błędów
Dwa sposoby na pisanie aplikacji bez błędówDwa sposoby na pisanie aplikacji bez błędów
Dwa sposoby na pisanie aplikacji bez błędówMichal Lukaszewski
 
Techniczna organizacja zespołu cz 2
Techniczna organizacja zespołu cz 2Techniczna organizacja zespołu cz 2
Techniczna organizacja zespołu cz 2intive
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzkeGaldoMedia
 
IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl 3camp
 
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...PROIDEA
 
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...PROIDEA
 
Aplikacje Oracle w WĘGLOKOKS SA
Aplikacje Oracle  w WĘGLOKOKS  SAAplikacje Oracle  w WĘGLOKOKS  SA
Aplikacje Oracle w WĘGLOKOKS SAComarch
 
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014Grzegorz Bartman
 
Delphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programistyDelphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programistyWydawnictwo Helion
 
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...PROIDEA
 

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

Zawód: programista gier. Jak zacząć pracę w branży?
Zawód: programista gier. Jak zacząć pracę w branży?Zawód: programista gier. Jak zacząć pracę w branży?
Zawód: programista gier. Jak zacząć pracę w branży?
 
CI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecie
 
JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
JDD2014: Strategiczna refaktoryzacja - Michał BartyzelJDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
JDD2014: Strategiczna refaktoryzacja - Michał Bartyzel
 
[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacja[JUG, PL] Strategiczna refaktoryzacja
[JUG, PL] Strategiczna refaktoryzacja
 
Oss w software house
Oss w software houseOss w software house
Oss w software house
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
 
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
 
Dwa sposoby na pisanie aplikacji bez błędów
Dwa sposoby na pisanie aplikacji bez błędówDwa sposoby na pisanie aplikacji bez błędów
Dwa sposoby na pisanie aplikacji bez błędów
 
Techniczna organizacja zespołu cz 2
Techniczna organizacja zespołu cz 2Techniczna organizacja zespołu cz 2
Techniczna organizacja zespołu cz 2
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 
It od kuchni w nokaut.pl
It od kuchni w nokaut.plIt od kuchni w nokaut.pl
It od kuchni w nokaut.pl
 
IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl
 
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...infraxstructure: Rafał Stańczak  "Postępujący rozwój infrastruktury na potrze...
infraxstructure: Rafał Stańczak "Postępujący rozwój infrastruktury na potrze...
 
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
 
SOLIDWORKS 2016 Enterprise PDM
SOLIDWORKS 2016 Enterprise PDMSOLIDWORKS 2016 Enterprise PDM
SOLIDWORKS 2016 Enterprise PDM
 
Aplikacje Oracle w WĘGLOKOKS SA
Aplikacje Oracle  w WĘGLOKOKS  SAAplikacje Oracle  w WĘGLOKOKS  SA
Aplikacje Oracle w WĘGLOKOKS SA
 
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
 
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
Code driven development w Drupalu 7 | DrupalCamp Wrocław 2014
 
Delphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programistyDelphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programisty
 
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
 

More from GOG.com dev team

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

More from GOG.com dev team (11)

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

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 :)