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

Skinny dipping into CQRS

Skinny dipping into CQRS

Avatar for Warnar Boekkooi

Warnar Boekkooi

October 03, 2013

Other Decks in Technology

Transcript

  1. WHAT CAN CQRS DO FOR YOU? Capture intent Easy to

    Scale Domain-Driven Design Task based UI Headache
  2. MODEL c l a s s A p p o

    i n t m e n t { f u n c t i o n s e t T i t l e ( $ t i t l e ) { . . . } f u n c t i o n g e t T i t l e ( ) { . . . } f u n c t i o n s e t S t a r t ( \ D a t e T i m e $ d a t e ) { . . . } f u n c t i o n g e t S t a r t ( ) { . . . } f u n c t i o n s e t D u r a t i o n ( $ d u r a t i o n ) { . . . } f u n c t i o n g e t D u r a t i o n ( ) { . . . } f u n c t i o n s e t L o c a t i o n ( $ l o c a t i o n ) { . . . } f u n c t i o n g e t L o c a t i o n ( ) { . . . } }
  3. SERVICE c l a s s A p p o

    i n t m e n t S e r v i c e { f u n c t i o n u p d a t e ( $ a p p o i n t m e n t I d , $ t i t l e , $ s t a r t , $ d u r a t i o n , $ l o c a t i o n ) { $ a p p o i n t m e n t = $ t h i s - > r e p o - > f i n d B y I d ( $ a p p o i n t m e n t I d ) ; i f ( ! $ a p p o i n t m e n t ) { t h r o w n e w N o t F o u n d E x c e p t i o n ( ) ; } $ a p p o i n t m e n t - > s e t T i t l e ( $ t i t l e ) ; $ a p p o i n t m e n t - > s e t S t a r t ( $ s t a r t ) ; $ a p p o i n t m e n t - > s e t D u r a t i o n ( $ d u r a t i o n ) ; $ a p p o i n t m e n t - > s e t L o c a t i o n ( $ l o c a t i o n ) ; $ t h i s - > r e p o - > s a v e ( $ a p p o i n t m e n t ) ; } }
  4. ANEMIC DOMAIN “There are objects, many named after the nouns

    in the domain space, and these objects are connected with the rich relationships and structure that true domain models have. The catch comes when you look at the behavior, and you realize that there is hardly any behavior on these objects, making them little more than bags of getters and setters.”
  5. A COMMAND c l a s s R e l

    o c a t e A p p o i n t m e n t C o m m a n d { p u b l i c $ a p p o i n t m e n t I d ; p u b l i c $ l o c a t i o n ; }
  6. TIME TO SEPARATE c l a s s A p

    p o i n t m e n t M o d e l { f u n c t i o n r e g i s t e r ( $ c o m m a n d ) { . . . } f u n c t i o n r e l o c a t e ( $ c o m m a n d ) { . . . } f u n c t i o n r e s c h e d u l e ( $ c o m m a n d ) { . . . } f u n c t i o n c a n c e l ( $ c o m m a n d ) { . . . } } c l a s s A p p o i n t m e n t V i e w { f u n c t i o n g e t T i t l e ( ) { . . . } f u n c t i o n g e t L o c a t i o n ( ) { . . . } f u n c t i o n g e t S t a r t ( ) { . . . } f u n c t i o n g e t D u r a t i o n ( ) { . . . } }
  7. HANDLE A COMMAND c l a s s A p

    p o i n t m e n t H a n d l e r { f u n c t i o n h a n d l e R e l o c a t e A p p o i n t m e n t ( $ c o m m a n d ) { $ a p p o i n t m e n t = $ t h i s - > r e p o s i t o r y - > f i n d B y I d ( $ c o m m a n d - > a p p o i n t m e n t I d ) ; $ a p p o i n t m e n t - > r e l o c a t e ( $ c o m m a n d ) ; } } c l a s s C o m m a n d B u s { f u n c t i o n e x e c u t e ( $ c o m m a n d ) { $ t h i s - > v a l i d a t o r - > v a l i d a t e ( $ c o m m a n d ) ; $ t h i s - > d i s p a t c h ( $ c o m m a n d ) ; } p r o t e c t e d f u n c t i o n d i s p a t c h ( $ c o m m a n d ) { . . . } }
  8. CQRS TIPS It's not a magic bullet Apps can contain

    both CQRS & CRUD Avoid "Anemic domain" ALSO SEE Domain-Driven Design Domain Events Event Sourcing
  9. THANKS FOR LISTENING Now it's time for a drink! /

    Special thanks to: / Warnar Boekkooi @boekkooi Ross Tuck @rosstuck