refactoring to functional - sdd...

95
Refactoring to Functional Hadi Hariri

Upload: others

Post on 29-May-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Refactoring to FunctionalHadi Hariri

Page 2: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Functional Programming

In computer science, functional programming is a programming paradigm, a style of building the structure and elements of computer programs, that treats computation as the evaluation of mathematical functions and avoids state and mutable data. It is a declarative programming paradigm, which means programming is done with expressions.

Page 3: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Let’s refactor to functional

Page 4: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Wait. But why?

Page 5: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Goals

Write less code.

Write expressive code.

Write correct code.

Write performant code. (because Silicon Valley)

Page 6: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Be part of the “in-crowd”

Page 7: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Can I use any language?

Page 8: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What is a functional language?

Page 9: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

A language with…

Functions as First-Class Citizens

Higher-Order Functions

Lambdas

Top-level Functions*

Immutable Data

Page 10: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

…I’ll be using Kotlin. You can use Java 8, Java 7..5 +FJ, Scala, JavaScript, Clojure,

Haskell, F#, C#, OCaml, Lisp.

Page 11: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Basic Function Syntax

Page 12: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Higher-Order Functions and Lambdas

Page 13: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Pure Functions

Given same input, function always provides same output

Execution does not cause observable side-effects

Referential Transparency

Page 14: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Reduce moving parts

Page 15: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Aim for Pure Functions

Page 16: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Can we achieve our goals?

Page 17: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer
Page 18: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer
Page 19: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What’s functional about that?

Page 20: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

The Loops

Page 21: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Removing State

Page 22: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Some syntax sugar

Page 23: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Still emphasis on how, not what

Page 24: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Writing less code

Page 25: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Getting the data the way we need it

Page 26: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Transforming data

Page 27: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Again, let’s write less

Page 28: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

A more involved sample…

Page 29: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

The “manual” way

Page 30: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Once again, writing less code

Page 31: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer
Page 32: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Applying these techniques to common scenarios

Page 33: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Customer Search

Page 34: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Customer Search

Page 35: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Templates Patterns

Page 36: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Less boilerplate

Page 37: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Guaranteeing things take place

Page 38: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Guaranteeing things take place

Page 39: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Or when they take place

Page 40: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Strategy Pattern

Page 41: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Same strategy, less code

Page 42: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What about dependencies?

Page 43: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Let’s think about dependencies in classes…

Page 44: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

When dependencies grow

Page 45: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

How do we deal with dependencies?

Page 46: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

We pass in the behaviour

Page 47: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Thinking Functionally

Page 48: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Functions are our primitives

http://www.flickr.com/photos/mknowles/47457221/

Page 49: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

We’re merely combining functions

Page 50: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Functions taking functions

filter - takes a predicate

map - takes a mapping function

groupBy - takes a key lookup function

Page 51: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Functions returning functions

Page 52: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Pipelining

Page 53: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Keeping it readable

Abstract multiple pipeline calls into descriptive functions

Intermediate variables don’t always help

Page 54: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

How do we re-use?

Page 55: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Composing functions

Page 56: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Partial Function Applications

Page 57: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Partial Function Applications

Page 58: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Currying

Page 59: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Currying

Page 60: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

And then there’s the data…

Page 61: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

We’re taking data and processing it in stages

Page 62: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What is our data?

Customer

Point

InvoicesAge

Page 63: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

And what is this data?

Scalars: Age, Date of Birth, Amount

Collections of ATD’s: List of Customers, List of Invoices, Set of Pairs

Page 64: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Take as input lists and output lists

Page 65: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Common List Operations

map, flatMap, filter, findAll, merge, zip…..

Page 66: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

And scalars can be obtained from lists…

Page 67: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Common Scalar Operations

first, last, find, aggregate..…

Page 68: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Many functions boil down to folds

fold, reduce, aggregate…same thing.

Page 69: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What is fold?

][f(x,y) where

x accumulator

y element in list

Page 70: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What is fold?

][f( , ) =

Page 71: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What is fold?

][f( , ) =

Page 72: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

f( , ) =

What is fold?

][

Page 73: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

f( , ) =

What is fold?

][

Page 74: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

f( , ) =

What is fold?

][

Page 75: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

f( , ) =

What is fold?

][

Page 76: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Recursion, Pattern Matching and Folds

Page 77: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

The Recursive Maximum

Page 78: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

The Base is the accumulator

Page 79: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Immutability of the data

Page 80: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

We need to avoid state

Treat lists as infinite

Allows for lazy evaluation, reactive programming

Aim for immutability

Create. Don’t modify.

There’s a difference between ReadOnly and Immutable

Page 81: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What about Performance?

Page 82: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

That Annoying Fibonacci

Page 83: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

The Iterative Approach

Page 84: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Memoization

Page 85: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Recursion and Tail Calls

Page 86: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Converting to Tail Calls

Memoization

Tail Call Optimization

Page 87: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Tail Call Optimization

Page 88: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Inlining

Higher-order functions can have performance impact

Inlining functions can minimise performance impact

Page 89: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

What about all that scary stuff?

Page 90: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Functors

Collection of a whereby you can apply a function a -> b, returning collection of b

map is a an example of Functor

Page 91: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Monads

Abstract Data Type, following a series of rules

Maybe Monad -> Option

List Monad -> IEnumerable<T> (Iterable<T>)

Promises

Page 92: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

In Summary

Page 93: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Embrace Functions as Primitive Elements

Focus on writing less your own code

Focus on writing more descriptive code

Focus on writing deterministic code

Rocket Science

Page 94: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Recommended Books

The Little Schemer

Learn you a Haskell

Functional Programming in Java

Page 95: Refactoring to Functional - SDD Conferencesddconf.com/brands/sdd/library/Refactoring_To_Functional.pdf · Refactoring to Functional Hadi Hariri. Functional Programming In computer

Thank you