SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
PadrõesdeProjetoemLinguagens
Funcionais
Italos Estilon e Layna Castro
Indíce
● O que é Programação Funcional?
● Porque Programação Funcional?
● Padrões de projeto em Programação Funcional
● Fábricas e Currying
● Template Method
● Adapter
● Memoization
● Correspondência de Padrões
● Fold
OqueéProgramaçãoFuncional?
Programação funcional é um paradigma de programação que trata
a computação como uma avaliação de funções matemáticas e que
evita estados ou dados mutáveis. Ela enfatiza a aplicação de
funções, em contraste da programação imperativa, que enfatiza
mudanças no estado do programa .
PorqueProgramaçãoFuncional?
● Facilita a escrita de programas concorrentes
● A maioria dos programas são apenas problemas de
gerenciamento de dados.
● Programação Funcional é mais modular.
● Mais velocidade.
● A Programação Funcional é o retorno à simplicidade.
OqueéPadrãodeProjeto?
“Uma solução nomeada e catalogada para um
problema comum”
Padrões de Projeto em Programação Funcional
● Alguns acreditam que a Programação Funcional torna os
padrões de projeto obsoletos.
● Essa visão confunde o conceito de padrão com alguns padrões
de exemplo que podem ser desnecessários em Programação
Funcional.
● A Programação Funcional também possui seu próprio conjunto
de padrões.
Padrões de Projeto em Programação Funcional
Segundo Neal Ford, os padrões de projeto na Programação
Funcional se manifestam de uma dessas três maneiras:
● O padrão é absorvido pela linguagem.
● A solução padrão ainda existe no paradigma funcional, mas os
detalhes de implementação diferem.
● A solução é implementada usando recursos que outras
linguagens ou paradigmas não tem.
FábricaseCurrying
● Currying transforma uma função multiargument de modo que
ele pode ser chamado como uma cadeia de funções de
argumentos simples.
● No contexto de padrões de projeto, currying atua como uma
fábrica de funções.
● Graças às funções de primeira classe é fácil criar funções que
retornam outras funções baseado em algum critério, o que é a
essência da fábrica.
ExemplodeFábrica
● A função “incrementador” foi declarada como uma avaliação
parcial da função “somador”. Note que poderia ter sido
utilizada uma função anônima.
somador::Num a => a -> a-> a
somador x y = x + y
incrementador::Integer->Integer
incrementador = somador 1
ExemplodeFábrica
● Outro exemplo de fábrica:
filtro::[a]->(a->Bool)->[a]
filtro [] _ = []
filtro (a:xs) f
| f a = a:(filtro xs f)
| otherwise = filtro xs f
dividePor::Integral a => a->a->Bool
dividePor x y
|y `mod` x == 0 = True
|otherwise = False
multiposDeCinco = filtro [0..] (dividePor 5)
ExemplodeFábrica
● A função “filtro” filtra uma lista de elementos com base em
uma função que recebe por parâmetro.
● A função que é passada é uma avaliação parcial da função
“dividePor”, que retorna “True” se o primeiro parâmetro divide
o segundo.
● A função que é passada para “filtro” é fabricada pelo Currying.
TemplateMethod
● Outro padrão simplificado por funções de primeira classe.
● A função “map” recebe uma função e uma lista de elementos e aplica a função a cada
elemento da lista criando uma nova lista.
● “map” precisa apenas que a função passada seja do tipo “(a - > b)”.
● A operação específica de mapeamento é personalizada pelos argumentos da função.
map::(a->b)->[a]->[b]
map _ [] = []
map f (x:xs) = (f x):(map f xs)
quadradosPerfeitos = map ( x -> x*x) [0..]
Adapter
● Converte uma interface em uma outra esperada pelos clientes.
● Em Scala, pode ser implementado com o conceito de classe implícita.
● Quando o tipo esperado é “Log”, mas uma instância de “Logger” é usada, o
compilador Scala irá automaticamente envolver essa instância na classe adaptador.
trait Log {
def warning(message: String)
def error(message: String)
}
final class Logger {
def log(level: Level, message: String) { /* ... */ }
}
implicit class LoggerToLogAdapter(logger: Logger) extends Log {
def warning(message: String) { logger.log(WARNING, message) }
def error(message: String) { logger.log(ERROR, message) }
}
val log: Log = new Logger()
Memoization
● Memoização é uma técnica para armazenar valores de uma
função em vez de refazer os cálculos cada vez que a função é
chamada.
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib(n-1)
CorrespondênciadePadrões
● Correspondência de padrões consiste na pesquisa por padrões
em determinados dados e, caso tenha sucesso, fazer algo com o
ele.
● Abordagem funcional para o padrão de projeto Visitor.
delete::(Eq a) => a -> [a] -> [a]
delete a [] = []
delete a [x] = if a == x then [] else [x]
delete a (x:xs) = [] ++ if (x == a) then xs else x:(delete a xs)
Fold
● Refere-se a uma família de funções de ordem superior que
analisam a estrutura de dados recursiva e recombinam através
do uso de uma determinada operação, combinando os
resultados de forma recursiva processando suas partes
constituintes, construindo-se um valor de retorno.
foldL::(a -> b -> a) -> a -> [b] -> a
foldL _ a [] = a
foldL f a (x:xs) = foldL f (f a x) xs
Referências
● WAMPLER, Dean. programação funcional para desenvolvedores Java. São Paulo, SP:
Novatec, 2012. 112 p. ISBN 9788575223161 (broch.).
● http://www.ibm.com/developerworks/library/j-ft10/
● http://http://en.wikipedia.org/wiki/Fold_(higher-order_function)
● http://haskell.tailorfontela.com.br/
● http://www.ibm.com/developerworks/java/library/j-ft11/index.html
● http://www.ibm.com/developerworks/java/library/j-ft12/index.html
● https://pavelfatin.com/design-patterns-in-scala/#adapter
● https://www.haskell.org/haskellwiki/Memoization

