Software 1. Dlaczego właściwie DDD? 2014-12-16 8 Problemy Nowy język Biblioteki Magiczne metody Cudowne akronimy Nowe serwery Nowy framework Nowy sposób myślenia
- antywzorzec • Metody biznesowe odzwierciedlają wyłącznie odpowiedzialności lub zachowania encji 3. Building blocks 2014-12-16 19 class AnemicClient { protected $id; protected $name; public function getId() { return $this->id; } public function setId($id) { $this->id = $id; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } } class RichClient { protected $id; protected $firstName; protected $lastName; //.... public function changeName($newName) { .... } public function getFullName() { return $this->firstName . ' ' . $this->lastName; } } Encja (entity)
Value Objects są niezmienne (immutable) • Nadają prostym wartościom znaczenie biznesowe 3. Building blocks 2014-12-16 21 class Money { protected $amount; protected $currency public function __construct($amount, $currency) { $this->amount = $amount; $this->currency = $currency; } public function __toString() { return $this->amount . ' ' . $this->currency; } public function convertToCurrency($newCurrency) { //logika konwersji } } Value Object
• Nie posiadają tożsamości ani cyklu życia • Są bezstanowe 3. Building blocks 2014-12-16 22 /** * Przykład serwisu domenowego * Może np. przekształcać jedne agregaty w inne * Operuje na logice domenowej */ class InvoicingService { /** * tworzy fakturę dla zamówienia */ public function createInvoice(Order $order, TaxPolicy $policy) { //logika domenowa: przetwarzanie Order w Invoice //często przy użyciu Policy returns $invoice; //agregat Invoice } } /** * Przykład serwisu aplikacyjnego * „Orkiestruje” obiekty i serwisy domenowe, * współpracuje z repozytoriami i innymi serwisami itd. * Opiera się o user stories. */ class PurchasingService { public function approveOrder($orderId) { //logika aplikacji: pobranie zamówienia z repozytorium, //sprawdzenie poprawności elementów zamówienia, //przypisanie należnego rabatu po zamówieniu, //wystawienie faktury za pomocą InvoicingService, //zapisanie wszystkich obiektów do repozytorium itp. } } Serwis
class OrderFactory { public function CreateOrder(Client $client) { if ($this->canHaveNewOrders($client)) { $order = new Order($client); return $order; } else { return false; } } protected function canHaveNewOrders(Client $client) { //sprawdzamy, czy klient może mieć nowe zamówienia } } Fabryka (factory)
DDD wymaga nauki – koncepcja, zasady, wzorce, procesy • Wyłącznie do złożonych zagadnień • DDD wymaga dostępności ekspertów domenowych • Blokady na poziomie organizacji Co nas powstrzymuje? 2014-12-16 27
rozwoju • Realizujemy wizję klienta • DDD dostarcza sposobów na rozwiązanie bardzo trudnych problemów • Dobrze zorganizowany i łatwo testowalny kod • Ściśle wydzielona logika biznesowa A co zyskujemy? 2014-12-16 28
najważniejsze? 2014-12-16 29 ...ale pomaga rozwiązywać trudne problemy i jednocześnie wspiera tworzenie uporządkowanego, testowalnego kodu, który łatwo jest utrzymywać
of Software • C. Buenosvinos, Ch. Soronellas, K. Akbary: Domain-Driven Design in PHP • http://dddcommunity.org • http://www.bottega.com.pl/artykuly-i-prezentacje • http://williamdurand.fr/2013/08/07/ddd-with-symfony2-folder-structure-and-code-first/ • http://gorodinski.com/blog/2012/04/14/services-in-domain-driven-design-ddd/ Źródła wiedzy o DDD 2014-12-16 30