+ All Categories
Home > Documents > functional principles for object-oriented development

functional principles for object-oriented development

Date post: 01-Jan-2016
Category:
Upload: candace-roberson
View: 49 times
Download: 3 times
Share this document with a friend
Description:
functional principles for object-oriented development. @jessitron. Imperative. Procedural. Functional. Object-Oriented. Logic. Aspect-Oriented. Data In, Data Out. Immutability. Verbs Are People Too. Declarative Style. Specific Typing. Lazy Evaluation. What is it?. Principle. - PowerPoint PPT Presentation
80
functional principles for object-oriented development @jessitron
Transcript
Page 1: functional principles for object-oriented development

functional principles for

object-oriented development

@jessitron

Page 2: functional principles for object-oriented development
Page 3: functional principles for object-oriented development
Page 4: functional principles for object-oriented development

Imperative

Procedural

Object-Oriented Functional

Aspect-Oriented Logic

Page 5: functional principles for object-oriented development
Page 6: functional principles for object-oriented development
Page 7: functional principles for object-oriented development

Data In, Data Out

Immutability

Verbs Are People Too

Declarative Style

Specific Typing

Lazy Evaluation

Page 8: functional principles for object-oriented development

What is it?What is it?

PrinciplePrinciple

What is it?What is it?

We already do itWe already do it

What’s the point?What’s the point?

What is it?What is it?

Scala / F#Scala / F#

Java / C#Java / C#

Page 9: functional principles for object-oriented development

Data In, Data Out

Page 10: functional principles for object-oriented development

access global state

modify input

change the world

Page 11: functional principles for object-oriented development

Data In -> ? -> Data out

inputoutput

Page 12: functional principles for object-oriented development

Testable

Easier to understand

Page 13: functional principles for object-oriented development

the flow of datathe flow of data

Page 14: functional principles for object-oriented development
Page 15: functional principles for object-oriented development

List<Deposit> List<Donation>

List<Match<Deposit,Donation>>

List<Donation>

Page 16: functional principles for object-oriented development

Problem easier, because we know each step of the way of data.

Page 17: functional principles for object-oriented development

public string CreateAccount(UserDbService db, String email, String password) { …}

Page 18: functional principles for object-oriented development

String password;String email;

private boolean invalidPassword() { return !password.contains(email);}

Page 19: functional principles for object-oriented development

private boolean invalidPassword(String password, String email) { return !password.contains(email);}

Page 20: functional principles for object-oriented development

Immutability

Page 21: functional principles for object-oriented development

modify anything

Page 22: functional principles for object-oriented development

Concurrency

fewer possibilities

Page 23: functional principles for object-oriented development

NPENPE

Page 24: functional principles for object-oriented development

c c

Page 25: functional principles for object-oriented development

String

Effective JavaEffective C#

Page 26: functional principles for object-oriented development

ScalaScala

val qty = 4 // immutable

var n = 2 // mutable

Page 27: functional principles for object-oriented development

let qty = 4 // immutable

let mutable n = 2 // mutable

n = 4 // false

n <- 4 // destructive update

F#F#

Page 28: functional principles for object-oriented development

C#: easyC#: easy

