ur domain haz monoids dddx nyc 2014
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#programTRANSCRIPT
![Page 1: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/1.jpg)
Ur Domain Haz Monoids?
cyrille martraire aka @cyriux DDDx NYC 14
![Page 2: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/2.jpg)
Can you tell the
difference?
![Page 3: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/3.jpg)
Monoid
![Page 4: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/4.jpg)
Glass of beer
![Page 5: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/5.jpg)
This talk is the answer
![Page 6: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/6.jpg)
DDD
![Page 7: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/7.jpg)
FP
![Page 8: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/8.jpg)
(00)
![Page 9: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/9.jpg)
A matter of Taste
http://rosshirt.blogspot.fr/
The Code Gourmet
(dedicated to @ziobrando)
![Page 10: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/10.jpg)
Passionate developer
PARIS Since 1999
!@cyriux
Cyrille Martraire
![Page 11: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/11.jpg)
Paris Software Craftsmanship Community
http://www.meetup.com/paris-software-craftsmanship/
![Page 12: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/12.jpg)
TDDBDDDDDLegacy
![Page 13: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/13.jpg)
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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/14.jpg)
a bit personal
![Page 15: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/15.jpg)
Adopted 2005 Still in love
![Page 16: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/16.jpg)
...
![Page 17: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/17.jpg)
What do DDD & FP have in common?
![Page 18: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/18.jpg)
"My first encounter with FP concepts was from DDD"
![Page 19: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/19.jpg)
FP = ?
![Page 20: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/20.jpg)
![Page 21: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/21.jpg)
![Page 22: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/22.jpg)
http://www.jaider.net/archives/609-intro-to-functional-programming/
PURE
![Page 23: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/23.jpg)
No State No War
![Page 24: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/24.jpg)
![Page 25: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/25.jpg)
So what do DDD & FP
have in common?
![Page 26: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/26.jpg)
Value Objects................................................................................................. 19
![Page 27: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/27.jpg)
Learn one
and get the other
one for FREE!
![Page 28: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/28.jpg)
DDDFP
(OO)
![Page 29: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/29.jpg)
NICE STYLE
of code
![Page 30: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/30.jpg)
DDD+FP = ?
![Page 31: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/31.jpg)
![Page 32: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/32.jpg)
Example PLZ?
![Page 33: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/33.jpg)
MONOIDZ!
![Page 34: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/34.jpg)
@cyriux
![Page 35: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/35.jpg)
Closure Associativity
Neutral Element
![Page 36: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/36.jpg)
![Page 37: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/37.jpg)
only 3 numbers in
programming
![Page 38: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/38.jpg)
0, 1, MANY
![Page 39: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/39.jpg)
Monoid: encapsulate
diversity inside
![Page 40: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/40.jpg)
0, 1, MANY
Neutral Element
Element
Operation
![Page 41: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/41.jpg)
Encapsulate special cases
→ simple again
![Page 42: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/42.jpg)
Battle against complexity
![Page 43: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/43.jpg)
× × × …
![Page 44: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/44.jpg)
× × × …
![Page 45: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/45.jpg)
× × × …
![Page 46: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/46.jpg)
Applied often:
→ scalable process
→ can grow to very complex complexity
![Page 47: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/47.jpg)
Scalable in complexity
![Page 48: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/48.jpg)
For a given interface I find myself doing often 0, 1, Many
OO FTW!
![Page 49: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/49.jpg)
0, 1, MANY
NullObject
Implementation(s)
Composite
![Page 50: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/50.jpg)
Identity Element = NullObject
VatCalculation.NONE
![Page 51: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/51.jpg)
Example PLZ!
![Page 52: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/52.jpg)
Numbers int+int=int
(3+5)+2=3+(5+2) 0
![Page 53: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/53.jpg)
Lists (.)+(.,.)=(.,.,.)
(a ︎)+(b,︎c)=(a ︎, b)+(c) ()
![Page 54: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/54.jpg)
Strings "hello"+"world" "cy"+"ri"+"lle"
""
![Page 55: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/55.jpg)
look simplistic; the key to very
complex behavior
![Page 56: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/56.jpg)
The key to infinite scalability!
(space)
![Page 57: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/57.jpg)
The key to infinite incremental computing!
(ti
me)
![Page 58: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/58.jpg)
Hadoop x Storm
![Page 59: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/59.jpg)
Composeability
![Page 60: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/60.jpg)
Monoids ☛ reduce
![Page 61: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/61.jpg)
Monoids ☛ domain
![Page 62: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/62.jpg)
Monoids ☛ domain
![Page 63: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/63.jpg)
Monoids: typical FP
![Page 64: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/64.jpg)
FP: Everything is a
value
![Page 65: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/65.jpg)
Therefore: Monoids are
values!
PROOF
![Page 66: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/66.jpg)
VALUE OBJECTS
![Page 67: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/67.jpg)
Immutable Equals by value
![Page 68: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/68.jpg)
Value Object
A DDD pattern to import FP-ish
values in OO languages
![Page 69: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/69.jpg)
Not Anemic
![Page 70: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/70.jpg)
18 m + 16 m = 34 m
![Page 71: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/71.jpg)
returns a new instance
Change -> new instance
![Page 72: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/72.jpg)
SIDE-EFFECT -free
FUNCTIONS
![Page 73: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/73.jpg)
Immutability &
Side-effect-free functions!
![Page 74: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/74.jpg)
“Functional-First” style
![Page 75: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/75.jpg)
90%“Functional-First” style
Value Objects
(Ok, gut feeling, I did’nt measure)
![Page 76: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/76.jpg)
Money
![Page 77: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/77.jpg)
(25, EUR) +
(30, EUR) =
(55, EUR)
![Page 78: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/78.jpg)
(25, EUR) +
(30, USD) =
exception
![Page 79: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/79.jpg)
Money
amount currencyadd(Money): Money
<<ValueObject>>
![Page 80: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/80.jpg)
![Page 81: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/81.jpg)
Cashflows (Payments)
![Page 82: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/82.jpg)
(25, EUR, today) +
(30, EUR, today) =
(55, EUR, today)
![Page 83: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/83.jpg)
(25, EUR, today) +
(30, EUR, next day) =
exception
![Page 84: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/84.jpg)
CashFlow
amount currency date
add(CashFlow):CashFlow
<<ValueObject>>
![Page 85: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/85.jpg)
CLOSURE of
OPERATION
![Page 86: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/86.jpg)
Cashflows Sequences
![Page 87: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/87.jpg)
(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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/88.jpg)
Cashflow Sequence +
Cashflow Sequence =
Cashflow Sequence
![Page 89: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/89.jpg)
Object Arithmetics
![Page 90: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/90.jpg)
This is how domain experts THINK
about itSAY
SKETCH
![Page 91: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/91.jpg)
![Page 92: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/92.jpg)
Ranges
![Page 93: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/93.jpg)
[1, 3] Union* [2, 4]
= [1, 4]
* for a bounding box-kind definition of union
![Page 94: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/94.jpg)
[1, 3] Union [2, 4]
= [1, 4] ][
![Page 95: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/95.jpg)
Predicates
![Page 96: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/96.jpg)
Filter AND Filter
= Filter
![Page 97: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/97.jpg)
Filter AND Filter
= Filter
Always
True
![Page 98: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/98.jpg)
Filter OR
Filter =
Filter
![Page 99: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/99.jpg)
Filter OR
Filter =
FilterAlways
False
![Page 100: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/100.jpg)
Grants
![Page 101: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/101.jpg)
Read, Write, Execute !
"most secure wins" !
r + w = r w + x = w
![Page 102: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/102.jpg)
Configuration Maps
![Page 103: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/103.jpg)
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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/104.jpg)
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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/105.jpg)
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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/106.jpg)
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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/107.jpg)
Color BLUE
Enable TrueTimeout 30 +
=Color BLUE
Enable TrueTimeout 30
Neutral Element
![Page 108: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/108.jpg)
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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/109.jpg)
![Page 110: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/110.jpg)
Non-Linear Stuff (average, std dev,
K-clustering, barycenters...)
![Page 111: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/111.jpg)
Average + Average = WRONG
![Page 112: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/112.jpg)
Average + Average Not Composeable!
![Page 113: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/113.jpg)
![Page 114: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/114.jpg)
![Page 115: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/115.jpg)
avg = sum / count !
avg = sum / count !
![Page 116: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/116.jpg)
avg = sum / count !
avg = sum / count !
+
![Page 117: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/117.jpg)
avg = sum / count !
avg = sum / count !
+ +
![Page 118: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/118.jpg)
avg = sum / count !
avg = sum / count !
avg = sum / count
+
=
+
=
![Page 119: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/119.jpg)
(sum, count) !
(sum, count) !
(sum, count)
+
=
Average
![Page 120: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/120.jpg)
(sum, sum2, count) !
(sum, sum2, count) !
(sum, sum2, count)
+
=
Std deviation
![Page 121: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/121.jpg)
Can model as a monoid even non-
linear stuff!
![Page 122: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/122.jpg)
![Page 123: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/123.jpg)
MOAR MATHS
PLZ!
![Page 124: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/124.jpg)
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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/125.jpg)
Space Vectors
![Page 126: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/126.jpg)
average temperature! = t1.add(t2)! .scale(1/2)
![Page 127: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/127.jpg)
returns a new instance
Change -> new instance
![Page 128: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/128.jpg)
Space Vector
toCelsius(): Temperature toFarenheit(): Temperature add(Temperature): Temperature scale(double): Temperature
Temperature
![Page 129: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/129.jpg)
Why is it useful?
![Page 130: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/130.jpg)
(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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/131.jpg)
Cashflow Sequence +
Cashflow Sequence =
Cashflow Sequence
![Page 132: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/132.jpg)
This is how domain experts THINK
about itSAY
SKETCH
![Page 133: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/133.jpg)
DECLARATIVE STYLE
![Page 134: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/134.jpg)
Much less code Much less bugs
![Page 135: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/135.jpg)
![Page 136: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/136.jpg)
// 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](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/137.jpg)
// without monoids PaymentsFees(...) PaymentsFeesWithOptions(...) PaymentsFeesWithInsuranceAndOptions(...) PaymentsFeesWithInsurance(...) NoFeesButInsurance(...) ...
![Page 138: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/138.jpg)
// with monoids fees(...) : Payments options(...) : Payments insurance(...) : Payments !Payments.add(Payments) : Payments
![Page 139: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/139.jpg)
side-effect-free
operation
Very easy to test
input output
![Page 140: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/140.jpg)
Much less stuff to learn
![Page 141: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/141.jpg)
1 interface to rule them all
![Page 142: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/142.jpg)
Cashflow Sequence +
Cashflow Sequence =
Cashflow Sequence
![Page 143: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/143.jpg)
ESTABLISHED FORMALISMS
![Page 144: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/144.jpg)
Monoid/Vector Spaces/Cyclic Group
![Page 145: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/145.jpg)
Literature Documented
![Page 146: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/146.jpg)
@annotations
@Monoid(neutral="emptyList") intersection(MailingList): MailingList !emptyList(): MailingList
MailingList
![Page 147: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/147.jpg)
LIVING DOCUMENTATION
![Page 148: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/148.jpg)
Write code that tells the business
domain stories
![Page 149: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/149.jpg)
generic naming
@Monoid(neutral="emptyList") intersection(MailingList): MailingList !emptyList(): MailingList
MailingList
![Page 150: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/150.jpg)
Domain-Specific naming
@Monoid(neutral="nobody") overlapping(MailingList): MailingList !nobody(): MailingList
MailingList
![Page 151: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/151.jpg)
SELF-EXPLAINING VALUES
![Page 152: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/152.jpg)
We Want:Traceability of processing
![Page 153: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/153.jpg)
No worry!
![Page 154: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/154.jpg)
Just enrich our types
![Page 155: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/155.jpg)
Just enrich our types
![Page 156: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/156.jpg)
Just enrich our types
!
label field
![Page 157: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/157.jpg)
Monad-ish No logging needed Each value stores
its history
![Page 158: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/158.jpg)
http://stuartcook.files.wordpress.com/2010/11/happy-monkey.jpg
![Page 159: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/159.jpg)
![Page 160: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/160.jpg)
In Closing
![Page 161: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/161.jpg)
Composeability Composeability Composeability Composeability Composeability Composeability
![Page 162: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/162.jpg)
Invest time: Learn DDD, and get
free FP exposure
![Page 163: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/163.jpg)
A paradox: FP influence helps craft better Object-
Oriented code!
![Page 164: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/164.jpg)
So simple most people
have no appreciation
of that!
![Page 165: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/165.jpg)
Monoids are good: Eat Them!
![Page 166: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/166.jpg)
LOOK 4 Ur DOMAIN MONOIDZ!
![Page 167: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/167.jpg)
Also learn other maths structures
![Page 168: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/168.jpg)
Wikipedia is your friend!
![Page 169: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/169.jpg)
DDD+FP=
![Page 170: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/170.jpg)
http://wadler.blogspot.fr/2008/04/functional-programming-is-beautiful.html
![Page 171: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/171.jpg)
Taste-Driven Development
TDD @cyriux
![Page 172: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/172.jpg)
![Page 173: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/173.jpg)
Questions? Did you try similar things too?
Let’s discuss!
@cyriux
![Page 174: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/174.jpg)
Follow me @cyriux !
Slides: slideshare.net/cyriux Blog: cyrille.martraire.com
!
In Paris? Join !
![Page 175: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/175.jpg)
Merci
![Page 176: Ur Domain Haz Monoids DDDx NYC 2014](https://reader035.vdocuments.mx/reader035/viewer/2022062615/547e8033b47959b1508b4b57/html5/thumbnails/176.jpg)
Abstractions in the small that
compose at large