functional programming for old object oriented developers

76
Functional Programming for “Old” Object Oriented Developers Saturday, July 13, 13

Upload: alan-prando

Post on 26-May-2015

313 views

Category:

Technology


2 download

DESCRIPTION

TDC2013 - Trilha SCALA - Functional programming for Old Object Oriented Developers

TRANSCRIPT

Page 1: Functional programming for Old Object Oriented Developers

Functional Programming for

“Old” Object Oriented Developers

Saturday, July 13, 13

Page 2: Functional programming for Old Object Oriented Developers

Quem somos nósAlan Vidotti Prando

Mestrando em Engenharia da Computação - IPT/USP.

8 anos de experiência com JAVA, RUBY & SCALA.

SCJP, SCWCD e SCBCD. Jose Renato PequenoGraduado em Tecnologia em Informática - FASP (2005),

Pós graduação em Gerenciamento de Projetos - FGV.

MBA em arquitetura de soluções - FIAP .

Trabalhou como professor ministrando aulas na Universidade Metodista de São Paulo, para os cursos de Análise e Desenvolvimento de Sistemas, Engenharia da Computação com Ênfase em Software e Sistemas de Informação.

Saturday, July 13, 13

Page 3: Functional programming for Old Object Oriented Developers

Quem somos nós

Saturday, July 13, 13

Page 4: Functional programming for Old Object Oriented Developers

Roteiro

Saturday, July 13, 13

Page 5: Functional programming for Old Object Oriented Developers

RoteiroParadigma Programação Imperativa.Contexto Histórico: Lambda Calculus, LISP.Conceitos de Programação FuncionalPor que Programação Funcional?Técnicas e implementações funcionais (em Scala):

Elementos básicos: Lambda, Clousure & Bloco de códigos

Higher-Order FunctionsTail Recursion Currying Pattern Matching.

Misturando paradigmas funcionais e imperativos: Quais são as vantagens? O que o Oderksy propôs ao criar o Scala? É possível de trazer isso para o nosso dia a dia? Conclusão e dúvidas.

Saturday, July 13, 13

Page 6: Functional programming for Old Object Oriented Developers

IntroduçãoNão importa quão longa é a sua experiência como programador (junior, pleno ou senior), aprender programação funcional é um desafio. Esteja preparado para ser um “junior” novamente.

Livro: Functional Programming in Scala.

Nós gostaríamos que você fizesse uma “pausa” e esqueça o que você sabe sobre programação. Olhem para os exemplos com a menta aberta.

Curso: Functional Programming in Scala. Martin Odersky. COURSERA.

Saturday, July 13, 13

Page 7: Functional programming for Old Object Oriented Developers

Saturday, July 13, 13

Page 8: Functional programming for Old Object Oriented Developers

IntroduçãoFrom primitive assembly languages (which were at least a step up from raw machine code) there grew a plethora of high-level programming languages, beginning with FORTRAN in the 1950s. The development of these languages grew so rapidly that by the 1980s they were best characterized by grouping them into families that reflected a common computation model or programming style. Debates over which language or family of languages is best will undoubtedly persist for as long as computers need programmers. Fonte: Conception, Evolution, and Application of

Functional Programming Languages. PAUL HUDAK, Yale University. 1989.

Saturday, July 13, 13

Page 9: Functional programming for Old Object Oriented Developers

Imperative ProgrammingArquitetura de John Von Neuman

Norteou as linguagens de programação.

Saturday, July 13, 13

Page 10: Functional programming for Old Object Oriented Developers

Funções Contexto Histórico:

René Descartes - “Penso logo existo!”

Discurso do Método

f ( x ) = x + 1

Saturday, July 13, 13

Page 11: Functional programming for Old Object Oriented Developers

Contexto Histórico: Lambda Calculus

Na lógica matemática e na ciência da computação, cálculo lambda, também escrito como cálculo-λ é um sistema formal que estuda funções recursivas computáveis, no que se refere a teoria da computabilidade, e fenômenos relacionados, como variáveis ligadas e substituição. Sua principal característica são as entidades que podem ser utilizadas como argumentos e retornadas como valores de outras funções.

Alonzo Church - 1930

Saturday, July 13, 13

Page 12: Functional programming for Old Object Oriented Developers

Lambda Função Nomeada SomaQuadrados(x,y) = x*x + y * y

SomaQuadrados(5,2) = 5*5 + 2*2 = 29

Função Anônima (x,y) ↦ x*x + y*y

Qualquer função que recebe duas ou mais entradas, pode ser reelaborada em uma função que recebe uma única entrada e tem como saída uma outra função.

x ↦ ( y ↦ x*x + y*y)

