baby steps to domain-driven design

37
Domain-Driven Design Baby Steps Žilvinas Kuusas / Kaunas PHP v.28

Upload: zilvinas-kuusas

Post on 16-Apr-2017

2.012 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Baby steps to Domain-Driven Design

Domain-Driven DesignBaby Steps

Žilvinas Kuusas / Kaunas PHP v.28

Page 2: Baby steps to Domain-Driven Design

How I found DDD?● Project with complicated logic● Complex business problems● Implementation via experiments - domain

modeling

Page 3: Baby steps to Domain-Driven Design

When you need DDD● Want to build long-lasting codebase● Project contains lots of business logic● You have a team● Multiple teams working on a project

Page 4: Baby steps to Domain-Driven Design

Domain-driven design● Not a technology● Not a methodology

Page 5: Baby steps to Domain-Driven Design

Domain-driven design● Structure of practices for making design

decisions● Focused on core domain and domain logic● Technical and business people collaboration● Ubiquitous language

Page 6: Baby steps to Domain-Driven Design

DomainConcept of specific business area - real world problem.

Page 7: Baby steps to Domain-Driven Design

Domain modelSystematic code which solves problems described in domain in software level.

Page 8: Baby steps to Domain-Driven Design

The same language used in domain model both by tech and business people to describe activities in domain.

Ubiquitous language

Page 9: Baby steps to Domain-Driven Design

Design pattern knowledge● Dependency Injection● Factory● Data Mapper● Adapter● Mediator● Command● ...

Page 10: Baby steps to Domain-Driven Design

Using a framework?Forget it for a while.

Page 11: Baby steps to Domain-Driven Design

● Modular structure● Clear interface of object● Messaging between objects

Take advantage of OOP

Page 12: Baby steps to Domain-Driven Design

Model-driven designExample

Page 13: Baby steps to Domain-Driven Design

Where to start?● Analyze domain problems● Use same language in a team● Distillate domain objects (mostly entities)● Define domain events/actions● Write code● Repeat

Page 14: Baby steps to Domain-Driven Design

Building blocks● Entity● Value object● Repository● Domain service● Domain event● Application service

Page 15: Baby steps to Domain-Driven Design

Layeredarchitecture

Page 16: Baby steps to Domain-Driven Design

Domain● Expenses tracker

○ Log incomes○ Log outcomes○ Tag transactions

Page 17: Baby steps to Domain-Driven Design

Modeling● Understand domain (notes, drawings, UML)● Write behaviors (BDD)● Write tests (TDD)● Create classes

Page 18: Baby steps to Domain-Driven Design

EntitiesTransaction● created : DateTime● amount : float● tag : Tag● type : string● description : text

Tag● name : string

Page 19: Baby steps to Domain-Driven Design

\O/ Income || Transaction / \ Outcome

Use case

Page 20: Baby steps to Domain-Driven Design

Domain events and actionsEvents● Transaction created

Actions / use cases● Create outcome

transaction● Create income

transaction

Page 21: Baby steps to Domain-Driven Design

My blocks● Entities

○ Transaction○ Tag

● Repositories○ TransactionRepository○ TagRepository

● Events○ TransactionCreated○ TransactionFailed

● Domain Services○ OutcomeTransaction○ IncomeTransaction

● Application Service○ CreateTransaction

Page 22: Baby steps to Domain-Driven Design

Core domain● CreateOutcome

CreateIncome

● TransactionTransactionRepositoryInterfaceTagTagRepositoryInterface

● TransactionCreatedTransactionFailed

Page 23: Baby steps to Domain-Driven Design

● TransactionController

● CreateTransaction

● TransactionRepository

Page 24: Baby steps to Domain-Driven Design

class TransactionController{ public function __construct( CreateTransaction $useCase, OutcomeTransaction $outcome ) { $this->useCase = $useCase; $this->outcome = $outcome; }

public function createOutcomeAction() { $this->useCase->create($this->outcome->create(12.99)); }}

Controller

Page 25: Baby steps to Domain-Driven Design

Application Service

class CreateTransaction{ ... public function __construct(

TransactionRepositoryInterface $repository,EventDispatcherInterface $dispatcher

) { $this->repository = $repository; $this->dispatcher = $dispatcher; }

public function create(Transaction $transaction) { $this->repository->save($transaction); $event = new TransactionCreated($transaction); $this->dispatcher->dispatch($event::NAME, $event); }}

Page 26: Baby steps to Domain-Driven Design

Domain Service

class OutcomeTransaction{ public function create($amount, Tag $tag, $description) { $transaction = new Transaction(); $transaction->setCreated(new \DateTime()); $transaction->setAmount($amount); $transaction->setTag($tag); $transaction->setType($transaction::OUTCOME); $transaction->setDescription($description);

return $transaction; }}

Page 27: Baby steps to Domain-Driven Design

class TransactionRepository extends EntityRepository implements TransactionRepositoryInterface{ public function save(Transaction $transaction) { $this->_em->persist($transaction); $this->_em->flush(); }}

Repository

Page 28: Baby steps to Domain-Driven Design

Repository Interface

interface TransactionRepositoryInterface{ public function save(Transaction $transaction);}

Page 29: Baby steps to Domain-Driven Design

Domain model is always in valid state.

Page 30: Baby steps to Domain-Driven Design

Domain isolation● Isolate via use-cases● Infrastructure

connected via clear interfaces

Page 31: Baby steps to Domain-Driven Design

Intention-revealing interfaces

<?php

interface TransactionRepository{ public function getTaggedBy(Tag $tag);

public function getByTimeframe(DateTime $from, DateTime $to

);}

<?php

interface TransactionRepository{ public function getTagged($id);

public function getByTimeframe($from, $to

);}

Page 32: Baby steps to Domain-Driven Design

Implementation● Web controller, CLI

● Persistence / DBFile systemWeb servicesEmail sending

Page 33: Baby steps to Domain-Driven Design

More complexity

Page 34: Baby steps to Domain-Driven Design

Summary● No need to think about framework, external

tools● Focus on business problems● Explore them● Solve them● Build long-lasting implementation

Page 35: Baby steps to Domain-Driven Design

Reality check● Every domain is unique● Don't force design principles● Explore domain and how real things get

done● Development is iterative

Page 36: Baby steps to Domain-Driven Design

The big blue book about DDD by Eric Evans

Page 37: Baby steps to Domain-Driven Design

Ačiū!“Any fool can write code that a computer can

understand. Good programmers write code that humans can understand.“

Martin Fowler