functional principles for...
TRANSCRIPT
![Page 1: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/1.jpg)
Functional principles for object-oriented development
@jessitron
![Page 2: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/2.jpg)
![Page 3: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/3.jpg)
Imperative
Procedural
Object-Oriented Functional
Aspect-Oriented Logic
![Page 4: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/4.jpg)
Data In, Data Out
Immutability
Verbs Are People Too
Declarative Style
Specific Typing
Lazy Evaluation
![Page 5: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/5.jpg)
Data In, Data Out
![Page 6: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/6.jpg)
access global state
modify input
change the world
![Page 7: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/7.jpg)
![Page 8: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/8.jpg)
Testable
Easier to understand
![Page 9: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/9.jpg)
Password password; Email email; !
private boolean invalidPassword() { return !password.contains(email); }
![Page 10: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/10.jpg)
private boolean invalidPassword( Password password, Email email) { return !password.contains(email); }
![Page 11: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/11.jpg)
(Email, Password) -> boolean
![Page 12: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/12.jpg)
![Page 13: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/13.jpg)
![Page 14: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/14.jpg)
![Page 15: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/15.jpg)
the flow of data
![Page 16: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/16.jpg)
Get unused deposits
Get unused donations
Create link record
Mark donation done
Deposit used up?
![Page 17: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/17.jpg)
match
Get deposits
Get donations
Store matches
Mark donations
unused unused
![Page 18: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/18.jpg)
![Page 19: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/19.jpg)
List<Deposit> List<Donation>
List<Match<Deposit,Donation>>
List<Donation>
![Page 20: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/20.jpg)
![Page 21: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/21.jpg)
Problem easier, because we know each step of the way of data.
![Page 22: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/22.jpg)
Encapsulation
![Page 23: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/23.jpg)
z
Isolation
![Page 24: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/24.jpg)
![Page 25: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/25.jpg)
!
Response createAccount(UserDbService svc, Request req, Config cfg) { … Account acc = constructAccount(…) AccountInsertResult r = svc.insert(acc) return respond(r); }
![Page 26: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/26.jpg)
Response createAccount( Function<Account, AccountInsertResult> svc, Request req, Config cfg) { … Account acc = constructAccount(…) AccountInsertResult r = svc.apply(acc) return respond(r); }
![Page 27: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/27.jpg)
Specific Typing
![Page 28: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/28.jpg)
The beginning of wisdom is to call things by their right names.
![Page 29: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/29.jpg)
Javapublic Customer(FirstName name, EmailAddress em)
public { public final String stringValue; public FirstName(final ) { this.stringValue = value; } public String toString() {...} public boolean equals() {...} public int hashCode() {...} }
FirstName
String value
class
![Page 30: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/30.jpg)
Scala
val friend = FirstName(“Simon”)
FirstName Stringvalueclasscase ( : )
![Page 31: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/31.jpg)
Scala
FirstName String=type
val friend: FirstName = “Simon”
![Page 32: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/32.jpg)
expressiveness
layers of thinking
![Page 33: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/33.jpg)
![Page 34: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/34.jpg)
time => Costtime => Volume
(Volume, Cost) => Expenditure
time => Expenditure
∴
![Page 35: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/35.jpg)
A => B
B => C
(Volume, Cost) => Expenditure(Volume, Cost) => Expenditure
A => C
∴
![Page 36: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/36.jpg)
![Page 37: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/37.jpg)
Account => AccountInsertResult
![Page 38: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/38.jpg)
Either[AccountCreationFailure, ]
Account =>
AccountInserted
![Page 39: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/39.jpg)
Either[AccountCreationFailure, ]
Account =>
AccountInserted
![Page 40: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/40.jpg)
Errors are data too
![Page 41: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/41.jpg)
![Page 42: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/42.jpg)
![Page 43: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/43.jpg)
access global state
modify input
change the world
![Page 44: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/44.jpg)
access global state
modify input
change the world
interrupt execution flow
![Page 45: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/45.jpg)
Either[AccountCreationFailure, ]
Account =>
AccountInserted
![Page 46: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/46.jpg)
this talk is brought to you by… the Option type!
NPE Thing !
doStuff()
NullThing !
doStuff() {}
SomeThing !
doStuff() {…}
Option<T>
NoneSome<T>
![Page 47: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/47.jpg)
… because null is not a valid object reference.
!
Optional<T>
!
FSharpOption<T>
![Page 48: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/48.jpg)
Verbs Are People Too
![Page 49: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/49.jpg)
![Page 50: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/50.jpg)
class Inflation implements FunctionOverTime { public float valueAt(int t) { return // some calculated value; } }
Java
![Page 51: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/51.jpg)
Javaclass Variable implements FunctionOverTime { private final Function<Int, Double> vals; … public float valueAt(int t) { return vals.apply(t); } }
![Page 52: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/52.jpg)
Java
Variable inflation = new Variable( “Cost Inflation”, t -> Math.Pow(1.15,t)); !
inflation.valueAt(3);
![Page 53: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/53.jpg)
Java 6
Variable inflation = new Variable(“Inflation”, !
!
!
!
!
});
new Function<Integer, Double>() { @Override public Double apply(Integer input) { return ; }
Math.pow(1.15, input)
![Page 54: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/54.jpg)
StrategyCommand
OnClick() release ( )
![Page 55: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/55.jpg)
Imperative
Procedural
Object-Oriented
Functional
Aspect-Oriented Logic
!=
![Page 56: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/56.jpg)
withTransaction( )
// start
// end
![Page 57: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/57.jpg)
Response r = createAccount( (acc) -> userDB.insertAccount(acc), req, cfg);
![Page 58: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/58.jpg)
Response r = createAccount( acc -> withTransaction(userDB.insertAccount(acc)), req, cfg);
![Page 59: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/59.jpg)
Response r = createAccount( acc -> retrying( withTransaction(userDB.insertAccount(acc))), req, cfg);
![Page 60: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/60.jpg)
retrying( )
Code
Code
![Page 61: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/61.jpg)
Idempotence
![Page 62: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/62.jpg)
OnClick() release ( )
![Page 63: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/63.jpg)
Immutability
![Page 64: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/64.jpg)
String
Effective Java Effective C#
![Page 65: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/65.jpg)
Scala
val qty = 4 // immutable
var n = 2 // mutable
![Page 66: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/66.jpg)
let qty = 4 // immutable
let mutable n = 2 // mutable
n = 4 // false
n <- 4 // destructive update
F#
![Page 67: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/67.jpg)
Concurrency
fewer possibilities
![Page 68: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/68.jpg)
Java: easypublic class Address { public final String city; !
public Address(String city) { this.city = city } !
...}
![Page 69: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/69.jpg)
Java: defensive copyprivate final ImmutableList<Phone> phones; !
public Customer (Iterable<Phone> phones) { this.phones = ImmutableList.copyOf(phones); }
![Page 70: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/70.jpg)
Java: copy on modpublic Customer addPhone(Phone newPhone) { Iterable<Phone> morePhones = ImmutableList.builder() .addAll(phones) .add(newPhone).build(); return new Customer(morePhones); }
![Page 71: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/71.jpg)
F#: copy on mod
member this.AddPhone (newPhone : Phone) { new Customer(newPhone :: phones) }
![Page 72: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/72.jpg)
fruit
fruit.add(tomato)
![Page 73: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/73.jpg)
persistent data structure
![Page 74: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/74.jpg)
persistent data structure
![Page 75: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/75.jpg)
C#: shallow copy
public Customer AddPhone(Phone newPhone) { IEnumerable<Phone> morePhones = // create list return new Customer(morePhones, name, address, birthday , cousins); }
![Page 76: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/76.jpg)
![Page 77: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/77.jpg)
this talk is brought to you by… the Tuple type!
function
new Tuple<string,int>(“You win!”, 1000000)
![Page 78: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/78.jpg)
When one return value is not enough!
Tuple<T1,T2,…>
![Page 79: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/79.jpg)
Declarative Style
![Page 80: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/80.jpg)
say what you’re doing,
not how you’re doing it
![Page 81: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/81.jpg)
Never tell people how to do things. Tell them what to do and they will surprise you with their ingenuity.
![Page 82: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/82.jpg)
select ROLE_NAME, UPDATE_DATE from USER_ROLES where USER_ID = :userId
![Page 83: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/83.jpg)
only the essentials
readable code
![Page 84: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/84.jpg)
Javapublic List<String> findBugReports(List<String> lines) { List<String> output = new LinkedList(); for(String s : lines) { if(s.startsWith(“BUG”)) { output.add(s); } } return output; }
![Page 85: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/85.jpg)
familiar != readable
![Page 86: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/86.jpg)
Java
lines.stream() .filter(s -> s.startsWith(“BUG”)) .collect(Collectors.toList)
![Page 87: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/87.jpg)
Java
lines.stream().parallel() .filter(s -> s.startsWith(“BUG”)) .collect(Collectors.toList)
![Page 88: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/88.jpg)
C#
lines.Where(s => s.StartsWith(“BUG”)).ToList
![Page 89: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/89.jpg)
Lazy Evaluation
![Page 90: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/90.jpg)
delay evaluation until the last responsible moment
![Page 91: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/91.jpg)
save work
let go of when
![Page 92: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/92.jpg)
separate what to do from when to stop
![Page 93: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/93.jpg)
int bugCount = 0; String nextLine = file.readLine(); while (bugCount < 40) { if (nextLine.startsWith("BUG")) { String[] words = nextLine.split(" "); report("Saw "+words[0]+" on "+words[1]); bugCount++; } waitUntilFileHasMoreData(file); nextLine = file.readLine(); }
Java
![Page 94: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/94.jpg)
for (String s : FluentIterable.of(new RandomFileIterable(br)) .filter(STARTS_WITH_BUG_PREDICATE) .transform(TRANSFORM_BUG_FUNCTION) .limit(40) .asImmutableList()) { report(s); }
Java 6
![Page 95: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/95.jpg)
![Page 96: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/96.jpg)
Data In, Data Out
Immutability
Verbs Are People Too
Declarative Style
Specific Typing
Lazy Evaluation
![Page 97: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/97.jpg)
I promise not to exclude from consideration any idea
based on its source, but to consider ideas across schools and heritages
in order to find the ones that best suit the current situation.
![Page 98: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/98.jpg)
![Page 99: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/99.jpg)
http://www.sketchport.com/drawing/6606411756732416/aeiou
by Faqqotic
![Page 100: Functional principles for object-orientedgotocon.com/dl/goto-chicago-2014/slides/JessicaKerr...Response createAccount( Function svc, Request req,](https://reader031.vdocuments.site/reader031/viewer/2022022500/5aa3225c7f8b9a436d8dd683/html5/thumbnails/100.jpg)
@jessitron
Jessica Kerr blog.jessitron.com
github.com/jessitron/fp4ood