ur domain haz monoids

164
Ur Domain Haz Monoids? Cyrille Martraire - @cyriux

Upload: martraire-cyrille

Post on 29-Nov-2014

1.027 views

Category:

Technology


0 download

DESCRIPTION

Domain-Driven Design (DDD) and Functional Programming (FP) have a lot of good things in common: DDD has borrowed many ideas from the FP community, and both share a common inspiration on established formalisms like maths. Even in non functional languages like Java or C#, this combined set of practices from DDD, OO and FP helps craft simple and powerful code that reads well, that is very easy to test, that composes well and that can somehow describe itself. We will have a closer look at some of these ideas, in the context of domain models inspired from real-world projects. From value objects and DSL to abstract algebra creatures like monoids and friends, we will show how all that translates into beautiful code that may influence your coding style!

TRANSCRIPT

Page 1: Ur Domain Haz Monoids

Ur Domain Haz Monoids?

Cyrille Martraire - @cyriux

Page 2: Ur Domain Haz Monoids

"My first encounter with FP concepts was from

DDD"

Page 3: Ur Domain Haz Monoids

A matter of Taste

http://rosshirt.blogspot.fr/

The CodeGourmet

(dedicated to @ziobrando)

Page 4: Ur Domain Haz Monoids

FP

Page 5: Ur Domain Haz Monoids

Passionate developer

PARISSince 1999

@cyriuxCyrille Martraire

Page 6: Ur Domain Haz Monoids

Paris Software Craftsmanship Community

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

Page 7: Ur Domain Haz Monoids

TDDBDDDDDLegacy

Page 8: Ur Domain Haz Monoids

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 9: Ur Domain Haz Monoids

a bit personal

Page 10: Ur Domain Haz Monoids

Adopted 2005Still in love

Page 11: Ur Domain Haz Monoids

...

Page 12: Ur Domain Haz Monoids

What do DDD & FP have in common?

Page 13: Ur Domain Haz Monoids

FP = ?

Page 14: Ur Domain Haz Monoids
Page 15: Ur Domain Haz Monoids
Page 17: Ur Domain Haz Monoids

No StateNo War

Page 18: Ur Domain Haz Monoids
Page 19: Ur Domain Haz Monoids

So what do DDD & FP

have in common?

Page 20: Ur Domain Haz Monoids

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

Page 21: Ur Domain Haz Monoids

Learn oneand get the other

one for FREE!

Page 22: Ur Domain Haz Monoids

DDDFP

(OO)

Page 23: Ur Domain Haz Monoids

NICE STYLE

of code

Page 24: Ur Domain Haz Monoids

DDD+FP = ?

Page 25: Ur Domain Haz Monoids
Page 26: Ur Domain Haz Monoids

Example PLZ?

Page 27: Ur Domain Haz Monoids

MONOIDZ!

Page 28: Ur Domain Haz Monoids

@cyriux

Page 29: Ur Domain Haz Monoids

ClosureAssociativity

Neutral Element

Page 30: Ur Domain Haz Monoids
Page 31: Ur Domain Haz Monoids

only 3 numbers in

programming

Page 32: Ur Domain Haz Monoids

0, 1, MANY

Page 33: Ur Domain Haz Monoids

Monoid:encapsulate

diversity inside

Page 34: Ur Domain Haz Monoids

0, 1, MANY

Neutral Element

Element

Operation

Page 35: Ur Domain Haz Monoids

Battle against complexity

Page 36: Ur Domain Haz Monoids

Encapsulate details (unit...)

→ simple again

Page 37: Ur Domain Haz Monoids

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

OO FTW!

Page 38: Ur Domain Haz Monoids

0, 1, MANY

NullObject

Implementation(s)

Composite

Page 39: Ur Domain Haz Monoids

Identity Element

= NullObject

VatCalculation.NONE

Page 40: Ur Domain Haz Monoids

Applied often:

→ scalable process

→ can grow to very complex complexity

Page 41: Ur Domain Haz Monoids

Example PLZ!

