176
Ur Domain Haz Monoids? cyrille martraire aka @cyriux DDDx NYC 14

Ur Domain Haz Monoids DDDx NYC 2014

Embed Size (px)

DESCRIPTION

You probably can't imagine that Monoids (not monads) are so simple maths creatures that you can understand them in just a few minutes. You probably can't imagine that Monoids (not monads) are so simple maths creatures that you can understand them in just a few minutes. But you probably don't imagine either that they can help you craft elegant and powerful domain models that scale very well. Through various examples, we will have a closer look at monoids used for domain modeling in a style that mixes the best of DDD and FP. Even in languages like Java or C#, this talk will influence your coding style forever! 'More entertaining and educational explanation of Monoids I've heard' - Martin Thompson, DDD exchange London 2014. See more at http://skillsmatter.com/conferences/1880-ddd-exchange-nyc-2014#program

Citation preview

Page 1: Ur Domain Haz Monoids DDDx NYC 2014

Ur Domain Haz Monoids?

cyrille martraire aka @cyriux DDDx NYC 14

Page 2: Ur Domain Haz Monoids DDDx NYC 2014

Can you tell the

difference?

Page 3: Ur Domain Haz Monoids DDDx NYC 2014

Monoid

Page 4: Ur Domain Haz Monoids DDDx NYC 2014

Glass of beer

Page 5: Ur Domain Haz Monoids DDDx NYC 2014

This talk is the answer

Page 6: Ur Domain Haz Monoids DDDx NYC 2014

DDD

Page 7: Ur Domain Haz Monoids DDDx NYC 2014

FP

Page 8: Ur Domain Haz Monoids DDDx NYC 2014

(00)

Page 9: Ur Domain Haz Monoids DDDx NYC 2014

A matter of Taste

http://rosshirt.blogspot.fr/

The Code Gourmet

(dedicated to @ziobrando)

Page 10: Ur Domain Haz Monoids DDDx NYC 2014

Passionate developer

PARIS Since 1999

!@cyriux

Cyrille Martraire

Page 11: Ur Domain Haz Monoids DDDx NYC 2014

Paris Software Craftsmanship Community

http://www.meetup.com/paris-software-craftsmanship/

Page 12: Ur Domain Haz Monoids DDDx NYC 2014

TDDBDDDDDLegacy

Page 13: Ur Domain Haz Monoids DDDx NYC 2014

WARNINGThe following show features no spectacular stunt, no live coding, only trivial Java code. You can re-create or re-enact at home with no danger.

Page 14: Ur Domain Haz Monoids DDDx NYC 2014

a bit personal

Page 15: Ur Domain Haz Monoids DDDx NYC 2014

Adopted 2005 Still in love

Page 16: Ur Domain Haz Monoids DDDx NYC 2014

...

Page 17: Ur Domain Haz Monoids DDDx NYC 2014

What do DDD & FP have in common?

Page 18: Ur Domain Haz Monoids DDDx NYC 2014

"My first encounter with FP concepts was from DDD"

Page 19: Ur Domain Haz Monoids DDDx NYC 2014

FP = ?

Page 20: Ur Domain Haz Monoids DDDx NYC 2014
Page 21: Ur Domain Haz Monoids DDDx NYC 2014
Page 22: Ur Domain Haz Monoids DDDx NYC 2014

http://www.jaider.net/archives/609-intro-to-functional-programming/

PURE

Page 23: Ur Domain Haz Monoids DDDx NYC 2014

No State No War

Page 24: Ur Domain Haz Monoids DDDx NYC 2014
Page 25: Ur Domain Haz Monoids DDDx NYC 2014

So what do DDD & FP

have in common?

Page 26: Ur Domain Haz Monoids DDDx NYC 2014

Value Objects................................................................................................. 19

Page 27: Ur Domain Haz Monoids DDDx NYC 2014

Learn one

and get the other

one for FREE!

Page 28: Ur Domain Haz Monoids DDDx NYC 2014

DDDFP

(OO)

Page 29: Ur Domain Haz Monoids DDDx NYC 2014

NICE STYLE

of code

Page 30: Ur Domain Haz Monoids DDDx NYC 2014

DDD+FP = ?

Page 31: Ur Domain Haz Monoids DDDx NYC 2014
Page 32: Ur Domain Haz Monoids DDDx NYC 2014

Example PLZ?

Page 33: Ur Domain Haz Monoids DDDx NYC 2014

MONOIDZ!

Page 34: Ur Domain Haz Monoids DDDx NYC 2014

@cyriux

Page 35: Ur Domain Haz Monoids DDDx NYC 2014

Closure Associativity

Neutral Element

