66
How functional programming made me a better OO developer @jessitron Jessica Kerr

How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

How functional programming made me a better OO developer

@jessitron Jessica Kerr

Page 2: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

developer’s creed

I am more than an Object-Oriented Developer.

I am a solver of problems, a creator of solutions.

Page 3: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What do we love about OO?

Page 4: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Functional programming will solve all our problems

Page 5: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Programming paradigms

• Imperative

• Procedural

• Object-Oriented

• Functional

• Aspect-oriented

• Logic

Page 6: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms
Page 7: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Goals for today

1) Look at functional principles

2) Learn how functional programmers solve problems

3) Solve more problems

Page 8: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability

Verbs Are People Too

Declarative Style

Null Is Your Enemy

Strong Typing

Lazy Evaluation

Page 9: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Principle

What is it?

We already do it

What’s the point?

Functional

Java

Page 10: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability

Page 11: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What is it?

The value of an identifier never changes.

Objects never change state.

Page 12: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

• java.lang.String

• Effective Java

Page 13: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What’s the point?

• The less state that can change, the less you have to think about.

• Concurrency!

Page 14: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability in functional languages

Pure: everything is immutable.

Hybrid: immutable by default

Page 15: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability in functional languages

fruit

tomato :: fruit

Page 16: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability in Java

final

Page 17: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability in Java

ImmutableMap.copyOf(mutableMap)

ImmutableList.of(item, item, item)

Page 18: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability in Java

Keep it simple.

Page 19: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Verbs are people too

Page 20: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What is it?

Functions are values. They can be passed around just like data.

Page 21: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

• Strategy pattern

• Command pattern

How

What

Page 22: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

onClick release ( )

Page 23: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What’s the point?

Passing around instructions is useful.

Page 24: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Verbs in functional languages

case class User(val firstName : String) val sortedList = userList.sortBy(u -> u.firstName)

def getFirstName (u : User) = u.firstName

Page 25: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Verbs in Java

Collections.sort(myUserList, new Comparator<User>() { public int compare(User o1, User o2) { return o1.firstName.compareTo(o2.firstName); } }; );

Iterables.transform(bugLines, reformatBugLine)

Page 26: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Verbs in Java

getFirstName = new Function<User, String>() { public String apply(User user) { return user.firstName; } }; Ordering<User> o = Ordering.natural().onResultOf(getFirstName); List<User> sortedList = o.sortedCopy(userList);

Iterables.transform(bugLines, reformatBugLine)

Page 27: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Verbs in Java 8

userList.sort(comparing(u -> u.firstName)); userList.sort( comparing(u -> u.firstName).reverseOrder() );

Iterables.transform(bugLines, reformatBugLine)

Page 28: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Declarative style

Page 29: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What is it?

Say what you’re doing, not how you’re doing it.

Page 30: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

• Refactoring: single-line method

Page 31: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

Select USER_NAME, count(*),

max(update_date)

From USER_ROLES

Where USER_ID = :userId

Group by USER_NAME

Page 32: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What’s the point?

Readable code

Smaller, simpler pieces

Page 33: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Declarative style in functional languages

• Many small functions • One-line collection processing

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

Page 34: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Declarative style in Java?

for (String line : list) { if (line.startsWith("BUG")) { report(line); } }

Page 35: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Declarative style in Java

reportAll(filterForBugs(list));

Page 36: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

List<String> bugLines = new LinkedList<String>(); for (String line : list) { if (line.startsWith("BUG")) { bugLines.add(line); } } return bugLines;

Declarative style in Java?

Page 37: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

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

Iterable<String> bugLines = filter(list, startsWithBug);

Declarative style in Java

Page 38: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Null Is Your Enemy

Page 39: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What is it?

A null reference is not a valid object reference. Let’s stop treating it like one.

Page 40: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

Thingiebob

doStuff()

NullThingiebob

doStuff() {}

SomeThingiebob

doStuff() {…}

Page 41: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What’s the point?

Page 42: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Defeating null in functional languages

Option<T>

None Some<T>

Page 43: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Defeating null in Java

if (banana.isPresent()) { String contents = banana.get(); }

Optional<String> banana = Optional.of("banana"); Optional<String> noBanana = Optional.absent();

Page 44: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Defeating null in Java

Optional.fromNullable(mightBeNull);

Page 45: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Strong typing

Page 46: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What is it?

When the wrong type of data is passed in, the compiler complains.

Page 47: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

Java is strongly typed, right?

Page 48: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

Page 49: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What’s the point?

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

Page 50: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What’s the point? %

of

err

ors

found

at

com

pile-t

ime

Typing Strong Weak

This data is

completely made up.

Page 51: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Strong typing in functional languages

type FirstName = String // Haskell type alias data User = User FirstName EmailAddress // Haskell data type

Page 52: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Strong typing in functional languages

List [+A] // from Scaladoc def indexOf [B >: A] (elem: B): Int def sameElements (that: GenIterable[A]): Boolean

Page 53: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Strong typing in Java

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 54: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

new User(firstName(“Joe”), emailAddress(“[email protected]”));

public static FirstName firstName(String value) { return new FirstName(value); }

Strong typing in Java

Page 55: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

public boolean validateUser(User user) { EmailAddress email = user.getEmailAddress(); // exercise business logic return true; }

Strong typing in Java

Page 56: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

public boolean validate(HasEmailAddress anything) { EmailAddress email = anything.getEmailAddress(); // exercise business logic return true; } interface HasEmailAddress {

EmailAddress getEmailAddress(); }

Strong typing in Java

Page 57: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Lazy evaluation

Page 58: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What is it?

Delaying evaluation of an expression until the last responsible moment.

Page 59: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

We already do it

Providers, Factories

SQL Cursors

Page 60: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

What’s the point?

You may never even need it.

Separate “what to do” from “when to stop.”

Page 61: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Lazy evaluation in functional languages

• Haskell is lazy by default

• F# provides a Lazy<_> type

• Infinite sequences

Page 62: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Lazy evaluation in Java

Callable

Iterable

Page 63: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

int bugCount = 0; String nextLine = file.readLine(); while (bugCount < 40) { if (nextLine.startsWith("BUG")) { String[] words = nextLine.split(" "); report("Saw the bug at "+words[0]+" on "+ words[1]); bugCount++; } waitUntilFileHasMoreData(file); nextLine = file.readLine(); }

Imperative Java

Page 64: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

for (String s : take(new RandomFileIterable(br)) .filterBy(STARTS_WITH_BUG_PREDICATE) .transformWith(TRANSFORM_BUG_FUNCTION) .limit(40) .asImmutableList()) { report(s); }

Functional style

Page 65: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Immutability

Verbs Are People Too

Declarative Style

Null Is Your Enemy

Strong Typing

Lazy Evaluation

Page 66: How functional programming made me a better OO …java.ociweb.com/javasig/knowledgebase/2012-03/HowFPmade...Functional programming will solve all our problems Programming paradigms

Thank you

Jessica Kerr @jessitron

Jessitron.blogspot.com

[email protected]

http://speakerdeck.com/u/jessitron/

Look for me at KCDC

April 27-28 2012: kcdc.info