Page 42: Ur Domain Haz Monoids

Numbersint+int=int

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

Page 43: Ur Domain Haz Monoids

Lists

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

()

Page 44: Ur Domain Haz Monoids

Strings

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

""

Page 45: Ur Domain Haz Monoids

look simplistic;the key to very

complex behavior

Page 46: Ur Domain Haz Monoids

The key to infinite scalability!

Page 47: Ur Domain Haz Monoids

The key to infinite incremental computing!

Page 48: Ur Domain Haz Monoids

Hadoop x Storm

Page 49: Ur Domain Haz Monoids

Composeability

Page 50: Ur Domain Haz Monoids

Monoids ☛ reduce

Page 51: Ur Domain Haz Monoids

Monoids ☛ domain

Page 52: Ur Domain Haz Monoids

Monoids are typical FP

Page 53: Ur Domain Haz Monoids

FP: everything is a value

Page 54: Ur Domain Haz Monoids

Therefore:Monoids are

values!

Page 55: Ur Domain Haz Monoids

VALUEOBJECTS

Page 56: Ur Domain Haz Monoids

ImmutableEquals by value

Page 57: Ur Domain Haz Monoids

Not Anemic

Page 58: Ur Domain Haz Monoids

18°C+ 16°C= 34°C

Page 59: Ur Domain Haz Monoids

returns  a  new  instance

Change -> new instance

Page 60: Ur Domain Haz Monoids

SIDE-EFFECT -free

FUNCTIONS

Page 61: Ur Domain Haz Monoids

Immutability&

Side-effect-free functions!

Page 62: Ur Domain Haz Monoids

Value Object

A DDD patternto import FP-ish

values in OO languages

Page 63: Ur Domain Haz Monoids

“Functional-First” style

Page 64: Ur Domain Haz Monoids

90%“Functional-First” style

Value Objects

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

Page 65: Ur Domain Haz Monoids

Money

Page 66: Ur Domain Haz Monoids

(25, EUR)+

(30, EUR)=

(55, EUR)

Page 67: Ur Domain Haz Monoids

(25, EUR)+

(30, USD)=

exception

Page 68: Ur Domain Haz Monoids

Money

amountcurrencyadd(Money): Money

<<ValueObject>>

Page 69: Ur Domain Haz Monoids
Page 70: Ur Domain Haz Monoids

Cashflows (Payments)

Page 71: Ur Domain Haz Monoids

(25, EUR, today)+

(30, EUR, today)=

(55, EUR, today)

Page 72: Ur Domain Haz Monoids

(25, EUR, today)+

(30, EUR, next day)=

exception

Page 73: Ur Domain Haz Monoids

CashFlow

amountcurrencydate

add(CashFlow):CashFlow

<<ValueObject>>

Page 74: Ur Domain Haz Monoids

CLOSURE of

OPERATION

Page 75: Ur Domain Haz Monoids

Cashflows Sequences

Page 76: Ur Domain Haz Monoids