Page 36: Ur Domain Haz Monoids DDDx NYC 2014
Page 37: Ur Domain Haz Monoids DDDx NYC 2014

only 3 numbers in

programming

Page 38: Ur Domain Haz Monoids DDDx NYC 2014

0, 1, MANY

Page 39: Ur Domain Haz Monoids DDDx NYC 2014

Monoid: encapsulate

diversity inside

Page 40: Ur Domain Haz Monoids DDDx NYC 2014

0, 1, MANY

Neutral Element

Element

Operation

Page 41: Ur Domain Haz Monoids DDDx NYC 2014

Encapsulate special cases

→ simple again

Page 42: Ur Domain Haz Monoids DDDx NYC 2014

Battle against complexity

Page 43: Ur Domain Haz Monoids DDDx NYC 2014

× × × …

Page 44: Ur Domain Haz Monoids DDDx NYC 2014

× × × …

Page 45: Ur Domain Haz Monoids DDDx NYC 2014

× × × …

Page 46: Ur Domain Haz Monoids DDDx NYC 2014

Applied often:

→ scalable process

→ can grow to very complex complexity

Page 47: Ur Domain Haz Monoids DDDx NYC 2014

Scalable in complexity

Page 48: Ur Domain Haz Monoids DDDx NYC 2014

For a given interface I find myself doing often 0, 1, Many

OO FTW!

Page 49: Ur Domain Haz Monoids DDDx NYC 2014

0, 1, MANY

NullObject

Implementation(s)

Composite

Page 50: Ur Domain Haz Monoids DDDx NYC 2014

Identity Element = NullObject

VatCalculation.NONE

Page 51: Ur Domain Haz Monoids DDDx NYC 2014

Example PLZ!

Page 52: Ur Domain Haz Monoids DDDx NYC 2014

Numbers int+int=int

(3+5)+2=3+(5+2) 0

Page 53: Ur Domain Haz Monoids DDDx NYC 2014

Lists (.)+(.,.)=(.,.,.)

(a ︎)+(b,︎c)=(a ︎, b)+(c) ()

Page 54: Ur Domain Haz Monoids DDDx NYC 2014

Strings "hello"+"world" "cy"+"ri"+"lle"

""

Page 55: Ur Domain Haz Monoids DDDx NYC 2014

look simplistic; the key to very

complex behavior

Page 56: Ur Domain Haz Monoids DDDx NYC 2014

The key to infinite scalability!

(space)

Page 57: Ur Domain Haz Monoids DDDx NYC 2014

The key to infinite incremental computing!

(ti

me)

Page 58: Ur Domain Haz Monoids DDDx NYC 2014

Hadoop x Storm

Page 59: Ur Domain Haz Monoids DDDx NYC 2014

Composeability

Page 60: Ur Domain Haz Monoids DDDx NYC 2014

Monoids ☛ reduce

Page 61: Ur Domain Haz Monoids DDDx NYC 2014

Monoids ☛ domain

Page 62: Ur Domain Haz Monoids DDDx NYC 2014

Monoids ☛ domain

Page 63: Ur Domain Haz Monoids DDDx NYC 2014

Monoids: typical FP

Page 64: Ur Domain Haz Monoids DDDx NYC 2014

FP: Everything is a

value

Page 65: Ur Domain Haz Monoids DDDx NYC 2014

Therefore: Monoids are

values!

PROOF

Page 66: Ur Domain Haz Monoids DDDx NYC 2014

VALUE OBJECTS

Page 67: Ur Domain Haz Monoids DDDx NYC 2014

Immutable Equals by value

Page 68: Ur Domain Haz Monoids DDDx NYC 2014

Value Object

A DDD pattern to import FP-ish

values in OO languages

Page 69: Ur Domain Haz Monoids DDDx NYC 2014

Not Anemic

Page 70: Ur Domain Haz Monoids DDDx NYC 2014

18 m + 16 m = 34 m

Page 71: Ur Domain Haz Monoids DDDx NYC 2014

returns  a  new  instance

Change -> new instance

Page 72: Ur Domain Haz Monoids DDDx NYC 2014

SIDE-EFFECT -free

FUNCTIONS

Page 73: Ur Domain Haz Monoids DDDx NYC 2014

Immutability &

Side-effect-free functions!

Page 74: Ur Domain Haz Monoids DDDx NYC 2014

“Functional-First” style

Page 75: Ur Domain Haz Monoids DDDx NYC 2014

90%“Functional-First” style

Value Objects

(Ok, gut feeling, I did’nt measure)

Page 76: Ur Domain Haz Monoids DDDx NYC 2014

Money

