SlideShare uma empresa Scribd logo
Domain-Driven
Design além da teoria
Paulo Victor L. L. Gomes
Presentation licensed by
Share - Keep license - noncommercial
http://creativecommons.org/licenses/by-nc-sa/3.0/
Domain-Driven Design?
Domain-Driven Design é uma
abordagem para o Desenvolvimento
de Software que estabelece uma forte
ligação entre a implementação e o
modelo evolutivo dos conceitos de
negócio. Implementação X Negócios
Fundamentação
Onde colocar a
regra de negócio?
Primeira resposta
“Vai escrevendo código ai,
quando precisar coloque
na camada de
apresentação, no banco
de dados nos controles,
modelos, na configuração
do webserver e não
esquece do xml e aquele
if maroto no
APPLICATION_ENV”
Resultado
Fundamentação
Encapsule, Daniel San
Orientação a Objetos?
Orientação a Objetos
Meu framework já usa
Orientação a Objetos.
Esse papo é muito
antigo e eu já superei
esse problema.
Orientação a Objetos
Olha meu código...
public function imagodAction() {
$local=VdModel::getLocalStorageAdapter();$items=$purchase->getItemCollection()->getItems();$Items=$this-
>cart->getItems();$index=array();$catalogHelper=newGodHelper();$quantityCartByidentifier=array();
$itemsRemove=array();foreach($itemsas$salespurchaseItem){$quantityCartByidentifier[$salespurchaseItem-
>getidentifier()]=(isset($quantityCartByidentifier[$salespurchaseItem->getidentifier()])?
$quantityCartByidentifier[$salespurchaseItem->getidentifier()]+1:1);foreach($itemsas$salespurchaseItem){if
($salespurchaseItem->getBundleidentifier()&&!isset($index[$salespurchaseItem->getBundleidentifier()]))
{'uniqueAttributes'=>CatalogHelper::getSimpleUniqueAttributes($product,$salespurchaseItem-
>getidentifier()),'color_cart'=>isset($product['meta']['color_family'])?$product['meta']
['color_family']:'','shipment_delivery_time'=>$salespurchaseItem->getShipmentTotalDeliveryTime(),)),
'bundleproducts'=>array($simples[$salespurchaseItem->getidentifier()]=>(isset($simples[$salespurchaseItem-
>getidentifier()])?$simples[$salespurchaseItem->getidentifier()]+1:1)),);$bundleproduct=$local->get
('product',(strstr($salespurchaseItem->getBundleidentifier(),'-',true)));
//resolveproducturable$product=$local->get('product',($simples[$salespurchaseItem->getidentifier()]));
$simple=$product['simples'][$salespurchaseItem->getidentifier()];$identifierHandle=$salespurchaseItem-
>getBundleidentifier();if(isset($bundleproduct['products'][$simples[$salespurchaseItem->getidentifier()]]
['quantity_items'])){$quantityItems=$bundleproduct['products'][$simples[$salespurchaseItem-
>getidentifier()]]['quantity_items'];}else{$quantityItems=1;$itemsRemove[]=$salespurchaseItem-
>getBundleidentifier();}$index[$identifierHandle]['salespurchaseItem']->setShipmentTotalDeliveryTime(max
($index[$identifierHandle]['salespurchaseItem']->getShipmentTotalDeliveryTime(),$salespurchaseItem-
>getShipmentTotalDeliveryTime()));$index[$identifierHandle]['stock']=min($simple['meta']['quantity'],$index
[$identifierHandle]['stock']);$index[$identifierHandle]['cart_rule_discount']+=$salespurchaseItem-
>getCartRuleDiscount();if(isset($index[$identifierHandle]['bundleproducts'][$simples[$salespurchaseItem-
>getidentifier()]])){if($index[$identifierHandle]['bundleproducts'][$simples[$salespurchaseItem-
>getidentifier()]]<$quantityItems){$index[$identifierHandle]['salespurchaseItem']->setUnitPrice($index
[$identifierHandle]['salespurchaseItem']->getUnitPrice()+$salespurchaseItem->getUnitPrice());$index
[$identifierHandle]['salespurchaseItem']->setPaidPrice($index[$identifierHandle]['salespurchaseItem']-
Orientação a Objetos
Quando pensamos em POO logo
pensamos em Classes, Encapsulamento,
Polimorfismo, Herança...
POO é mais que isso, a essência da
POO é alinhamento do código com o
negócio, reutilização, mínimo de
acoplamento, linguagem natural...
Como eu uso? De onde eu
começo?
sudo apt-get install ddd (#sqn)
Domain Driven Design
O desafio proposto...
Comunicação entre equipe de produto e
desenvolvimento
O mundo como ele é...
Linguagem Ubíqua
Definições de Ubíqua
“O termo foi usado pela primeira vez pelo cientista Norte-Americano Mark Weiser
em 1988 e publicado em 1991 no seu artigo The Computer for the 21st Century”
“termo usado para descrever a onipresença da informática no cotidiano das
pessoas”
“Computação ubíqua tem como objetivo tornar a interação homem computador
invisível, ou seja, integrar a informática com as ações e comportamentos naturais
das pessoas”
Para que um software atenda um domínio, é necessário que se estabeleça, em
primeiro lugar, uma linguagem Ubíquia ou seja, linguagem comum, com termos
bem definidos, que fazem parte do domínio do negócio e que são usados por
todas as pessoas que fazem parte do processo de desenvolvimento.
Projeto Dirigido pelo Modelo (Model Driven Design – MDD). A ideia por
trás de MDD é a de que o seu modelo abstrato deve ser uma representação
perfeita do seu domínio.
MDD – Model Driven Design
UML ajuda muito nessa fase mas, use com cuidado!
Blocos de Construção
Blocos de Construção
DDD na prática
Camada de domínio. Para modelar essa parte, utilizamos alguns Padrões propostos em DDD.
Chamados de blocos de construção, utilizados para representar nosso modelo abstrato. Esses blocos
podem ser:
Entidades - classes de objetos que necessitam de uma identidade.
Objetos de Valores - objetos que só carregam valores, mas que não possuem distinção
de identidade.
Agregados - compostos de Entidades ou Objetos de Valores que são encapsulados numa
única classe
Fábricas - classes responsáveis pelo processo de criação dos Agregados ou dos Objetos
de Valores
Serviços - classes que contêm lógica de negócio, mas que não pertencem a nenhuma
Entidade ou Objetos de Valores.
Repositórios - classes responsáveis por administrar o ciclo de vida dos outros objetos,
normalmente Entidades, Objetos de Valor e Agregados.
DDD na prática
Camada de domínio. Para modelar essa parte, utilizamos alguns Padrões propostos em DDD.
Chamados de blocos de construção, utilizados para representar nosso modelo abstrato. Esses blocos
podem ser:
Entidades - classes de objetos que necessitam de uma identidade.
Objetos de Valores - objetos que só carregam valores, mas que não possuem distinção
de identidade.
Agregados - compostos de Entidades ou Objetos de Valores que são encapsulados numa
única classe
Fábricas - classes responsáveis pelo processo de criação dos Agregados ou dos Objetos
de Valores
Serviços - classes que contêm lógica de negócio, mas que não pertencem a nenhuma
Entidade ou Objetos de Valores.
Repositórios - classes responsáveis por administrar o ciclo de vida dos outros objetos,
normalmente Entidades, Objetos de Valor e Agregados.
Objeto de Valor (Value Object)
Muitos objetos não possuem nenhuma identidade conceitual. Esses objetos descrevem alguma
característica de alguma coisa.
Características
- Medir
- Quantificar
- Descrever
Imutabilidade
“This is one of the most important aspects of a Value Object to grasp. Object values should not be
able to be altered over their life-time. Because of this immutability, Value Objects are easy to reason,
test and are free of undesired/unexpected side-effects.” (Carlos Buenosvinos, Christian Soronellas
and Keyvan Akbary DDD in PHP)
Objetos de Valor x Entidades
class Currency
{
private $isoCode;
public function __construct($anIsoCode)
{
$this->setIsoCode($anIsoCode);
}
private function setIsoCode($anIsoCode)
{
if (!preg_match('/^[A-Z]{3}$/', $anIsoCode)) {
throw new InvalidArgumentException();
}
$this->isoCode = $anIsoCode;
}
public function isoCode()
{
return $this->isoCode;
}
}
class Money
{
private $amount;
private $currency;
public function __construct($anAmount, Currency $aCurrency)
{
$this->setAmount($anAmount);
$this->setCurrency($aCurrency);
}
private function setAmount($anAmount)
{
$this->amount = (int) $anAmount;
}
private function setCurrency(Currency $aCurrency)
{
$this->currency = $aCurrency;
}
}
class Money
{
/……/
public static function fromMoney(Money $aMoney)
{
return new self(
$aMoney->amount(),
$aMoney->currency()
);
}
public static function ofCurrency(Currency $aCurrency)
{
return new self(0, $aCurrency);
}
}
class Money
{
/……/
public function increaseAmountBy($anAmount)
{
return new self(
$this->amount() + $anAmount,
$this->currency()
);
}
public function add(Money $money)
{
if (!$money->currency()->equals($this->currency())) {
throw new InvalidArgumentException();
}
return new self(
$money->amount() + $this->amount(),
$this->currency()
);
}
}
$a = new Currency('BRL');
$b = new Currency('BRL');
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
$c = new Currency('EUR');
var_dump($a == $c); // bool(false)
var_dump($a === $c); // bool(false)
class MoneyTest extends PHPUnit_Test_TestCase
{
Const BRAZIL_CURRENCY = "BRL";
public function testCopiedMoneyShouldRepresentSameValue()
{
$aMoney = new Money(100, new Currency(self::BRAZIL_CURRENCY));
$copiedMoney = Money::fromMoney($aMoney);
$this->assertTrue($aMoney->equals($copiedMoney));
}
public function testOriginalMoneyShouldNotBeModifiedOnAddition()
{
$aMoney = new Money(100, new Currency(self::BRAZIL_CURRENCY));
$aMoney->add(new Money(20, new Currency(self::BRAZIL_CURRENCY)));
$this->assertEquals(100, $aMoney->amount());
}
public function testMoneysShouldBeAdded()
{
$aMoney = new Money(100, new Currency(self::BRAZIL_CURRENCY));
$newMoney = $aMoney->add(new Money(20, new Currency(self::BRAZIL_CURRENCY)));
$this->assertEquals(120, $newMoney->amount());
}
}
Persistindo Objetos de Valor
Objetos de valor não são persistidos por conta própria, até por que eles não
possuem identificação. Geralmente um Objeto de Valor é gravado como atributos
de um agregado que possue identificação lógica no sistema.
<?php
class Product
{
private $productId;
private $name;
private $price;
public function __construct(
$aProductId,
$aName,
Money $aPrice
) {
$this->setProductId($aProductId);
$this->setName($aName);
$this->setPrice($aPrice);
}
// ...
}
<?php
interface ProductRepository {
/**
* @param Product $aProduct
* @return bool
*/
public function add(Product $aProduct);
/.../
}
$productRepository = $this->get('repository.product');
$product = new Product(
$productRepository->nextIdentity(),
'Camiseta PHP Experience 2015',
new Money(999, new Currency('BRL'))
);
$productRepository->add($product);
class DbalProductRepository extends DbalRepository implements
ProductRepository
{
public function add(Product $aProduct)
{
$sql = 'INSERT INTO products VALUES (?, ?, ?, ?)';
$stmt = $this->connection()->prepare($sql);
$stmt->bindValue(1, $aProduct->id());
$stmt->bindValue(2, $aProduct->name());
$stmt->bindValue(3, $aProduct->price()->amount());
$stmt->bindValue(4, $aProduct->price()->currency()->isoCode());
$stmt->execute();
// ...
}
}
class DbalProductRepository extends DbalRepository implements
ProductRepository
{
public function productOfId($anId)
{
$sql = 'SELECT * FROM products WHERE id = ?';
$stmt = $this->connection()->prepare($sql);
$stmt->bindValue(1, $anId);
$res = $stmt->execute();
// ...
return new Product(
$row['id'],
$row['name'],
new Money(
$row['price_amount'],
new Currency(
$row['price_currency']
)
)
);
}
}
Entidade (Entity)
Muitos objetos não são fundamentalmente definidos por seus atributos, mas sim por uma linha de
continuidade e identidade
class Person {
private $identificationNumber;
private $firstName;
private $lastName;
public function __construct($anIdentificationNumber, $aFirstName, $aLastName) {
$this->identificationNumber = $anIdentificationNumber;
$this->firstName = $aFirstName;
$this->lastName = $aLastName;
}
public function identificationNumber() {
return $this->identificationNumber;
}
public function firstName() {
return $this->firstName;
}
public function lastName() {
return $this->lastName;
}
}
namespace DomainEntity;
class Product
{
private $id;
private $name;
private $description;
private $ean;
private $price;
private $measure;
private $category;
private $specification;
public function __construct(Category $category,
VOSpecification $specification,
VOPrice $price,
VOMeasure $measure,
$id)
{
$this->category = $category;
$this->id = $id;
$this->measure = $measure;
$this->price = $price;
$this->specification = $specification;
}
}
Pequenos exemplos sobre isolamento de domínio
Pequena explicação
BISO
BUSINESS ISOLATION
github.com/pvgomes/zend2biso
github.com/pvgomes/symfony2biso
github.com/pvgomes/biso
Building blocks
Referência
Referência
Domain-Driven Design in PHP
Real examples written in PHP showcasing DDD Architectural
Styles, Tactical Design, and Bounded Context Integration.
Carlos Buenosvinos, Christian Soronellas and Keyvan Akbary
http://leanpub.com/ddd-in-php
Perguntas?
https://www.slideshare.net/profpv/ddd-in-php

Mais conteúdo relacionado

Mais procurados

Domain Driven Design(DDD) Presentation
Domain Driven Design(DDD) PresentationDomain Driven Design(DDD) Presentation
Domain Driven Design(DDD) PresentationOğuzhan Soykan
 
Domain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledDomain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledNicola Costantino
 
Implementing DDD Concepts in PHP
Implementing DDD Concepts in PHPImplementing DDD Concepts in PHP
Implementing DDD Concepts in PHPSteve Rhoades
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Alan Christensen
 
Applying Domain-Driven Design to craft Rich Domain Models
Applying Domain-Driven Design to craft Rich Domain ModelsApplying Domain-Driven Design to craft Rich Domain Models
Applying Domain-Driven Design to craft Rich Domain ModelsAlexander van Trijffel
 
Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄현 수
 
Domain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and MicroservicesDomain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and MicroservicesRadosław Maziarka
 
Domain driven design
Domain driven designDomain driven design
Domain driven designits_skm
 
Domain Driven Design Introduction
Domain Driven Design IntroductionDomain Driven Design Introduction
Domain Driven Design Introductionwojtek_s
 
Modelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven DesignModelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven DesignNaeem Sarfraz
 
DevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDDevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDGregory Boissinot
 
Kinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vnKinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vnDotnet Open Group
 
Clean architecture
Clean architectureClean architecture
Clean architecture.NET Crowd
 
DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018
DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018
DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018Paulo Clavijo
 

Mais procurados (20)

Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Domain Driven Design(DDD) Presentation
Domain Driven Design(DDD) PresentationDomain Driven Design(DDD) Presentation
Domain Driven Design(DDD) Presentation
 
Domain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledDomain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) Distilled
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Implementing DDD Concepts in PHP
Implementing DDD Concepts in PHPImplementing DDD Concepts in PHP
Implementing DDD Concepts in PHP
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
 
Domain driven design
Domain driven designDomain driven design
Domain driven design
 
Applying Domain-Driven Design to craft Rich Domain Models
Applying Domain-Driven Design to craft Rich Domain ModelsApplying Domain-Driven Design to craft Rich Domain Models
Applying Domain-Driven Design to craft Rich Domain Models
 
Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄
 
Domain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and MicroservicesDomain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and Microservices
 
Domain driven design
Domain driven designDomain driven design
Domain driven design
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Domain Driven Design Introduction
Domain Driven Design IntroductionDomain Driven Design Introduction
Domain Driven Design Introduction
 
Modelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven DesignModelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven Design
 
BDD com Cucumber
BDD com CucumberBDD com Cucumber
BDD com Cucumber
 
DevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDDevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDD
 
JAVA - Orientação a Objetos
JAVA - Orientação a ObjetosJAVA - Orientação a Objetos
JAVA - Orientação a Objetos
 
Kinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vnKinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vn
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018
DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018
DDD Strategic Design - Context Maps - Paulo Clavijo - April 2018
 

Destaque

Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)Mauro Leal
 
REST - Padroes e Melhores Praticas
REST - Padroes e Melhores PraticasREST - Padroes e Melhores Praticas
REST - Padroes e Melhores PraticasFelipe Firmo
 
DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven DesignJonatas Saraiva
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDDGiovanni Bassi
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com PythonFrederico Cabral
 
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecerInterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouqueceriMasters
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Entendendo Domain-Driven Design
Entendendo Domain-Driven DesignEntendendo Domain-Driven Design
Entendendo Domain-Driven DesignRafael Ponte
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#Pascal Laurin
 
Developing microservices with aggregates (SpringOne platform, #s1p)
Developing microservices with aggregates (SpringOne platform, #s1p)Developing microservices with aggregates (SpringOne platform, #s1p)
Developing microservices with aggregates (SpringOne platform, #s1p)Chris Richardson
 

Destaque (14)

Workshop DDD
Workshop DDDWorkshop DDD
Workshop DDD
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)
 
REST - Padroes e Melhores Praticas
REST - Padroes e Melhores PraticasREST - Padroes e Melhores Praticas
REST - Padroes e Melhores Praticas
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven Design
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDD
 
Introdução ao DDD
Introdução ao DDDIntrodução ao DDD
Introdução ao DDD
 
Domain driven design - Visão Geral
Domain driven design - Visão GeralDomain driven design - Visão Geral
Domain driven design - Visão Geral
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com Python
 
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecerInterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Entendendo Domain-Driven Design
Entendendo Domain-Driven DesignEntendendo Domain-Driven Design
Entendendo Domain-Driven Design
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#
 
Developing microservices with aggregates (SpringOne platform, #s1p)
Developing microservices with aggregates (SpringOne platform, #s1p)Developing microservices with aggregates (SpringOne platform, #s1p)
Developing microservices with aggregates (SpringOne platform, #s1p)
 

Semelhante a Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes

Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Paulo Victor Gomes
 
Domain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem IntrodutóriaDomain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem Introdutóriaarmeniocardoso
 
DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven DesignÍtalo Bandeira
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Domain-Driven-Design
 Domain-Driven-Design Domain-Driven-Design
Domain-Driven-DesignWende Mendes
 
Domain-Driven-Design
Domain-Driven-DesignDomain-Driven-Design
Domain-Driven-DesignWende Mendes
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POODaniel Brandão
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoMarcius Brandão
 
Uma introdução ao Domain Driven Design
Uma introdução ao Domain Driven DesignUma introdução ao Domain Driven Design
Uma introdução ao Domain Driven DesignLambda3
 
Desenvolvimento de software orientado a aspectos
Desenvolvimento de software orientado a aspectosDesenvolvimento de software orientado a aspectos
Desenvolvimento de software orientado a aspectosAlessandro
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptGustavo Corrêa Alves
 
Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Luis Ferreira
 
Conceitos de Orientação A Objeto
Conceitos de Orientação A ObjetoConceitos de Orientação A Objeto
Conceitos de Orientação A ObjetoLuciano Almeida
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Ryan Padilha
 
Umlv4 090813182632-phpapp02
Umlv4 090813182632-phpapp02Umlv4 090813182632-phpapp02
Umlv4 090813182632-phpapp02Jhonefj
 

Semelhante a Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes (20)

Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014
 
Domain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem IntrodutóriaDomain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem Introdutória
 
DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven Design
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Domain-Driven-Design
 Domain-Driven-Design Domain-Driven-Design
Domain-Driven-Design
 
Domain-Driven-Design
Domain-Driven-DesignDomain-Driven-Design
Domain-Driven-Design
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Treinamento DDD .Net
Treinamento DDD .NetTreinamento DDD .Net
Treinamento DDD .Net
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da Dissertacao
 
clean code
clean codeclean code
clean code
 
Uma introdução ao Domain Driven Design
Uma introdução ao Domain Driven DesignUma introdução ao Domain Driven Design
Uma introdução ao Domain Driven Design
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Desenvolvimento de software orientado a aspectos
Desenvolvimento de software orientado a aspectosDesenvolvimento de software orientado a aspectos
Desenvolvimento de software orientado a aspectos
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in Javascript
 
Naked Objects
Naked ObjectsNaked Objects
Naked Objects
 
Aula1
Aula1Aula1
Aula1
 
Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos
 
Conceitos de Orientação A Objeto
Conceitos de Orientação A ObjetoConceitos de Orientação A Objeto
Conceitos de Orientação A Objeto
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
 
Umlv4 090813182632-phpapp02
Umlv4 090813182632-phpapp02Umlv4 090813182632-phpapp02
Umlv4 090813182632-phpapp02
 

Mais de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Mais de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes

  • 1. Domain-Driven Design além da teoria Paulo Victor L. L. Gomes
  • 2. Presentation licensed by Share - Keep license - noncommercial http://creativecommons.org/licenses/by-nc-sa/3.0/
  • 3. Domain-Driven Design? Domain-Driven Design é uma abordagem para o Desenvolvimento de Software que estabelece uma forte ligação entre a implementação e o modelo evolutivo dos conceitos de negócio. Implementação X Negócios
  • 5. Primeira resposta “Vai escrevendo código ai, quando precisar coloque na camada de apresentação, no banco de dados nos controles, modelos, na configuração do webserver e não esquece do xml e aquele if maroto no APPLICATION_ENV”
  • 9. Orientação a Objetos Meu framework já usa Orientação a Objetos. Esse papo é muito antigo e eu já superei esse problema.
  • 10. Orientação a Objetos Olha meu código... public function imagodAction() { $local=VdModel::getLocalStorageAdapter();$items=$purchase->getItemCollection()->getItems();$Items=$this- >cart->getItems();$index=array();$catalogHelper=newGodHelper();$quantityCartByidentifier=array(); $itemsRemove=array();foreach($itemsas$salespurchaseItem){$quantityCartByidentifier[$salespurchaseItem- >getidentifier()]=(isset($quantityCartByidentifier[$salespurchaseItem->getidentifier()])? $quantityCartByidentifier[$salespurchaseItem->getidentifier()]+1:1);foreach($itemsas$salespurchaseItem){if ($salespurchaseItem->getBundleidentifier()&&!isset($index[$salespurchaseItem->getBundleidentifier()])) {'uniqueAttributes'=>CatalogHelper::getSimpleUniqueAttributes($product,$salespurchaseItem- >getidentifier()),'color_cart'=>isset($product['meta']['color_family'])?$product['meta'] ['color_family']:'','shipment_delivery_time'=>$salespurchaseItem->getShipmentTotalDeliveryTime(),)), 'bundleproducts'=>array($simples[$salespurchaseItem->getidentifier()]=>(isset($simples[$salespurchaseItem- >getidentifier()])?$simples[$salespurchaseItem->getidentifier()]+1:1)),);$bundleproduct=$local->get ('product',(strstr($salespurchaseItem->getBundleidentifier(),'-',true))); //resolveproducturable$product=$local->get('product',($simples[$salespurchaseItem->getidentifier()])); $simple=$product['simples'][$salespurchaseItem->getidentifier()];$identifierHandle=$salespurchaseItem- >getBundleidentifier();if(isset($bundleproduct['products'][$simples[$salespurchaseItem->getidentifier()]] ['quantity_items'])){$quantityItems=$bundleproduct['products'][$simples[$salespurchaseItem- >getidentifier()]]['quantity_items'];}else{$quantityItems=1;$itemsRemove[]=$salespurchaseItem- >getBundleidentifier();}$index[$identifierHandle]['salespurchaseItem']->setShipmentTotalDeliveryTime(max ($index[$identifierHandle]['salespurchaseItem']->getShipmentTotalDeliveryTime(),$salespurchaseItem- >getShipmentTotalDeliveryTime()));$index[$identifierHandle]['stock']=min($simple['meta']['quantity'],$index [$identifierHandle]['stock']);$index[$identifierHandle]['cart_rule_discount']+=$salespurchaseItem- >getCartRuleDiscount();if(isset($index[$identifierHandle]['bundleproducts'][$simples[$salespurchaseItem- >getidentifier()]])){if($index[$identifierHandle]['bundleproducts'][$simples[$salespurchaseItem- >getidentifier()]]<$quantityItems){$index[$identifierHandle]['salespurchaseItem']->setUnitPrice($index [$identifierHandle]['salespurchaseItem']->getUnitPrice()+$salespurchaseItem->getUnitPrice());$index [$identifierHandle]['salespurchaseItem']->setPaidPrice($index[$identifierHandle]['salespurchaseItem']-
  • 11. Orientação a Objetos Quando pensamos em POO logo pensamos em Classes, Encapsulamento, Polimorfismo, Herança... POO é mais que isso, a essência da POO é alinhamento do código com o negócio, reutilização, mínimo de acoplamento, linguagem natural...
  • 12. Como eu uso? De onde eu começo? sudo apt-get install ddd (#sqn) Domain Driven Design
  • 13. O desafio proposto... Comunicação entre equipe de produto e desenvolvimento
  • 14. O mundo como ele é...
  • 15. Linguagem Ubíqua Definições de Ubíqua “O termo foi usado pela primeira vez pelo cientista Norte-Americano Mark Weiser em 1988 e publicado em 1991 no seu artigo The Computer for the 21st Century” “termo usado para descrever a onipresença da informática no cotidiano das pessoas” “Computação ubíqua tem como objetivo tornar a interação homem computador invisível, ou seja, integrar a informática com as ações e comportamentos naturais das pessoas” Para que um software atenda um domínio, é necessário que se estabeleça, em primeiro lugar, uma linguagem Ubíquia ou seja, linguagem comum, com termos bem definidos, que fazem parte do domínio do negócio e que são usados por todas as pessoas que fazem parte do processo de desenvolvimento.
  • 16. Projeto Dirigido pelo Modelo (Model Driven Design – MDD). A ideia por trás de MDD é a de que o seu modelo abstrato deve ser uma representação perfeita do seu domínio. MDD – Model Driven Design UML ajuda muito nessa fase mas, use com cuidado!
  • 19. DDD na prática Camada de domínio. Para modelar essa parte, utilizamos alguns Padrões propostos em DDD. Chamados de blocos de construção, utilizados para representar nosso modelo abstrato. Esses blocos podem ser: Entidades - classes de objetos que necessitam de uma identidade. Objetos de Valores - objetos que só carregam valores, mas que não possuem distinção de identidade. Agregados - compostos de Entidades ou Objetos de Valores que são encapsulados numa única classe Fábricas - classes responsáveis pelo processo de criação dos Agregados ou dos Objetos de Valores Serviços - classes que contêm lógica de negócio, mas que não pertencem a nenhuma Entidade ou Objetos de Valores. Repositórios - classes responsáveis por administrar o ciclo de vida dos outros objetos, normalmente Entidades, Objetos de Valor e Agregados.
  • 20. DDD na prática Camada de domínio. Para modelar essa parte, utilizamos alguns Padrões propostos em DDD. Chamados de blocos de construção, utilizados para representar nosso modelo abstrato. Esses blocos podem ser: Entidades - classes de objetos que necessitam de uma identidade. Objetos de Valores - objetos que só carregam valores, mas que não possuem distinção de identidade. Agregados - compostos de Entidades ou Objetos de Valores que são encapsulados numa única classe Fábricas - classes responsáveis pelo processo de criação dos Agregados ou dos Objetos de Valores Serviços - classes que contêm lógica de negócio, mas que não pertencem a nenhuma Entidade ou Objetos de Valores. Repositórios - classes responsáveis por administrar o ciclo de vida dos outros objetos, normalmente Entidades, Objetos de Valor e Agregados.
  • 21. Objeto de Valor (Value Object) Muitos objetos não possuem nenhuma identidade conceitual. Esses objetos descrevem alguma característica de alguma coisa.
  • 22. Características - Medir - Quantificar - Descrever Imutabilidade “This is one of the most important aspects of a Value Object to grasp. Object values should not be able to be altered over their life-time. Because of this immutability, Value Objects are easy to reason, test and are free of undesired/unexpected side-effects.” (Carlos Buenosvinos, Christian Soronellas and Keyvan Akbary DDD in PHP)
  • 23. Objetos de Valor x Entidades
  • 24. class Currency { private $isoCode; public function __construct($anIsoCode) { $this->setIsoCode($anIsoCode); } private function setIsoCode($anIsoCode) { if (!preg_match('/^[A-Z]{3}$/', $anIsoCode)) { throw new InvalidArgumentException(); } $this->isoCode = $anIsoCode; } public function isoCode() { return $this->isoCode; } }
  • 25. class Money { private $amount; private $currency; public function __construct($anAmount, Currency $aCurrency) { $this->setAmount($anAmount); $this->setCurrency($aCurrency); } private function setAmount($anAmount) { $this->amount = (int) $anAmount; } private function setCurrency(Currency $aCurrency) { $this->currency = $aCurrency; } }
  • 26. class Money { /……/ public static function fromMoney(Money $aMoney) { return new self( $aMoney->amount(), $aMoney->currency() ); } public static function ofCurrency(Currency $aCurrency) { return new self(0, $aCurrency); } }
  • 27. class Money { /……/ public function increaseAmountBy($anAmount) { return new self( $this->amount() + $anAmount, $this->currency() ); } public function add(Money $money) { if (!$money->currency()->equals($this->currency())) { throw new InvalidArgumentException(); } return new self( $money->amount() + $this->amount(), $this->currency() ); } }
  • 28. $a = new Currency('BRL'); $b = new Currency('BRL'); var_dump($a == $b); // bool(true) var_dump($a === $b); // bool(false) $c = new Currency('EUR'); var_dump($a == $c); // bool(false) var_dump($a === $c); // bool(false)
  • 29. class MoneyTest extends PHPUnit_Test_TestCase { Const BRAZIL_CURRENCY = "BRL"; public function testCopiedMoneyShouldRepresentSameValue() { $aMoney = new Money(100, new Currency(self::BRAZIL_CURRENCY)); $copiedMoney = Money::fromMoney($aMoney); $this->assertTrue($aMoney->equals($copiedMoney)); } public function testOriginalMoneyShouldNotBeModifiedOnAddition() { $aMoney = new Money(100, new Currency(self::BRAZIL_CURRENCY)); $aMoney->add(new Money(20, new Currency(self::BRAZIL_CURRENCY))); $this->assertEquals(100, $aMoney->amount()); } public function testMoneysShouldBeAdded() { $aMoney = new Money(100, new Currency(self::BRAZIL_CURRENCY)); $newMoney = $aMoney->add(new Money(20, new Currency(self::BRAZIL_CURRENCY))); $this->assertEquals(120, $newMoney->amount()); } }
  • 30. Persistindo Objetos de Valor Objetos de valor não são persistidos por conta própria, até por que eles não possuem identificação. Geralmente um Objeto de Valor é gravado como atributos de um agregado que possue identificação lógica no sistema.
  • 31. <?php class Product { private $productId; private $name; private $price; public function __construct( $aProductId, $aName, Money $aPrice ) { $this->setProductId($aProductId); $this->setName($aName); $this->setPrice($aPrice); } // ... }
  • 32. <?php interface ProductRepository { /** * @param Product $aProduct * @return bool */ public function add(Product $aProduct); /.../ }
  • 33. $productRepository = $this->get('repository.product'); $product = new Product( $productRepository->nextIdentity(), 'Camiseta PHP Experience 2015', new Money(999, new Currency('BRL')) ); $productRepository->add($product);
  • 34. class DbalProductRepository extends DbalRepository implements ProductRepository { public function add(Product $aProduct) { $sql = 'INSERT INTO products VALUES (?, ?, ?, ?)'; $stmt = $this->connection()->prepare($sql); $stmt->bindValue(1, $aProduct->id()); $stmt->bindValue(2, $aProduct->name()); $stmt->bindValue(3, $aProduct->price()->amount()); $stmt->bindValue(4, $aProduct->price()->currency()->isoCode()); $stmt->execute(); // ... } }
  • 35. class DbalProductRepository extends DbalRepository implements ProductRepository { public function productOfId($anId) { $sql = 'SELECT * FROM products WHERE id = ?'; $stmt = $this->connection()->prepare($sql); $stmt->bindValue(1, $anId); $res = $stmt->execute(); // ... return new Product( $row['id'], $row['name'], new Money( $row['price_amount'], new Currency( $row['price_currency'] ) ) ); } }
  • 36. Entidade (Entity) Muitos objetos não são fundamentalmente definidos por seus atributos, mas sim por uma linha de continuidade e identidade
  • 37. class Person { private $identificationNumber; private $firstName; private $lastName; public function __construct($anIdentificationNumber, $aFirstName, $aLastName) { $this->identificationNumber = $anIdentificationNumber; $this->firstName = $aFirstName; $this->lastName = $aLastName; } public function identificationNumber() { return $this->identificationNumber; } public function firstName() { return $this->firstName; } public function lastName() { return $this->lastName; } }
  • 38. namespace DomainEntity; class Product { private $id; private $name; private $description; private $ean; private $price; private $measure; private $category; private $specification; public function __construct(Category $category, VOSpecification $specification, VOPrice $price, VOMeasure $measure, $id) { $this->category = $category; $this->id = $id; $this->measure = $measure; $this->price = $price; $this->specification = $specification; } }
  • 39. Pequenos exemplos sobre isolamento de domínio
  • 43. Referência Domain-Driven Design in PHP Real examples written in PHP showcasing DDD Architectural Styles, Tactical Design, and Bounded Context Integration. Carlos Buenosvinos, Christian Soronellas and Keyvan Akbary http://leanpub.com/ddd-in-php