Más contenido relacionado

La actualidad más candente (12)

C++ Funções
 C++ Funções C++ Funções
C++ Funções
 
Linguagem C - Ponteiros
Linguagem C - PonteirosLinguagem C - Ponteiros
Linguagem C - Ponteiros
 
Cap1
Cap1Cap1
Cap1
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Funções
FunçõesFunções
Funções
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
Intro funcoes(2)
Intro funcoes(2)Intro funcoes(2)
Intro funcoes(2)
 
53392229 apostila-de-algoritmo-2009
53392229 apostila-de-algoritmo-200953392229 apostila-de-algoritmo-2009
53392229 apostila-de-algoritmo-2009
 
Lista funcões e recursividade
Lista funcões e recursividadeLista funcões e recursividade
Lista funcões e recursividade
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
 
Php Básico - Parte 1
Php Básico - Parte 1Php Básico - Parte 1
Php Básico - Parte 1
 

Similar a Padrões de projeto em linguagens funcionais

Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
Leonardo Lima
 
Programacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshareProgramacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshare
Marcio Junior Vieira
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
Carlos Santos
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08
Carlos Santos
 

Similar a Padrões de projeto em linguagens funcionais (20)

Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptxAula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
 
01-Paradigmas.pdf
01-Paradigmas.pdf01-Paradigmas.pdf
01-Paradigmas.pdf
 
Recursividade
RecursividadeRecursividade
Recursividade
 
aula intro de Python sobre Funcoes.pdf
aula intro de  Python sobre  Funcoes.pdfaula intro de  Python sobre  Funcoes.pdf
aula intro de Python sobre Funcoes.pdf
 
Aula 4 | Funções
Aula 4 | Funções Aula 4 | Funções
Aula 4 | Funções
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
 
Programacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshareProgramacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshare
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice Basic
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice Basic
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08
 
Aula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxAula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptx
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Subalgoritmos Profª Letíca Lopes
Subalgoritmos Profª Letíca LopesSubalgoritmos Profª Letíca Lopes
Subalgoritmos Profª Letíca Lopes
 
Algoritmos e Programação: Subalgoritmos, funções e passagem de parâmetros
Algoritmos e Programação: Subalgoritmos, funções e passagem de parâmetrosAlgoritmos e Programação: Subalgoritmos, funções e passagem de parâmetros
Algoritmos e Programação: Subalgoritmos, funções e passagem de parâmetros
 
Algoritmos e Programação: Subalgoritmos, funções e passagem de parâmetros
Algoritmos e Programação: Subalgoritmos, funções e passagem de parâmetrosAlgoritmos e Programação: Subalgoritmos, funções e passagem de parâmetros
Algoritmos e Programação: Subalgoritmos, funções e passagem de parâmetros
 
SubProgramas
SubProgramasSubProgramas
SubProgramas
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 

