33
MODELOVÁNÍ V OOP A LEHKÝ ÚVOD DO DDD Matěj Koubík @mkoubik

Modelování v OOP (a lehký úvod do DDD)

Embed Size (px)

Citation preview

Page 1: Modelování v OOP (a lehký úvod do DDD)

MODELOVÁNÍ V OOPA LEHKÝ ÚVOD DO DDD

Matěj Koubík @mkoubik

Page 2: Modelování v OOP (a lehký úvod do DDD)

DOMAIN DRIVENDESIGN

Page 3: Modelování v OOP (a lehký úvod do DDD)

CO JE TO MODEL?

Page 4: Modelování v OOP (a lehký úvod do DDD)

CO JE TO MODEL?(užitečné) zjednodušení "reality"

Page 5: Modelování v OOP (a lehký úvod do DDD)

ARCHITEKTURAWEBOVÉ APLIKACE

UI layer

Application layer

Domain layer

Persistence layer

Storage

Page 6: Modelování v OOP (a lehký úvod do DDD)

CO JE DOMÉNOVÝMODEL?

Page 7: Modelování v OOP (a lehký úvod do DDD)

<?php

namespace App\Model;

class Client extends Entity // ...

Page 8: Modelování v OOP (a lehký úvod do DDD)

„Zygohistomorphic Prepromorphisms“

Page 9: Modelování v OOP (a lehký úvod do DDD)

„Dual Overhead Rate Recovery“

Page 10: Modelování v OOP (a lehký úvod do DDD)

„It's Lupus“

Page 11: Modelování v OOP (a lehký úvod do DDD)

UBIQUITOUSLANGUAGE

anglicky!

platí v nějakém kontextu

Page 12: Modelování v OOP (a lehký úvod do DDD)

VALUE OBJECTAddress

$street Pernerova 53

$city Praha 8

$zipCode 186 00

Page 13: Modelování v OOP (a lehký úvod do DDD)

VALUE OBJECTIMMUTABLE

public function changeZipCode($newZipCode) return new Address( $this­>street, $this­>city, $newZipCode );

Page 14: Modelování v OOP (a lehký úvod do DDD)

ENTITYPerson

$id 1

$name John Doe

$email [email protected]

Page 15: Modelování v OOP (a lehký úvod do DDD)

ENTITYVALIDACE

$validator­>isValid($person);

$person­>isValid();

public function __construct($name) $this­>name = $name;

Page 16: Modelování v OOP (a lehký úvod do DDD)

ENTITYANEMIC MODEL

if ($person­>getAge() >= 18) $originalName = $person­>getOriginalName(); $person­>setName($newName); $person­>setOriginalName($originalName);

Page 17: Modelování v OOP (a lehký úvod do DDD)

ENTITYANEMIC MODEL

public function rename($newName) if ($this­>age < 18) throw new \Exception;

$this­>originalName = $this­>name; $this­>name = $newName;

$person­>rename($newName);

Page 18: Modelování v OOP (a lehký úvod do DDD)

ENTITYANEMIC MODEL

Page 19: Modelování v OOP (a lehký úvod do DDD)

AGGREGATE

Page 20: Modelování v OOP (a lehký úvod do DDD)

FACTORYinterface ICustomerFactory /** * @param string $name * @param Address $address * @returns Customer */ function create($name, Address $address);

Page 21: Modelování v OOP (a lehký úvod do DDD)

BOUNDED CONTEXTclass Order extends Entity // ...

class Product extends Entity // ...

Page 22: Modelování v OOP (a lehký úvod do DDD)

BOUNDED CONTEXT

-- Martin Fowler

Page 23: Modelování v OOP (a lehký úvod do DDD)

BOUNDED CONTEXTcore domainsupporting subdomaingeneric subdomain

Page 24: Modelování v OOP (a lehký úvod do DDD)

REPOSITORY$repository = [];$repository[$product­>getId()] = $product;

interface IProductsRepository function save(Product $product); // make it explicit!

function getById($id); // return whole aggregate!

function delete($id);

@ChangeTrackingPolicy("DEFERRED_EXPLICIT")

Page 25: Modelování v OOP (a lehký úvod do DDD)

SERVICEstatelesssingletonSRP!

Page 26: Modelování v OOP (a lehký úvod do DDD)

DOMAIN EVENTobjektne commandimmutableobsahuje datamůže implementovat interface

Page 27: Modelování v OOP (a lehký úvod do DDD)

CO SI ZAPAMATOVATmake it explicitdefinujte slovníkrozlišujte kontextvyhněte se anemickému modelu

Page 28: Modelování v OOP (a lehký úvod do DDD)

ZDROJE KE STUDIU

Page 29: Modelování v OOP (a lehký úvod do DDD)

ZDROJE KE STUDIUDomain-Driven Design: Tackling Complexity in the Heart of

Software (Eric Evans)

Page 30: Modelování v OOP (a lehký úvod do DDD)
Page 31: Modelování v OOP (a lehký úvod do DDD)

ZDROJE KE STUDIUImplementing Domain-Driven Design (Vaughn Vernon)

Page 32: Modelování v OOP (a lehký úvod do DDD)

ZDROJE KE STUDIUStackOverflow.comgoogle

Page 33: Modelování v OOP (a lehký úvod do DDD)

DĚKUJI