Esta transformação é chamada de currying.

Saturday, July 13, 13

Page 13: Functional programming for Old Object Oriented Developers

Lambda Calculando com Curriyng

( x ↦ ( y ↦ x*x + y*y) ) (5) (2)

= ( y ↦ 5*5 + y*y) (2)

= 5*5 + 2*2 = 29

Saturday, July 13, 13

Page 14: Functional programming for Old Object Oriented Developers

Contexto Histórico: LISPLisp - List Processing

John McCarty - 1958

Motivação processamento de Listas

Lambda Calculus

Saturday, July 13, 13

Page 15: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 16: Functional programming for Old Object Oriented Developers

Functional ProgrammingEm uma função matematica, os coeficientes não mudam.

(a*x + b) + (c*x + d) = (a+c)*x + (b+d)

Saturday, July 13, 13

Page 17: Functional programming for Old Object Oriented Developers

Functional ProgrammingEm uma função matematica, os coeficientes não mudam.

(a*x + b) + (c*x + d) = (a+c)*x + (b+d)

Já na programação imperativa você pode fazer isso! E isso não é permitido pela lei da matematica!

class Polynomial {double[] doefficient; }Polynomial p = ….;p.coefficient[0] = 42;

Saturday, July 13, 13

Page 18: Functional programming for Old Object Oriented Developers

Functional ProgrammingEm uma função matematica, os coeficientes não mudam.

(a*x + b) + (c*x + d) = (a+c)*x + (b+d)

Já na programação imperativa você pode fazer isso! E isso não é permitido pela lei da matematica!

class Polynomial {double[] doefficient; }Polynomial p = ….;p.coefficient[0] = 42;

Se você quiser implementar conceitos matemáticos de alto nível seguindo as teorias matematicas, você não poderá utilizar mutações!

Saturday, July 13, 13

Page 19: Functional programming for Old Object Oriented Developers

Functional ProgrammingExistem duas abordagens da programação funcional: Restrita e Amplo.

Restrita: programar SEM: atribuições (variaveis imutaveis), loops, if-then-else.

Amplo: Foco na função. A linguagem permite construção de programas “elegantes” com foco em funções.

Funções podem ser:

declaradas em qualquer lugar.Passadas como parâmetro para outras funções, bem como retornar como resultado de uma função.Deve haver operadores padrões na linguagem para trabalhar com funções de maneira simples.

Saturday, July 13, 13

Page 20: Functional programming for Old Object Oriented Developers

Functional ProgrammingPrograms using only pure functions.Functions that have no side effects.Concept of Referential Transparency.

Saturday, July 13, 13

Page 21: Functional programming for Old Object Oriented Developers

Functional ProgrammingPrograms using only pure functions.Functions that have no side effects.Concept of Referential Transparency.

Evitar mutações. VARIAVEIS IMUTAVEIS! Ter uma maneira poderosa de abstrair e compor funções.

Saturday, July 13, 13

Page 22: Functional programming for Old Object Oriented Developers

Functional ProgrammingPrograms using only pure functions.Functions that have no side effects.Concept of Referential Transparency.

Programação Funcional: foco nas funções.Programação imperativa: foco no estado.

Evitar mutações. VARIAVEIS IMUTAVEIS! Ter uma maneira poderosa de abstrair e compor funções.

Saturday, July 13, 13

Page 23: Functional programming for Old Object Oriented Developers

Functional ProgrammingLinguagens restritas:

Pure Lisp, XSLT, Xpath, Xquery, FP

Haskell (sem I/O Mondas ou UnsafePerformIO)

Linguagens amplas:Lisp, Scheme, Racket, Clojure

SML, Ocaml, F#

Haskell (full language)

Scala

Smalltalk, Ruby(!), Javascript(!)

Saturday, July 13, 13

Page 24: Functional programming for Old Object Oriented Developers

Functional Programming1959 - LISP

1975-77 - ML, FP, Scheme

1978 - Smalltalk

1986 - Standard ML

1990 - Haskell, Erlang

1999 - XSLT

2000 - Ocaml

2003 - Scala, Xquery

2005 - F#

Saturday, July 13, 13

Page 25: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 26: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 27: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 28: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 29: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 30: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 31: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 32: Functional programming for Old Object Oriented Developers

Functional ProgrammingParallel Programming:

Execute programs faster on parallel hardware

Concurrent Programming:Manage concurrent execution threads explicity

Saturday, July 13, 13

Page 33: Functional programming for Old Object Oriented Developers

Functional ProgrammingParallel Programming:

Execute programs faster on parallel hardware

Concurrent Programming:Manage concurrent execution threads explicity

