Download pdf - Ur Domain Haz Monoids

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


Recommended