Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Domain-driven Design Deconstructed

Domain-driven Design Deconstructed

Presented at php[tek] 2016

Once you try domain-driven design (DDD), you will never design software in the same way again. We will avoid silly buzzwords and break DDD down into easy-to-understand components. We will start by discussing what it means to use a ubiquitous language, encapsulate logic in value objects, and use bounded contexts, entities, and aggregate roots to manage state and protect invariants. We will also cover more-advanced topics in the DDD world, such as event sourcing and command query responsibility segregation.

Andrew Cassell

May 26, 2016
Tweet

More Decks by Andrew Cassell

Other Decks in Programming

Transcript

  1. DDD

  2. People don't want to buy a quarter-inch drill, they want

    a quarter-inch hole. Theodore Levitt
  3. 1. Naming Things 2. Cache Invalidation 3. Off By One

    Errors Top 10 Reasons Programming is Hard
  4. $catalog = new LibraryCatalog(…); $book = $catalog->findOneBookByISBN($isbn); $members = new

    Members(…); $borrower = $members->findOneByAccountNumber($id); $borrower->borrow($book); $members->updateAccount($borrower);
  5. $user = User::findOrFail($uuid);
 $book = Books::where('isbn', '=', $isbn)->take(1)->get();
 
 


    if (!$user->userBookLinks()->contains($book->id) && $user->borrowLinks->count() < 5) {
 
 $user->userBookLinks()->attach($book->id, ['date_due' => new DateTime('+2 Weeks')];
 
 }
 
 
 $user->save();
  6. $catalog = new LibraryCatalog(…); $book = $catalog->findOneBookByISBN($isbn); $members = new

    Members(…); $borrower = $members->findOneByAccountNumber($id); $borrower->borrow($book)
  7. 7 Dirty Words When Meeting With a Domain Expert 1.Session

    2.Repository 3.Abstract 4.Interface 5.Class 6.Database 7.Foreign Key
  8. Domain Objects Repositories Commands & Command handlers Business rules/specifications Messages

    Domain events 
 Aggregates Entities Value Objects Invariants Processes
  9. Domain Objects Repositories Commands & Command handlers Business rules/specifications Messages

    Domain events 
 Aggregates Entities Value Objects Invariants Processes
  10. Value Object Immutable No Identity only Values Entity Mutable Has

    A Lifecycle Always Stable Contains Value Objects Aggregate Entity Responsible For Child Entities
  11. Plain PHP Objects (POPOs) That are Immutable •Declare Class Properties

    as Private •No Setters •All Parameters Are Injected in the Constructor •Do Not Store References to Mutable Objects (Private Scalars Okay) •Functions that Appear to Modify Should Return a New Object •Declare the Class Final so it can’t be Overridden (probably) Value Objects
  12. Identifiable Has State and is Mutable Never Invalid State Required

    Parameters Passed in Constructor Operates Using Value Objects No Security or Permission Checks Storage Agnostic Entities
  13. Mathias Verraes - Decoupling the Model from the Framework at

    Laracon EU 2014 https://www.youtube.com/watch?v=QaIGN_cTcc8
  14. Ruby Midwest 2011 - Keynote: Architecture the Lost Years by

    Robert Martin https://www.youtube.com/watch?v=WpkDN78P884
  15. Domain Events •Something That Happened In The Past •Immutable •Part

    of the Core Domain •Usually Created in Either an Aggregate or as Part of Application Service •Probably Want To Persist Them •Passed to Event Bus (Application Service) •Listeners are Application Services •Used To Cross Bounded Contexts
  16. Event Sourcing •Store the Events That Happen •Append Only Event

    Storage •Object Properties are Not Stored
  17. Event Sourcing •Avoids Data Mapping •Avoids Object-relational Impedance Mismatch •Reduces

    Database Table Counts (Related Tables) •Potentially Reduces Model Counts
  18. https://joind.in/talk/99c3a Topics Covered •Ubiquitous Language •Event Storming •Modelling •Value Objects

    •Entities •Aggregates •Hexagonal Architecture •CQRS •Event Sourcing