Transcript

Command Query Responsibility Segregation

In Babysteps

@talboomerik

Founder of Software craftsmanship guild Belgium

@talboomerik

Thanks to

@yreynhout @alastairs

@sandromancuso @adibolb

And a special thanks to@StefanBilliet

ENTRY LEVEL INTRODUCTION

@talboomerik

WHERE DID IT COME FROM?A little history

@talboomerik

Command and Query Separation

It states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both. In other words, asking a question should not change the answer. More formally, methods should return a value only if they are referentially transparent and hence possess no side effects.

Wikipedia - Bertrand Meyer

@talboomerik

IF YOU HAVE A RETURN TYPE, YOU SHOULD NOT CHANGE STATE

Query

@talboomerik

IF YOU CHANGE STATE YOUR RETURN TYPE SHOULD BE VOID

Command

@talboomerik

BASICALLY CQRS IS CQS SPLIT IN DIFFERENT OBJECTS

The simple definition

@talboomerik

QUERY OBJECTS OVER QUERY SERVICES / REPOSITORIES

http://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/@talboomerik

WHAT IS THIS ALL ABOUT?What’s the fuss

@talboomerik

YOUR TYPICAL N-TIER ARCHITECTURE

@talboomerik

http:

//co

deof

rob.

com

/ent

ries/

cqrs

-is-t

oo-c

ompl

icat

ed.h

tml

REMEMBER WHAT UNCLE SANDRO SHOWED US?

FEELS FAMILIAR?

@talboomerik

WE CAN MAKE THIS SIMPLER

@talboomerik

http:

//co

deof

rob.

com

/ent

ries/

cqrs

-is-t

oo-c

ompl

icat

ed.h

tml

REMOVING QUERIES FROM YOUR DOMAIN MODEL

@talboomerik

@sandromancuso

@sandromancuso

LET’S TAKE IT ONE STEP FURTHERIf needed

@talboomerik

http:

//co

deof

rob.

com

/ent

ries/

cqrs

-is-t

oo-c

ompl

icat

ed.h

tml

OR EVEN FURTHERIf applicable

@talboomerik

http:

//co

deof

rob.

com

/ent

ries/

cqrs

-is-t

oo-c

ompl

icat

ed.h

tml

HOW TO SYNCHRONIZE READ/WRITE?

@talboomerik

DOMAIN EVENTSA cool pattern

@talboomerik

LET’S HAVE A LOOK AT SOME CODE

@talboomerik

TAKING IT TO ANOTHER LEVELEvent sourcing

@talboomerik

FOCUSING ON BEHAVIOR INSTEAD OF STATE

@talboomerik

http:

//co

deof

rob.

com

/ent

ries/

cqrs

-is-t

oo-c

ompl

icat

ed.h

tml

SOME MISCONCEPTIONS ABOUT CQRS

@talboomerik

CQRS <> DDDIt’s not the same

@talboomerik

CQRS <> EVENT SOURCINGThey just go well together

http://lostechies.com/jimmybogard/2012/08/22/busting-some-cqrs-myths/ @talboomerik

CQRS CAN HAVE AN IMMEDIATE CONSISTENT READ STORE

http://lostechies.com/jimmybogard/2012/08/22/busting-some-cqrs-myths/ @talboomerik

CQRS DOES NOT FORCE YOU TO USE A BUS

http://lostechies.com/jimmybogard/2012/08/22/busting-some-cqrs-myths/ @talboomerik

COMMANDS DO NOT NEED TO BE FIRE-AND-FORGET

Accepting the request vs Fulfilling the request

http://lostechies.com/jimmybogard/2012/08/22/busting-some-cqrs-myths/ @talboomerik

WHY IS THIS A GOOD IDEA?Pros and cons

@talboomerik

SIMPLER DOMAIN MODELBy splitting

@talboomerik

BETTER SEPARATION OF CONCERNS AND RESPONSIBILITIES

@talboomerik

SCALABILITYTechnical and team

@talboomerik

COMPLETE REBUILD OF THE APPLICATION STATE THROUGH EVENT SOURCING

http://martinfowler.com/eaaDev/EventSourcing.html@talboomerik

TEMPORAL QUERYINGReplay history

http://martinfowler.com/eaaDev/EventSourcing.html@talboomerik

AUDIT LOGI see you

http://martinfowler.com/eaaDev/EventSourcing.html@talboomerik

IT DOES REQUIRE “SOME” WORK UPFRONT

Set up infrastructure

@talboomerik

IT WORKS BEST WITH TASK-BASED UI

Delivery mechanism and domain architecture need to collaborate

IT IS NOT EASYIt’s a big shift from what we are used to

@talboomerik

HOW CAN WE GET THIS DONE?Code, show us code

@talboomerik

THANK YOUThat’s all folks

@talboomerik

top related