Padrões de projeto em linguagens funcionais

  • 2. Indíce ● O que é Programação Funcional? ● Porque Programação Funcional? ● Padrões de projeto em Programação Funcional ● Fábricas e Currying ● Template Method ● Adapter ● Memoization ● Correspondência de Padrões ● Fold
  • 3. OqueéProgramaçãoFuncional? Programação funcional é um paradigma de programação que trata a computação como uma avaliação de funções matemáticas e que evita estados ou dados mutáveis. Ela enfatiza a aplicação de funções, em contraste da programação imperativa, que enfatiza mudanças no estado do programa .
  • 4. PorqueProgramaçãoFuncional? ● Facilita a escrita de programas concorrentes ● A maioria dos programas são apenas problemas de gerenciamento de dados. ● Programação Funcional é mais modular. ● Mais velocidade. ● A Programação Funcional é o retorno à simplicidade.
  • 5. OqueéPadrãodeProjeto? “Uma solução nomeada e catalogada para um problema comum”
  • 6. Padrões de Projeto em Programação Funcional ● Alguns acreditam que a Programação Funcional torna os padrões de projeto obsoletos. ● Essa visão confunde o conceito de padrão com alguns padrões de exemplo que podem ser desnecessários em Programação Funcional. ● A Programação Funcional também possui seu próprio conjunto de padrões.
  • 7. Padrões de Projeto em Programação Funcional Segundo Neal Ford, os padrões de projeto na Programação Funcional se manifestam de uma dessas três maneiras: ● O padrão é absorvido pela linguagem. ● A solução padrão ainda existe no paradigma funcional, mas os detalhes de implementação diferem. ● A solução é implementada usando recursos que outras linguagens ou paradigmas não tem.
  • 8. FábricaseCurrying ● Currying transforma uma função multiargument de modo que ele pode ser chamado como uma cadeia de funções de argumentos simples. ● No contexto de padrões de projeto, currying atua como uma fábrica de funções. ● Graças às funções de primeira classe é fácil criar funções que retornam outras funções baseado em algum critério, o que é a essência da fábrica.
  • 9. ExemplodeFábrica ● A função “incrementador” foi declarada como uma avaliação parcial da função “somador”. Note que poderia ter sido utilizada uma função anônima. somador::Num a => a -> a-> a somador x y = x + y incrementador::Integer->Integer incrementador = somador 1
  • 10. ExemplodeFábrica ● Outro exemplo de fábrica: filtro::[a]->(a->Bool)->[a] filtro [] _ = [] filtro (a:xs) f | f a = a:(filtro xs f) | otherwise = filtro xs f dividePor::Integral a => a->a->Bool dividePor x y |y `mod` x == 0 = True |otherwise = False multiposDeCinco = filtro [0..] (dividePor 5)
  • 11. ExemplodeFábrica ● A função “filtro” filtra uma lista de elementos com base em uma função que recebe por parâmetro. ● A função que é passada é uma avaliação parcial da função “dividePor”, que retorna “True” se o primeiro parâmetro divide o segundo. ● A função que é passada para “filtro” é fabricada pelo Currying.
  • 12. TemplateMethod ● Outro padrão simplificado por funções de primeira classe. ● A função “map” recebe uma função e uma lista de elementos e aplica a função a cada elemento da lista criando uma nova lista. ● “map” precisa apenas que a função passada seja do tipo “(a - > b)”. ● A operação específica de mapeamento é personalizada pelos argumentos da função. map::(a->b)->[a]->[b] map _ [] = [] map f (x:xs) = (f x):(map f xs) quadradosPerfeitos = map ( x -> x*x) [0..]
  • 13. Adapter ● Converte uma interface em uma outra esperada pelos clientes. ● Em Scala, pode ser implementado com o conceito de classe implícita. ● Quando o tipo esperado é “Log”, mas uma instância de “Logger” é usada, o compilador Scala irá automaticamente envolver essa instância na classe adaptador. trait Log { def warning(message: String) def error(message: String) } final class Logger { def log(level: Level, message: String) { /* ... */ } } implicit class LoggerToLogAdapter(logger: Logger) extends Log { def warning(message: String) { logger.log(WARNING, message) } def error(message: String) { logger.log(ERROR, message) } } val log: Log = new Logger()
  • 14. Memoization ● Memoização é uma técnica para armazenar valores de uma função em vez de refazer os cálculos cada vez que a função é chamada. memoized_fib :: Int -> Integer memoized_fib = (map fib [0 ..] !!) where fib 0 = 0 fib 1 = 1 fib n = memoized_fib (n-2) + memoized_fib(n-1)
  • 15. CorrespondênciadePadrões ● Correspondência de padrões consiste na pesquisa por padrões em determinados dados e, caso tenha sucesso, fazer algo com o ele. ● Abordagem funcional para o padrão de projeto Visitor. delete::(Eq a) => a -> [a] -> [a] delete a [] = [] delete a [x] = if a == x then [] else [x] delete a (x:xs) = [] ++ if (x == a) then xs else x:(delete a xs)
  • 16. Fold ● Refere-se a uma família de funções de ordem superior que analisam a estrutura de dados recursiva e recombinam através do uso de uma determinada operação, combinando os resultados de forma recursiva processando suas partes constituintes, construindo-se um valor de retorno. foldL::(a -> b -> a) -> a -> [b] -> a foldL _ a [] = a foldL f a (x:xs) = foldL f (f a x) xs
  • 17. Referências ● WAMPLER, Dean. programação funcional para desenvolvedores Java. São Paulo, SP: Novatec, 2012. 112 p. ISBN 9788575223161 (broch.). ● http://www.ibm.com/developerworks/library/j-ft10/ ● http://http://en.wikipedia.org/wiki/Fold_(higher-order_function) ● http://haskell.tailorfontela.com.br/ ● http://www.ibm.com/developerworks/java/library/j-ft11/index.html ● http://www.ibm.com/developerworks/java/library/j-ft12/index.html ● https://pavelfatin.com/design-patterns-in-scala/#adapter ● https://www.haskell.org/haskellwiki/Memoization