ur domain haz monoids dddx nyc 2014

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

Upload: martraire-cyrille

Post on 01-Dec-2014

180 views

Category:

Software


2 download

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

TRANSCRIPT

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