Page 77: Ur Domain Haz Monoids DDDx NYC 2014

(25, EUR) +

(30, EUR) =

(55, EUR)

Page 78: Ur Domain Haz Monoids DDDx NYC 2014

(25, EUR) +

(30, USD) =

exception

Page 79: Ur Domain Haz Monoids DDDx NYC 2014

Money

amount currencyadd(Money): Money

<<ValueObject>>

Page 80: Ur Domain Haz Monoids DDDx NYC 2014
Page 81: Ur Domain Haz Monoids DDDx NYC 2014

Cashflows (Payments)

Page 82: Ur Domain Haz Monoids DDDx NYC 2014

(25, EUR, today) +

(30, EUR, today) =

(55, EUR, today)

Page 83: Ur Domain Haz Monoids DDDx NYC 2014

(25, EUR, today) +

(30, EUR, next day) =

exception

Page 84: Ur Domain Haz Monoids DDDx NYC 2014

CashFlow

amount currency date

add(CashFlow):CashFlow

<<ValueObject>>

Page 85: Ur Domain Haz Monoids DDDx NYC 2014

CLOSURE of

OPERATION

Page 86: Ur Domain Haz Monoids DDDx NYC 2014

Cashflows Sequences

Page 87: Ur Domain Haz Monoids DDDx NYC 2014

(10, EUR, 20/03)

(30, EUR, 21/03)

(25, EUR, 21/03)

(12, EUR, 22/03)

(10, EUR, 20/03)

(55, EUR, 21/03)

(12, EUR, 22/03)

+

=

Page 88: Ur Domain Haz Monoids DDDx NYC 2014

Cashflow Sequence +

Cashflow Sequence =

Cashflow Sequence

Page 89: Ur Domain Haz Monoids DDDx NYC 2014

Object Arithmetics

Page 90: Ur Domain Haz Monoids DDDx NYC 2014

This is how domain experts THINK

about itSAY

SKETCH

Page 91: Ur Domain Haz Monoids DDDx NYC 2014
Page 92: Ur Domain Haz Monoids DDDx NYC 2014

Ranges

Page 93: Ur Domain Haz Monoids DDDx NYC 2014

[1, 3] Union* [2, 4]

= [1, 4]

* for a bounding box-kind definition of union

Page 94: Ur Domain Haz Monoids DDDx NYC 2014

[1, 3] Union [2, 4]