public struct Address { private readonly string city;

public Address(string city) : this() { this.city = city; }

public string City { get { return city; } }

Page 29: functional principles for object-oriented development

Java: defensive copyJava: defensive copy

private final ImmutableList<Phone> phones;

public Customer (Iterable<Phone> phones) { this.phones = ImmutableList.copyOf(phones);}

Page 30: functional principles for object-oriented development

Java: copy on modJava: copy on mod

public Customer addPhone(Phone newPhone) { Iterable<Phone> morePhones = ImmutableList.builder() .addAll(phones) .add(newPhone).build(); return new Customer(morePhones);}

Page 31: functional principles for object-oriented development

fruit

fruit.add(tomato)

Page 32: functional principles for object-oriented development

F#: copy on modF#: copy on mod

member this.AddPhone (newPhone : Phone) { new Customer(newPhone :: phones)}

Page 33: functional principles for object-oriented development

C#: shallow copyC#: shallow copy

public Customer AddPhone(Phone newPhone) { IEnumerable<Phone> morePhones = // create list return new Customer(morePhones, name, address, birthday, cousins);}

Page 34: functional principles for object-oriented development

this talk is brought to you by… the Option type!

NPENPE Thing

doStuff()

NullThing

doStuff() {}

SomeThing

doStuff() {…}

Option<T>Option<T>

NoneNoneSome<T>Some<T>

Page 35: functional principles for object-oriented development

… because null is not a valid object reference.

Optional<T>

FSharpOption<T>

Page 36: functional principles for object-oriented development

Verbs Are People Too

Page 37: functional principles for object-oriented development
Page 38: functional principles for object-oriented development

Imperative

Procedural

Object-Oriented

Functional

Aspect-Oriented Logic

!=

Page 39: functional principles for object-oriented development

Strategy

CommandOnClick()

release ( )

Page 40: functional principles for object-oriented development

class CostInflation implements FunctionOverTime { public float valueAt(int t) { return // some calculated value; }}

JavaJava

Page 41: functional principles for object-oriented development

val costInflation = Variable ( “Cost Inflation”, t => Math.pow(1.15,t))

val seasonalVolume = Array(0.95,0.99,1.01,…)

val seasonalAdjustment = Variable(“Season”, t => seasonalVolume(t))

ScalaScala

Page 42: functional principles for object-oriented development

C#C#

private readonly Func<int, double> calc;

public Func<int, double> ValueAt{ get { return calc; }}

Page 43: functional principles for object-oriented development

C#C#

var inflation = new Variable(“Inflation”, t => Math.Pow(1.15,t));

inflation.ValueAt(3);

Page 44: functional principles for object-oriented development

JavaJava

Variable inflation = new Variable (“Inflation”, new Function<Integer, Double>() { @Override public Double apply(Integer input) { return Math.pow(1.15, input); } });

Page 45: functional principles for object-oriented development

Java 8Java 8

Variable inflation = new Variable (“Inflation”, t => Math.pow(1.15, t) );

Page 46: functional principles for object-oriented development

Declarative Style

Page 47: functional principles for object-oriented development

say what you’re doing, not how you’re doing it

Page 48: functional principles for object-oriented development

Select ROLE_NAME, UPDATE_DATEFrom USER_ROLESWhere USER_ID = :userId

Page 49: functional principles for object-oriented development

smaller pieces

readable code

Page 50: functional principles for object-oriented development

familiar != readable

familiar != readable

Page 51: functional principles for object-oriented development

JavaJava

public 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 52: functional principles for object-oriented development

ScalaScala

lines.filter( _.startsWith(“BUG”))

lines.par.filter( _.startsWith(“BUG”))

Page 53: functional principles for object-oriented development

JavaJava

final Predicate<String> startsWithBug = new Predicate<String>() { public boolean apply(String s) { return s.startsWith("BUG"); } };

filter(list, startsWithBug);

Page 54: functional principles for object-oriented development

C#C#

lines.Where(s => s.StartsWith(“BUG”)).ToList

Page 55: functional principles for object-oriented development

this talk is brought to you by… the Tuple type!

function

new Tuple<string,int>(“You win!”, 1000000)

Page 56: functional principles for object-oriented development

When one return value is not enough!

Tuple<T1,T2,…>

Page 57: functional principles for object-oriented development

Specific Typing

Page 58: functional principles for object-oriented development

expressiveness

catch errors early

Page 59: functional principles for object-oriented development
Page 60: functional principles for object-oriented development
Page 61: functional principles for object-oriented development

The beginning of wisdom is to call things by their right names.

Page 62: functional principles for object-oriented development

F#F#

[<Measure>] type cents

let price = 599<cents>

Page 63: functional principles for object-oriented development

ScalaScala

type FirstName = String // type alias

Customer(name : FirstName, home : EmailAddress)

Page 64: functional principles for object-oriented development

ScalaScala

case class FirstName(value : String)

let friend = FirstName(“Ivana”);

Page 65: functional principles for object-oriented development

JavaJava

public User(FirstName name, EmailAddress login)

public class FirstName { public final String stringValue;

public FirstName(final String value) { this.stringValue = value; }

public String toString() {...} public boolean equals() {...} public int hashCode() {...}}

Page 66: functional principles for object-oriented development

State everything you

need

State only what you

need

Page 68: functional principles for object-oriented development

C#: weakC#: weak

public boolean Valid(Customer cust) { EmailAddress email = cust.EmailAddress; // exercise business logic return true; }

Page 69: functional principles for object-oriented development

C#: weakC#: weak

public boolean Valid(IHasEmailAddress anything) { EmailAddress email = anything.EmailAddress; // exercise business logic return true; }

interface IHasEmailAddress { string EmailAddress {get; } }

Page 70: functional principles for object-oriented development

Lazy Evaluation

Page 71: functional principles for object-oriented development

delay evaluation until the last responsible moment

Page 72: functional principles for object-oriented development

save work

separate “what to do” from “when to stop”

Page 73: functional principles for object-oriented development

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();}

JavaJava

Page 74: functional principles for object-oriented development

for (String s : FluentIterable.of(new RandomFileIterable(br)) .filter(STARTS_WITH_BUG_PREDICATE)

.transform(TRANSFORM_BUG_FUNCTION)

.limit(40)

.asImmutableList()) { report(s); }

JavaJava

Iterable: laziness is a virtueIterable: laziness is a virtue

Page 75: functional principles for object-oriented development

C#C#

IEnumerable<string> ReadLines(StreamReader r) { while (true) { WaitUntilFileHasMoreData(r); yield return r.ReadLine(); }}

Page 76: functional principles for object-oriented development

Data In, Data Out

Immutability

Verbs Are People Too

Declarative Style

Specific Typing

Lazy Evaluation

Page 77: functional principles for object-oriented development

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 78: functional principles for object-oriented development
Page 79: functional principles for object-oriented development
Page 80: functional principles for object-oriented development

Man, the living creature, the creating individual, is always more important than any established style or

system. – Bruce Lee

@jessitron@jessitron

Jessica Kerrblog.jessitron.com

github.com/jessitron/fp4ood


Recommended