BOTH ARE TO HARD!!!

Saturday, July 13, 13

Page 34: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 35: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 36: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 37: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 38: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 39: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 40: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 41: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 42: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 43: Functional programming for Old Object Oriented Developers

Functional Programming

Saturday, July 13, 13

Page 44: Functional programming for Old Object Oriented Developers

High-Order FunctionsFunções que recebem funções como parâmetros

def funcQ(x : Int) = x * x

def exemploSoma(a: Int, b: Int, f: Int => Int): Int =if (a>b) 0 else f(a) + soma(a+1, b, f)

exemploSoma(1, 10, funcQ)

Saturday, July 13, 13

Page 45: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 46: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 47: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 48: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 49: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 50: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 51: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 52: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 53: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 54: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 55: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 56: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 57: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 58: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 59: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 60: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 61: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 62: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 63: Functional programming for Old Object Oriented Developers

Tail Recursion

Saturday, July 13, 13

Page 64: Functional programming for Old Object Oriented Developers

Tail Recursion Se você tem uma função recursiva que chama a sí mesma como ultima ação, você consegue reutilizar o stack frame da execução dessa função.Isso se chama TAIL RECURSION.Isso aumenta a eficiência da execução, sendo idêntica a eficiência de um loop.Na definição, Tail Recursion poderia acontecer mesmo se a chamada ocorresse para outra função, não sendo necessário a função ser chamada por ela mesma.

Saturday, July 13, 13

Page 65: Functional programming for Old Object Oriented Developers

Pattern Matching

So pattern matching helps you decompose and navigate data structures in a very convenient, compact syntax, it enables the compiler to check the logic of your code, at least a little bit.

The act of checking a perceived sequence of tokens for the presence of the constituents of some pattern.

Saturday, July 13, 13

Page 66: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Um anula o outro? Qual é a melhor?Por que Scala?

Saturday, July 13, 13

Page 67: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Têndencia ou realidade?First class functions have slowly been added to mainstream languages. In 1994, support for lambda, filter, map, and reduce was added to Python.

First class functions were also introduced in PHP 5.3, Visual Basic 9, C# 3.0, and C++11.

In Java, anonymous classes can sometimes be used to simulate closures; however, anonymous classes are not always proper replacements to closures because they have more limited capabilities.

Java 8 will support lambda expressions as a replacement for some anonymous classes.

Saturday, July 13, 13

Page 68: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Como propor o uso da linguagem funcional em sua empresa?

Saturday, July 13, 13

Page 69: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Como propor o uso da linguagem funcional em sua empresa?

Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”.

Saturday, July 13, 13

Page 70: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Como propor o uso da linguagem funcional em sua empresa?

Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”.

Jeito ERRADO: “Scala é uma linguagem nova e com conceitos legais! Híbrida, OO e funcional. O código fica bem menos verborrágico. Além de ser divertido passar e receber funções como parâmetro! Vamos utilizar!"

Saturday, July 13, 13

Page 71: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Saturday, July 13, 13

Page 72: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Como propor o uso da linguagem funcional em sua empresa?

Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”.

Jeito CERTO: “Vamos atender mais usuários sem precisar gastar com infraestrutura. Nosso ambiente (JVM), já esta pronto para isso. O sistema vai processar mais vendas e consequentemente lucraremos mais!”

Saturday, July 13, 13

Page 73: Functional programming for Old Object Oriented Developers

Imperative and Functional Programming

Saturday, July 13, 13

Page 74: Functional programming for Old Object Oriented Developers

Conclusão

“Sou desenvolvedor JAVA, adoro escrever getters e setters igual um maluco e amo JVM”. Utilize SCALA! “Java é uma porcaria! Odeio a JVM! Fica bem mais rápido e leve (e colorido) com Ruby”. Utilize ERLANG!

SE faz sentido. POR QUE NÃO?

Tire proveito do Hardware!

Faça mais simples!

lembre-se: Manutenabilidade faz parte da QUALIDADE do SOFTWARE. No final das contas o que importa é código lipo, modular e reutilizável. EVITE RETRABALHO!

Saturday, July 13, 13

Page 75: Functional programming for Old Object Oriented Developers

Books

Saturday, July 13, 13

Page 76: Functional programming for Old Object Oriented Developers

Perguntas e ContatoALAN VIDOTTI PRANDO

Linkedin: http://www.linkedin.com/in/avprando

Twitter: @alanprando

E-mail: [email protected]

JOSE RENATO PEQUENO

Linkedin: br.linkedin.com/pub/jose-renato-pequeno/28/524/244/

Twitter: @javalittle

E-mail: [email protected]

Saturday, July 13, 13