SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
pen4education
Domain-Driven Design
Paulo Victor L. L. Gomes
Projeto Orientado a Domínio com PHP
pen4education
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
pen4education
Fundamentação
Onde colocar a
regra de negócio?
pen4education
Fundamentação
“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”
pen4education
Fundamentação
Encapsule, Daniel San
pen4education
Encapsulamento
Encapsule a regra de negócio! Fazendo isso,
garantimos consistência e simplicidade.
pen4education
Orientação a Objetos?
pen4education
Orientação a Objetos
Meu framework já usa
Orientação a Objetos.
Esse papo é muito
antigo e eu já superei
esse problema.
pen4education
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']-
>getPaidPrice()+$salespurchaseItem->getPaidPrice());$index[$identifierHandle]['salespurchaseItem']-
>setOriginalUnitPrice($index[$identifierHandle]['salespurchaseItem']->getOriginalUnitPrice()
+$salespurchaseItem->getOriginalUnitPrice());}$index[$identifierHan}; if($salespurchaseItem[‘ai’][‘meu’]
[‘deus’][‘eu’][‘sou’][‘o’][‘cara’][‘da’][‘programacao’][‘ever’] == 234 && ..
pen4education
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...
pen4education
Domain Driven Design
Como eu uso? De onde eu
começo?
sudo apt-get install ddd (#sqn)
pen4education
O desafio proposto...
Comunicação entre equipe de produto e
desenvolvimento
pen4education
O mundo como ele é...
pen4education
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.
pen4education
Model Driven Design
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.
O MDD defende o processo
ágil, o trabalho em equipe
ou seja, especialistas em
negócio, desenvolvedores e
arquitetos trabalhando
juntos.
Diagramas da UML ajudam
o entedimento do domínio.
pen4education
Blocos de Construção
Encapsulando o modelo de domínio.
Interface de Usuário – Interação com o
usuário;
Aplicação – essa camada não possui lógica de
negócio. Ela é apenas uma camada fina,
responsável por conectar a Interface de Usuário às
camadas inferiores;
Domínio – representa os conceitos, regras
e lógicas de negócio. Todo o foco de DDD
está nessa camada. Nosso trabalho, daqui
para frente, será aperfeiçoar e compreender
profundamente essa parte;
Infra-estrutura – fornece recursos técnicos que
darão suporte às camadas superiores. São
normalmente as partes de um sistema
responsáveis por persistência de dados, conexões
com bancos de dados, etc.
pen4education
Entidades
Muitos objetos não são fundamentalmente definidos por seus atributos, mas sim por uma linha de
continuidade e identidade
pen4education
Entidades
<?php
class Exercicio_Negocio_Exercicio {
private $id;
private $nome;
private $descricao;
private $exercicioMercanismo;
private $autocorreção;
public function getExercicioMercanismo() {
if ($this->exercicioMecanismo == null && $this->entidadeValida()) {
$elementDAO = Exercicio_Infraestrutura_Model_Dao_ExercicioDAOFactory::getInstance()->getExercicioDAO();
$this->exercicioMecanismo = $elementDAO->getMecanismoExercicio($this);
}
return $this->exercicioMercanismo;
}
public function gravar()
{
$exercicioDAO = Exercicio_Infraestrutura_Model_Dao_ExercicioDAOFactory::getInstance()->getExercicioDAO();
return $exercicioDAO->persist($this);
}
public function getExercicioConteudo(ACSNegocioNucleoUsuario $usuario)
{
return Exercicio_Negocio_ExercicioConteudo::buscarPorUsuarioExercicio($this, $usuario);
}
private function entidadeValida() {
$entidadeValida = false;
if ($this->getId() != null) {
$entidadeValida = true;
}
return $entidadeValida;
}
}
pen4education
Objetos de valor
Muitos objetos não possuem nenhuma identidade conceitual. Esses objetos descrevem alguma
característica de alguma coisa.
pen4education
Objetos de valor
<?php
namespace ProductModelVo;
class Price
{
Const CURRENCY = 'R$';
private $price;
private $discountPercentage;
private $discount;
// get's and set's
public function getPrice()
{
// business rules to return price
}
public function setSpecialPrice($setSpecialPrice)
{
if ($specialPrice >= $this->getPrice()) {
$specialPrice = null;
}
$this->specialPrice = $specialPrice;
}
public function setSpecialPriceComparison($specialPriceComparison)
{
$this->specialPriceComparison = $specialPriceComparison;
if ($this->verifyPriceComparison()) {
$this->setSpecialPrice($specialPriceComparison);
}
}
private function verifyPriceComparison()
{
// verify channels...
}
}
pen4education
Serviços
Ás vezes, a situação simplesmente não se trata de alguma coisa.
Em algums casos, um design mais limpo e mais pragmático inclui operações que não pertencem
conceitualmente a nenhum objeto. Em vez de forçar a questão, podemos seguir os limites naturais do espaço
do problema e incluir SERVIÇOS explicitamente no modelo.
pen4education
Serviços
<?php
namespace ProductService;
class Catalog {
Const BALANCE_STANDARD_STOCK = 0;
protected $catalogRepo;
public function __construct(RepositoryInterface $catalogRepo)
{
$this->catalogRepo = $catalogRepo;
}
public function getBalanceStock(Item $item)
{
$balanceStock = self::BALANCE_STANDARD_STOCK;
$stockReserved = $this->catalogRepo->getQuantityReservedStock($item);
$currentBalance = (int) ($item->getQuantity() - $stockReserved);
if ($currentBalance > $balanceStock) {
$balanceStock = $currentBalance;
}
return $balanceStock;
}
}
pen4education
Agregados
O design detalhado de associações ajuda a simplificar um comportamento de um objeto mas, em
diversos casos, existe a necessidade de explorar a modelagem se adequando com o domínio complexo.
pen4education
Agregados
<?php
namespace ProductModelAggregate;
class Product extents AbstractProduct
{
/** @var ProductModelVoPrice */
protected $price;
/** @var ProductModelCollectionItem */
protected $itemCollection;
public function getItemCollection()
{
if ($this->hasItemCollection() && $this->getIdentification()) {
$this->setItemCollection($this->getProductService()->getItemCollectionByIdentification($this->getIdentification()));
}
}
public function hasItemCollection()
{
$hasItemCollection = false;
if ($this->ItemCollection) {
if ($this->ItemCollection instanceof ProductModelCollectionItem) {
$hasItemCollection = true;
}
}
}
public function getQuantity()
{
$quantity = 0;
if (($this->hasItemCollection()) && ($this->ItemCollection->count() >= 1)) {
$quantity = $this->calculateQuantity();
}
return $quantity;
}
}
pen4education
Fábricas
Quando a criação de um objeto ou um AGREGADO inteiro se torna complicada ou revela uma grande
parte de estrutura interna, as FÁBRICAS fornecem o encapsulamento.
pen4education
Fábricas
class OrderFactory{
public static function createOrder(ICustomer $customer, ProductCollection $productCollection) {
$order = new Order($customer, $productCollection);
$customerPayment = PaymentFactory::createCustomerPayment($customer);
if ($customerPayment->hasRecurrent()) {
$order->setPayment($customerPayment)
}
return $order;
}
}
pen4education
Repositórios
Associações nos permitem achar um objeto baseado em sua relação com outro objeto. Mas é preciso ter
um ponto de partida para uma travessia até uma ENTIDADE ou um VALOR no meio do seu ciclo de vida.
pen4education
Repositórios
<?php
namespace ApplicationModel;
class ConfigurationRepository implements RepositoryInterface
{
protected $dataMapper = null;
protected $entityContext;
public function __constuct(DataMapper $dataMapper)
{
$this->dataMapper = $dataMapper;
$this->dataMapper->entityContext($this->getEntityContext());
}
public function findAll()
{
return $this->dataMapper->listAll();
}
public function findById($id)
{
$configurationEntity = false;
$configurations = $this->dataMapper->findBy(array('id' => $id));
if ($configurations) {
$configurationEntity = $configurations->current();
}
return $configurationEntity;
}
}
pen4education
Tijolos de construção
pen4education
MagiZ, a Plataforma Educacional
Online completa, configurável e
fácil de usar.
www.magiz.com.br
pen4education
pen4education
Minha última experiência
pen4education
DDD no ZF2
https://github.com/pvgomes/dddzf2
pen4education
Perguntas?
pen4education
Referência

Mais conteúdo relacionado

Mais procurados

DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven DesignÍtalo Bandeira
 
DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven DesignJonatas Saraiva
 
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
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpRodrigo Aramburu
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeAdriano Tavares
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webelliando dias
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 

Mais procurados (14)

DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven Design
 
Solid
SolidSolid
Solid
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
 
DDD – Domain Driven Design
DDD – Domain Driven DesignDDD – Domain Driven Design
DDD – Domain Driven Design
 
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
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
Palestra
PalestraPalestra
Palestra
 
Php 05 Mvc
Php 05 MvcPhp 05 Mvc
Php 05 Mvc
 
RYSYS Overview
RYSYS OverviewRYSYS Overview
RYSYS Overview
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java ee
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 

Destaque

Implementing DDD Concepts in PHP
Implementing DDD Concepts in PHPImplementing DDD Concepts in PHP
Implementing DDD Concepts in PHPSteve Rhoades
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in phpLeonardo Proietti
 
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...Aaron Saray
 
Anatomy of a Modern PHP Application Architecture
Anatomy of a Modern PHP Application Architecture Anatomy of a Modern PHP Application Architecture
Anatomy of a Modern PHP Application Architecture AppDynamics
 
Domain Driven Design using Laravel
Domain Driven Design using LaravelDomain Driven Design using Laravel
Domain Driven Design using Laravelwajrcs
 
Software Design Patterns in Laravel by Phill Sparks
Software Design Patterns in Laravel by Phill SparksSoftware Design Patterns in Laravel by Phill Sparks
Software Design Patterns in Laravel by Phill SparksPhill Sparks
 

Destaque (7)

Implementing DDD Concepts in PHP
Implementing DDD Concepts in PHPImplementing DDD Concepts in PHP
Implementing DDD Concepts in PHP
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in php
 
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...
 
Anatomy of a Modern PHP Application Architecture
Anatomy of a Modern PHP Application Architecture Anatomy of a Modern PHP Application Architecture
Anatomy of a Modern PHP Application Architecture
 
Domain Driven Design using Laravel
Domain Driven Design using LaravelDomain Driven Design using Laravel
Domain Driven Design using Laravel
 
Software Design Patterns in Laravel by Phill Sparks
Software Design Patterns in Laravel by Phill SparksSoftware Design Patterns in Laravel by Phill Sparks
Software Design Patterns in Laravel by Phill Sparks
 
Hexagonal architecture in PHP
Hexagonal architecture in PHPHexagonal architecture in PHP
Hexagonal architecture in PHP
 

Semelhante a 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óriaarmeniocardoso
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptGustavo Corrêa Alves
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Pablo Dall'Oglio
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraDavid O'Keefe
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
DDD e PHP - TDC 2012
DDD e PHP - TDC 2012DDD e PHP - TDC 2012
DDD e PHP - TDC 2012Luís Cobucci
 
Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...
Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...
Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...Isaac de Souza
 
Desmistificando o Framework da Zend
Desmistificando o Framework da ZendDesmistificando o Framework da Zend
Desmistificando o Framework da ZendDomingos Teruel
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioRalph Rassweiler
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkFlávio Lisboa
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!Isaac de Souza
 
Fdd em uma casca de banana
Fdd em uma casca de bananaFdd em uma casca de banana
Fdd em uma casca de bananaejedelmal
 

Semelhante a Domain Driven Design PHP TDC2014 (20)

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
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in Javascript
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 Palestra
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
DDD e PHP - TDC 2012
DDD e PHP - TDC 2012DDD e PHP - TDC 2012
DDD e PHP - TDC 2012
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
DDD
DDDDDD
DDD
 
Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...
Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...
Esquenta TDC - Como DDD e principalmente Domain Model contribuem na construçã...
 
Desmistificando o Framework da Zend
Desmistificando o Framework da ZendDesmistificando o Framework da Zend
Desmistificando o Framework da Zend
 
DDD - Domain Driven Design
DDD - Domain Driven DesignDDD - Domain Driven Design
DDD - Domain Driven Design
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócio
 
Treinamento DDD .Net
Treinamento DDD .NetTreinamento DDD .Net
Treinamento DDD .Net
 
Prog web 08-php-mvc
Prog web 08-php-mvcProg web 08-php-mvc
Prog web 08-php-mvc
 
Bdd&tdd
Bdd&tddBdd&tdd
Bdd&tdd
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!
 
Fdd em uma casca de banana
Fdd em uma casca de bananaFdd em uma casca de banana
Fdd em uma casca de banana
 

Mais de Paulo Victor Gomes

Functional as a service TDC 2020
Functional as a service TDC 2020Functional as a service TDC 2020
Functional as a service TDC 2020Paulo Victor Gomes
 
O mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHPO mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHPPaulo Victor Gomes
 
Essay about event driven architecture
Essay about event driven architectureEssay about event driven architecture
Essay about event driven architecturePaulo Victor Gomes
 

Mais de Paulo Victor Gomes (6)

Functional as a service TDC 2020
Functional as a service TDC 2020Functional as a service TDC 2020
Functional as a service TDC 2020
 
PHP as a Service TDC2019
PHP as a Service TDC2019PHP as a Service TDC2019
PHP as a Service TDC2019
 
PHP as a Service
PHP as a ServicePHP as a Service
PHP as a Service
 
Stacks Cloud - Digital Ocean
Stacks Cloud - Digital OceanStacks Cloud - Digital Ocean
Stacks Cloud - Digital Ocean
 
O mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHPO mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHP
 
Essay about event driven architecture
Essay about event driven architectureEssay about event driven architecture
Essay about event driven architecture
 

Domain Driven Design PHP TDC2014

  • 1. pen4education Domain-Driven Design Paulo Victor L. L. Gomes Projeto Orientado a Domínio com PHP
  • 2. pen4education 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
  • 4. pen4education Fundamentação “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”
  • 6. pen4education Encapsulamento Encapsule a regra de negócio! Fazendo isso, garantimos consistência e simplicidade.
  • 8. pen4education Orientação a Objetos Meu framework já usa Orientação a Objetos. Esse papo é muito antigo e eu já superei esse problema.
  • 9. pen4education 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']- >getPaidPrice()+$salespurchaseItem->getPaidPrice());$index[$identifierHandle]['salespurchaseItem']- >setOriginalUnitPrice($index[$identifierHandle]['salespurchaseItem']->getOriginalUnitPrice() +$salespurchaseItem->getOriginalUnitPrice());}$index[$identifierHan}; if($salespurchaseItem[‘ai’][‘meu’] [‘deus’][‘eu’][‘sou’][‘o’][‘cara’][‘da’][‘programacao’][‘ever’] == 234 && ..
  • 10. pen4education 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...
  • 11. pen4education Domain Driven Design Como eu uso? De onde eu começo? sudo apt-get install ddd (#sqn)
  • 12. pen4education O desafio proposto... Comunicação entre equipe de produto e desenvolvimento
  • 14. pen4education 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.
  • 15. pen4education Model Driven Design 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. O MDD defende o processo ágil, o trabalho em equipe ou seja, especialistas em negócio, desenvolvedores e arquitetos trabalhando juntos. Diagramas da UML ajudam o entedimento do domínio.
  • 16. pen4education Blocos de Construção Encapsulando o modelo de domínio. Interface de Usuário – Interação com o usuário; Aplicação – essa camada não possui lógica de negócio. Ela é apenas uma camada fina, responsável por conectar a Interface de Usuário às camadas inferiores; Domínio – representa os conceitos, regras e lógicas de negócio. Todo o foco de DDD está nessa camada. Nosso trabalho, daqui para frente, será aperfeiçoar e compreender profundamente essa parte; Infra-estrutura – fornece recursos técnicos que darão suporte às camadas superiores. São normalmente as partes de um sistema responsáveis por persistência de dados, conexões com bancos de dados, etc.
  • 17. pen4education Entidades Muitos objetos não são fundamentalmente definidos por seus atributos, mas sim por uma linha de continuidade e identidade
  • 18. pen4education Entidades <?php class Exercicio_Negocio_Exercicio { private $id; private $nome; private $descricao; private $exercicioMercanismo; private $autocorreção; public function getExercicioMercanismo() { if ($this->exercicioMecanismo == null && $this->entidadeValida()) { $elementDAO = Exercicio_Infraestrutura_Model_Dao_ExercicioDAOFactory::getInstance()->getExercicioDAO(); $this->exercicioMecanismo = $elementDAO->getMecanismoExercicio($this); } return $this->exercicioMercanismo; } public function gravar() { $exercicioDAO = Exercicio_Infraestrutura_Model_Dao_ExercicioDAOFactory::getInstance()->getExercicioDAO(); return $exercicioDAO->persist($this); } public function getExercicioConteudo(ACSNegocioNucleoUsuario $usuario) { return Exercicio_Negocio_ExercicioConteudo::buscarPorUsuarioExercicio($this, $usuario); } private function entidadeValida() { $entidadeValida = false; if ($this->getId() != null) { $entidadeValida = true; } return $entidadeValida; } }
  • 19. pen4education Objetos de valor Muitos objetos não possuem nenhuma identidade conceitual. Esses objetos descrevem alguma característica de alguma coisa.
  • 20. pen4education Objetos de valor <?php namespace ProductModelVo; class Price { Const CURRENCY = 'R$'; private $price; private $discountPercentage; private $discount; // get's and set's public function getPrice() { // business rules to return price } public function setSpecialPrice($setSpecialPrice) { if ($specialPrice >= $this->getPrice()) { $specialPrice = null; } $this->specialPrice = $specialPrice; } public function setSpecialPriceComparison($specialPriceComparison) { $this->specialPriceComparison = $specialPriceComparison; if ($this->verifyPriceComparison()) { $this->setSpecialPrice($specialPriceComparison); } } private function verifyPriceComparison() { // verify channels... } }
  • 21. pen4education Serviços Ás vezes, a situação simplesmente não se trata de alguma coisa. Em algums casos, um design mais limpo e mais pragmático inclui operações que não pertencem conceitualmente a nenhum objeto. Em vez de forçar a questão, podemos seguir os limites naturais do espaço do problema e incluir SERVIÇOS explicitamente no modelo.
  • 22. pen4education Serviços <?php namespace ProductService; class Catalog { Const BALANCE_STANDARD_STOCK = 0; protected $catalogRepo; public function __construct(RepositoryInterface $catalogRepo) { $this->catalogRepo = $catalogRepo; } public function getBalanceStock(Item $item) { $balanceStock = self::BALANCE_STANDARD_STOCK; $stockReserved = $this->catalogRepo->getQuantityReservedStock($item); $currentBalance = (int) ($item->getQuantity() - $stockReserved); if ($currentBalance > $balanceStock) { $balanceStock = $currentBalance; } return $balanceStock; } }
  • 23. pen4education Agregados O design detalhado de associações ajuda a simplificar um comportamento de um objeto mas, em diversos casos, existe a necessidade de explorar a modelagem se adequando com o domínio complexo.
  • 24. pen4education Agregados <?php namespace ProductModelAggregate; class Product extents AbstractProduct { /** @var ProductModelVoPrice */ protected $price; /** @var ProductModelCollectionItem */ protected $itemCollection; public function getItemCollection() { if ($this->hasItemCollection() && $this->getIdentification()) { $this->setItemCollection($this->getProductService()->getItemCollectionByIdentification($this->getIdentification())); } } public function hasItemCollection() { $hasItemCollection = false; if ($this->ItemCollection) { if ($this->ItemCollection instanceof ProductModelCollectionItem) { $hasItemCollection = true; } } } public function getQuantity() { $quantity = 0; if (($this->hasItemCollection()) && ($this->ItemCollection->count() >= 1)) { $quantity = $this->calculateQuantity(); } return $quantity; } }
  • 25. pen4education Fábricas Quando a criação de um objeto ou um AGREGADO inteiro se torna complicada ou revela uma grande parte de estrutura interna, as FÁBRICAS fornecem o encapsulamento.
  • 26. pen4education Fábricas class OrderFactory{ public static function createOrder(ICustomer $customer, ProductCollection $productCollection) { $order = new Order($customer, $productCollection); $customerPayment = PaymentFactory::createCustomerPayment($customer); if ($customerPayment->hasRecurrent()) { $order->setPayment($customerPayment) } return $order; } }
  • 27. pen4education Repositórios Associações nos permitem achar um objeto baseado em sua relação com outro objeto. Mas é preciso ter um ponto de partida para uma travessia até uma ENTIDADE ou um VALOR no meio do seu ciclo de vida.
  • 28. pen4education Repositórios <?php namespace ApplicationModel; class ConfigurationRepository implements RepositoryInterface { protected $dataMapper = null; protected $entityContext; public function __constuct(DataMapper $dataMapper) { $this->dataMapper = $dataMapper; $this->dataMapper->entityContext($this->getEntityContext()); } public function findAll() { return $this->dataMapper->listAll(); } public function findById($id) { $configurationEntity = false; $configurations = $this->dataMapper->findBy(array('id' => $id)); if ($configurations) { $configurationEntity = $configurations->current(); } return $configurationEntity; } }
  • 30. pen4education MagiZ, a Plataforma Educacional Online completa, configurável e fácil de usar. www.magiz.com.br