(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 77: Ur Domain Haz Monoids

Cashflow Sequence +

Cashflow Sequence =

Cashflow Sequence

Page 78: Ur Domain Haz Monoids

ObjectArithmetics

Page 79: Ur Domain Haz Monoids

This is how domain experts THINK

about itSAY

SKETCH

Page 80: Ur Domain Haz Monoids
Page 81: Ur Domain Haz Monoids

Ranges

Page 82: Ur Domain Haz Monoids

[1, 3]Union [2, 4]

= [1, 4]

Page 83: Ur Domain Haz Monoids

[1, 3]Union [2, 4]

= [1, 4] ][

Page 84: Ur Domain Haz Monoids

Predicates

Page 85: Ur Domain Haz Monoids

FilterAND Filter

= Filter

Page 86: Ur Domain Haz Monoids

FilterAND Filter

= Filter

Always

True

Page 87: Ur Domain Haz Monoids

FilterOR

Filter=

Filter

Page 88: Ur Domain Haz Monoids

FilterOR

Filter=

FilterAlways

False

Page 89: Ur Domain Haz Monoids

Grants

Page 90: Ur Domain Haz Monoids

Read, Write, Execute

"most secure wins"

r + w = rw + x = w

Page 91: Ur Domain Haz Monoids

Configuration Maps

Page 92: Ur Domain Haz Monoids

+

=

Color BLUE

Enable TrueTimeout 30 +

=

Color RED

Enable FalseTimeout 25

Desk FX

Color RED

Enable TrueTimeout 25

Desk FX

Default Desk-specific

Page 93: Ur Domain Haz Monoids

+

=

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 94: Ur Domain Haz Monoids

+

=

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 95: Ur Domain Haz Monoids

+

=

Color BLUE

Enable TrueTimeout 30 +

=

Neutral Element

Color BLUE

Enable TrueTimeout 30

Page 96: Ur Domain Haz Monoids

+

=

Color BLUE

Enable TrueTimeout 30 +

=Color BLUE

Enable TrueTimeout 30

Value Objects may be

*BIG* object trees!

(DOM)

Page 97: Ur Domain Haz Monoids
Page 98: Ur Domain Haz Monoids

Non-Linear Stuff(average, std dev,

K-clustering, barycenters...)

Page 99: Ur Domain Haz Monoids

Average + Average = WRONG

Page 100: Ur Domain Haz Monoids

Average + Average Not Composeable!

Page 101: Ur Domain Haz Monoids
Page 102: Ur Domain Haz Monoids
Page 103: Ur Domain Haz Monoids

avg = sum / count

avg = sum / count

Page 104: Ur Domain Haz Monoids

avg = sum / count

avg = sum / count+

Page 105: Ur Domain Haz Monoids

avg = sum / count

avg = sum / count+ +

Page 106: Ur Domain Haz Monoids

avg = sum / count

avg = sum / count

avg = sum / count

+

=

+

=

Page 107: Ur Domain Haz Monoids

(sum, count)

(sum, count)

(sum, count)

+

=

Average

Page 108: Ur Domain Haz Monoids

(sum, sum2, count)

(sum, sum2, count)

(sum, sum2, count)

+

=

Std deviation

Page 109: Ur Domain Haz Monoids

Can model as a monoid even non-

linear stuff!

Page 110: Ur Domain Haz Monoids
Page 111: Ur Domain Haz Monoids

MOARMATHS

PLZ!

Page 112: Ur Domain Haz Monoids

Monoid several times...

toString(): Stringunion(MailingList): MailingListintersection(MailingList): MailingListnobody(): MailingListeverybody(): MailingList

MailingList

Page 113: Ur Domain Haz Monoids

Space Vectors

Page 114: Ur Domain Haz Monoids

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

Page 115: Ur Domain Haz Monoids

returns  a  new  instance

Change -> new instance

Page 116: Ur Domain Haz Monoids

Space Vector

toCelsius(): TemperaturetoFarenheit(): Temperatureadd(Temperature): Temperaturescale(double): Temperature

Temperature

Page 117: Ur Domain Haz Monoids

Why is it useful?

Page 118: Ur Domain Haz Monoids

(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 119: Ur Domain Haz Monoids

Cashflow Sequence +

Cashflow Sequence =

Cashflow Sequence

Page 120: Ur Domain Haz Monoids

This is how domain experts THINK

about itSAY

SKETCH

Page 121: Ur Domain Haz Monoids

DECLARATIVE STYLE

Page 122: Ur Domain Haz Monoids

Much less codeMuch less bugs

Page 123: Ur Domain Haz Monoids
Page 124: Ur Domain Haz Monoids

// without monoidsPaymentsFees(...)PaymentsFeesWithOptions(...)PaymentsFeesWithInsuranceAndOptions(...)PaymentsFeesWithInsurance(...)NoFeesButInsurance(...)...

// with monoidsfees(...) : Paymentsoptions(...) : Paymentsinsurance(...) : Payments

Payments.add(Payments) : Payments

Page 125: Ur Domain Haz Monoids

side-effect-free

operation

Very easy to test

input output

Page 126: Ur Domain Haz Monoids

Much less stuff to learn

Page 127: Ur Domain Haz Monoids

1 interface to rule them all

Page 128: Ur Domain Haz Monoids

Cashflow Sequence +

Cashflow Sequence =

Cashflow Sequence

Page 129: Ur Domain Haz Monoids

ESTABLISHEDFORMALISMS

Page 130: Ur Domain Haz Monoids

Monoid/Vector Spaces/Cyclic Group

Page 131: Ur Domain Haz Monoids

LiteratureDocumented

Page 132: Ur Domain Haz Monoids

@annotations

@Monoid()intersection(MailingList): MailingList

@NeutralElement("intersection")nobody(): MailingList

MailingList

Page 133: Ur Domain Haz Monoids

LIVINGDOCUMENTATION

Page 134: Ur Domain Haz Monoids

Signal to Noise ratio

http://www.flickr.com/photos/28471130@N07/2666802097

Page 135: Ur Domain Haz Monoids

Signal to Noise Ratio

• SNR ≥ 80 %

• Signal (VO): CashFlow.multiply(), CashFlowSequence.add(), .negate(), truncate(), Money.add(), .times(), .opposite(), Fixing, FinancialProduct, BankHolidays, ReferenceData

• Noise: CashFlowBuilder, CompositeEngine, ProductFactory, BankHolidaysDecorator

Page 136: Ur Domain Haz Monoids

Write code that tells the business

domain stories

Page 137: Ur Domain Haz Monoids

@annotations

@Monoid()intersection(MailingList): MailingList

@NeutralElement("intersection")nobody(): MailingList

MailingList

Page 138: Ur Domain Haz Monoids

Domain-Specific

@Monoid()overlaping(MailingList): MailingList

@NeutralElement("overlaping")nobody(): MailingList

MailingList

Page 139: Ur Domain Haz Monoids

Value Objects have domain-specific

flavors too:

Convention, Policy, Status, Quantity,

Observation...

Page 140: Ur Domain Haz Monoids

- Annotate domain-relevant classes

- Custom Doclet to export Excel-formatted glossary of every domain concept

Glossary from Code

Page 141: Ur Domain Haz Monoids

Sent directly to end customers

Glossary from Code

Page 142: Ur Domain Haz Monoids

SELF-EXPLAINING VALUES

Page 143: Ur Domain Haz Monoids

We Want:Traceability of processing

Page 144: Ur Domain Haz Monoids

No worry!

Page 145: Ur Domain Haz Monoids

Just enrich our types

Page 146: Ur Domain Haz Monoids

Just enrich our types

Page 147: Ur Domain Haz Monoids

Just enrich our types

label field

Page 148: Ur Domain Haz Monoids

Monad-ishNo logging neededEach value stores

its history

Page 150: Ur Domain Haz Monoids
Page 151: Ur Domain Haz Monoids

In Closing

Page 152: Ur Domain Haz Monoids

Invest time:

Learn DDD, and get free FP exposure

Page 153: Ur Domain Haz Monoids

A paradox:

FP influence helps craft better Object-

Oriented code!

Page 154: Ur Domain Haz Monoids

Monoids are good: Eat Them!

Page 155: Ur Domain Haz Monoids

LOOK 4 Ur DOMAIN MONOIDZ!

Page 156: Ur Domain Haz Monoids

Also learn other maths structures

Page 157: Ur Domain Haz Monoids

Wikipedia is your friend!

Page 158: Ur Domain Haz Monoids

DDD+FP=

Page 160: Ur Domain Haz Monoids

Taste-Driven Development

TDD

Page 161: Ur Domain Haz Monoids
Page 162: Ur Domain Haz Monoids

Questions? Did you try similar things too?

Let’s discuss!

@cyriux

Page 163: Ur Domain Haz Monoids

Follow me @cyriux

Slides: slideshare.net/cyriux

Blog: cyrille.martraire.com

In Paris? Join !

Page 164: Ur Domain Haz Monoids

Merci