= [1, 4] ][

Page 95: Ur Domain Haz Monoids DDDx NYC 2014

Predicates

Page 96: Ur Domain Haz Monoids DDDx NYC 2014

Filter AND Filter

= Filter

Page 97: Ur Domain Haz Monoids DDDx NYC 2014

Filter AND Filter

= Filter

Always

True

Page 98: Ur Domain Haz Monoids DDDx NYC 2014

Filter OR

Filter =

Filter

Page 99: Ur Domain Haz Monoids DDDx NYC 2014

Filter OR

Filter =

FilterAlways

False

Page 100: Ur Domain Haz Monoids DDDx NYC 2014

Grants

Page 101: Ur Domain Haz Monoids DDDx NYC 2014

Read, Write, Execute !

"most secure wins" !

r + w = r w + x = w

Page 102: Ur Domain Haz Monoids DDDx NYC 2014

Configuration Maps

Page 103: Ur Domain Haz Monoids DDDx NYC 2014

Color BLUE

Enable TrueTimeout 30 +

=

Color RED

Enable FalseTimeout 25

Desk FX

Color RED

Enable TrueTimeout 25

Desk FX

Default Desk-specific

Page 104: Ur Domain Haz Monoids DDDx NYC 2014

Color BLUE

Enable TrueTimeout 30 +

=

Color RED

Enable FalseTimeout 25

Desk FX

Color RED

Enable TrueTimeout 25

Desk FX

Default Desk-specific

overw

rite

logic

al OR

min

Page 105: Ur Domain Haz Monoids DDDx NYC 2014

Color BLUE

Enable TrueTimeout 30 +

=

Color RED

Enable FalseTimeout 25

Desk FX

Color RED

Enable TrueTimeout 25

Desk FX

Default Desk-specific

overw

rite

logic

al OR

min

Values are monoids too!

Page 106: Ur Domain Haz Monoids DDDx NYC 2014

Color BLUE

Enable TrueTimeout 30 +

=Color BLUE

Enable TrueTimeout 30

Color NONE

Enable FalseTimeout +∞

Desk ALLNeutral Element

Page 107: Ur Domain Haz Monoids DDDx NYC 2014

Color BLUE

Enable TrueTimeout 30 +

=Color BLUE

Enable TrueTimeout 30

Neutral Element

Page 108: Ur Domain Haz Monoids DDDx NYC 2014

Color BLUE

Enable TrueTimeout 30 +

=Color BLUE

Enable TrueTimeout 30

Value Objects may be

*BIG* object trees!

(DOM)

Page 109: Ur Domain Haz Monoids DDDx NYC 2014
Page 110: Ur Domain Haz Monoids DDDx NYC 2014

Non-Linear Stuff (average, std dev,

K-clustering, barycenters...)

Page 111: Ur Domain Haz Monoids DDDx NYC 2014

Average + Average = WRONG

Page 112: Ur Domain Haz Monoids DDDx NYC 2014

Average + Average Not Composeable!

Page 113: Ur Domain Haz Monoids DDDx NYC 2014
Page 114: Ur Domain Haz Monoids DDDx NYC 2014
Page 115: Ur Domain Haz Monoids DDDx NYC 2014

avg = sum / count !

avg = sum / count !

Page 116: Ur Domain Haz Monoids DDDx NYC 2014

avg = sum / count !

avg = sum / count !

+

Page 117: Ur Domain Haz Monoids DDDx NYC 2014

avg = sum / count !

avg = sum / count !

+ +

Page 118: Ur Domain Haz Monoids DDDx NYC 2014

avg = sum / count !

avg = sum / count !

avg = sum / count

+

=

+

=

Page 119: Ur Domain Haz Monoids DDDx NYC 2014

(sum, count) !

(sum, count) !

(sum, count)

+

=

Average

Page 120: Ur Domain Haz Monoids DDDx NYC 2014

(sum, sum2, count) !

(sum, sum2, count) !

(sum, sum2, count)

+

=

Std deviation

Page 121: Ur Domain Haz Monoids DDDx NYC 2014

Can model as a monoid even non-

linear stuff!

Page 122: Ur Domain Haz Monoids DDDx NYC 2014
Page 123: Ur Domain Haz Monoids DDDx NYC 2014

MOAR MATHS

PLZ!

Page 124: Ur Domain Haz Monoids DDDx NYC 2014

Monoid several times...

toString(): String union(MailingList): MailingList intersection(MailingList): MailingList nobody(): MailingList everybody(): MailingList

MailingList

Page 125: Ur Domain Haz Monoids DDDx NYC 2014

Space Vectors

Page 126: Ur Domain Haz Monoids DDDx NYC 2014

average temperature! = t1.add(t2)! .scale(1/2)

Page 127: Ur Domain Haz Monoids DDDx NYC 2014

returns  a  new  instance

Change -> new instance

Page 128: Ur Domain Haz Monoids DDDx NYC 2014

Space Vector

toCelsius(): Temperature toFarenheit(): Temperature add(Temperature): Temperature scale(double): Temperature

Temperature

Page 129: Ur Domain Haz Monoids DDDx NYC 2014

Why is it useful?

Page 130: Ur Domain Haz Monoids DDDx NYC 2014

(10, EUR, 20/03)

(30, EUR, 21/03)

(25, EUR, 21/03)

(12, EUR, 22/03)

(10, EUR, 20/03)

(55, EUR, 21/03)

(12, EUR, 22/03)

+

=

Page 131: Ur Domain Haz Monoids DDDx NYC 2014

Cashflow Sequence +

Cashflow Sequence =

Cashflow Sequence

Page 132: Ur Domain Haz Monoids DDDx NYC 2014

This is how domain experts THINK

about itSAY

SKETCH

Page 133: Ur Domain Haz Monoids DDDx NYC 2014

DECLARATIVE STYLE

Page 134: Ur Domain Haz Monoids DDDx NYC 2014

Much less code Much less bugs

Page 135: Ur Domain Haz Monoids DDDx NYC 2014
Page 136: Ur Domain Haz Monoids DDDx NYC 2014

// without monoids PaymentsFees(...) PaymentsFeesWithOptions(...) PaymentsFeesWithInsuranceAndOptions(...) PaymentsFeesWithInsurance(...) NoFeesButInsurance(...) ... !// with monoids fees(...) : Payments options(...) : Payments insurance(...) : Payments !Payments.add(Payments) : Payments

Page 137: Ur Domain Haz Monoids DDDx NYC 2014

// without monoids PaymentsFees(...) PaymentsFeesWithOptions(...) PaymentsFeesWithInsuranceAndOptions(...) PaymentsFeesWithInsurance(...) NoFeesButInsurance(...) ...

Page 138: Ur Domain Haz Monoids DDDx NYC 2014

// with monoids fees(...) : Payments options(...) : Payments insurance(...) : Payments !Payments.add(Payments) : Payments

Page 139: Ur Domain Haz Monoids DDDx NYC 2014

side-effect-free

operation

Very easy to test

input output

Page 140: Ur Domain Haz Monoids DDDx NYC 2014

Much less stuff to learn

Page 141: Ur Domain Haz Monoids DDDx NYC 2014

1 interface to rule them all

Page 142: Ur Domain Haz Monoids DDDx NYC 2014

Cashflow Sequence +

Cashflow Sequence =

Cashflow Sequence

Page 143: Ur Domain Haz Monoids DDDx NYC 2014

ESTABLISHED FORMALISMS

Page 144: Ur Domain Haz Monoids DDDx NYC 2014

Monoid/Vector Spaces/Cyclic Group

Page 145: Ur Domain Haz Monoids DDDx NYC 2014

Literature Documented

Page 146: Ur Domain Haz Monoids DDDx NYC 2014

@annotations

@Monoid(neutral="emptyList") intersection(MailingList): MailingList !emptyList(): MailingList

MailingList

Page 147: Ur Domain Haz Monoids DDDx NYC 2014

LIVING DOCUMENTATION

Page 148: Ur Domain Haz Monoids DDDx NYC 2014

Write code that tells the business

domain stories

Page 149: Ur Domain Haz Monoids DDDx NYC 2014

generic naming

@Monoid(neutral="emptyList") intersection(MailingList): MailingList !emptyList(): MailingList

MailingList

Page 150: Ur Domain Haz Monoids DDDx NYC 2014

Domain-Specific naming

@Monoid(neutral="nobody") overlapping(MailingList): MailingList !nobody(): MailingList

MailingList

Page 151: Ur Domain Haz Monoids DDDx NYC 2014

SELF-EXPLAINING VALUES

Page 152: Ur Domain Haz Monoids DDDx NYC 2014

We Want:Traceability of processing

Page 153: Ur Domain Haz Monoids DDDx NYC 2014

No worry!

Page 154: Ur Domain Haz Monoids DDDx NYC 2014

Just enrich our types

Page 155: Ur Domain Haz Monoids DDDx NYC 2014

Just enrich our types

Page 156: Ur Domain Haz Monoids DDDx NYC 2014

Just enrich our types

!

label field

Page 157: Ur Domain Haz Monoids DDDx NYC 2014

Monad-ish No logging needed Each value stores

its history

Page 158: Ur Domain Haz Monoids DDDx NYC 2014

http://stuartcook.files.wordpress.com/2010/11/happy-monkey.jpg

Page 159: Ur Domain Haz Monoids DDDx NYC 2014
Page 160: Ur Domain Haz Monoids DDDx NYC 2014

In Closing

Page 161: Ur Domain Haz Monoids DDDx NYC 2014

Composeability Composeability Composeability Composeability Composeability Composeability

Page 162: Ur Domain Haz Monoids DDDx NYC 2014

Invest time: Learn DDD, and get

free FP exposure

Page 163: Ur Domain Haz Monoids DDDx NYC 2014

A paradox: FP influence helps craft better Object-

Oriented code!

Page 164: Ur Domain Haz Monoids DDDx NYC 2014

So simple most people

have no appreciation

of that!

Page 165: Ur Domain Haz Monoids DDDx NYC 2014

Monoids are good: Eat Them!

Page 166: Ur Domain Haz Monoids DDDx NYC 2014

LOOK 4 Ur DOMAIN MONOIDZ!

Page 167: Ur Domain Haz Monoids DDDx NYC 2014

Also learn other maths structures

Page 168: Ur Domain Haz Monoids DDDx NYC 2014

Wikipedia is your friend!

Page 169: Ur Domain Haz Monoids DDDx NYC 2014

DDD+FP=

Page 170: Ur Domain Haz Monoids DDDx NYC 2014

http://wadler.blogspot.fr/2008/04/functional-programming-is-beautiful.html

Page 171: Ur Domain Haz Monoids DDDx NYC 2014

Taste-Driven Development

TDD @cyriux

Page 172: Ur Domain Haz Monoids DDDx NYC 2014
Page 173: Ur Domain Haz Monoids DDDx NYC 2014

Questions? Did you try similar things too?

Let’s discuss!

@cyriux

Page 174: Ur Domain Haz Monoids DDDx NYC 2014

Follow me @cyriux !

Slides: slideshare.net/cyriux Blog: cyrille.martraire.com

!

In Paris? Join !

Page 175: Ur Domain Haz Monoids DDDx NYC 2014

Merci

Page 176: Ur Domain Haz Monoids DDDx NYC 2014

Abstractions in the small that

compose at large