Domain Driven Design PHP TDC2014

1.218 visualizações

Publicada em

Domain Driven Design PHP TDC2014

Publicada em: Tecnologia
0 comentários
10 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.218
No SlideShare
0
A partir de incorporações
0
Número de incorporações
17
Ações
Compartilhamentos
0
Downloads
10
Comentários
0
Gostaram
10
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Domain Driven Design PHP TDC2014

  1. 1. pen4education Domain-Driven Design Paulo Victor L. L. Gomes Projeto Orientado a Domínio com PHP
  2. 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
  3. 3. pen4education Fundamentação Onde colocar a regra de negócio?
  4. 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”
  5. 5. pen4education Fundamentação Encapsule, Daniel San
  6. 6. pen4education Encapsulamento Encapsule a regra de negócio! Fazendo isso, garantimos consistência e simplicidade.
  7. 7. pen4education Orientação a Objetos?
  8. 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. 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. 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. 11. pen4education Domain Driven Design Como eu uso? De onde eu começo? sudo apt-get install ddd (#sqn)
  12. 12. pen4education O desafio proposto... Comunicação entre equipe de produto e desenvolvimento
  13. 13. pen4education O mundo como ele é...
  14. 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. 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. 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. 17. pen4education Entidades Muitos objetos não são fundamentalmente definidos por seus atributos, mas sim por uma linha de continuidade e identidade
  18. 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. 19. pen4education Objetos de valor Muitos objetos não possuem nenhuma identidade conceitual. Esses objetos descrevem alguma característica de alguma coisa.
  20. 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. 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. 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. 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. 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. 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. 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. 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. 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; } }
  29. 29. pen4education Tijolos de construção
  30. 30. pen4education MagiZ, a Plataforma Educacional Online completa, configurável e fácil de usar. www.magiz.com.br
  31. 31. pen4education
  32. 32. pen4education Minha última experiência
  33. 33. pen4education DDD no ZF2 https://github.com/pvgomes/dddzf2
  34. 34. pen4education Perguntas?
  35. 35. pen4education Referência

×