Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Workshop JSFP - SEMCOMP 2021

Workshop JSFP - SEMCOMP 2021

Ana Luiza Portello

October 26, 2021
Tweet

More Decks by Ana Luiza Portello

Other Decks in Programming

Transcript

  1. Engenheira de software & cientista da computação
    Programming languages, crypto, web
    Gêmeos ascendente em escorpião
    Sometimes speaker, sometimes community
    manager, always shitposter
    Ana Luiza Portello Bastos

    View Slide

  2. ● Um pouco de história
    ● O que é o paradigma
    ● Jargões comuns

    View Slide

  3. View Slide

  4. QUIZ

    View Slide

  5. View Slide

  6. View Slide

  7. TURING MACHINE
    Em 1936 o Allan Turing
    formalizou um modelo
    abstrato de um computador
    chamado "Turing Machine"

    View Slide

  8. TURING MACHINE
    Memória estados e transição

    View Slide

  9. TURING MACHINE
    Em 1936 o Allan Turing
    formalizou um modelo
    abstrato de um computador
    chamado "Turing Machine"

    View Slide

  10. TURING MACHINE
    - Alfabeto, Semantica
    - Programming languagens são
    equivalentes a uma turing machine!

    View Slide

  11. CALCULO LAMBDA
    O sistema formal do calculo lambda foi
    definido nos anos 30 pelo Alonzo Church
    para explorar a computabilidade com
    definição de funções e recursão.

    View Slide

  12. LAMBDA CALCULUS
    λx . x + 1 (a)
    (head) (body) (outra expressao)
    expressão
    A solução de um problema é feita por meio de funções,
    usando uma implementação um conjunto de primitivas e
    regras pra construir esses primitivas

    View Slide

  13. A cabeça define uma função e seus parametros formais(x), e o corpo a
    expressão (x + 1).
    Função que recebe x a qual adiciona x a 1
    λx . x + 1 (a)
    (head) (body) (outra expressao)
    expressão

    View Slide

  14. CALCULO LAMBDA
    1932 - "A set of postulates for the foundation
    of logic"
    1936 - untyped lambda calculus
    1940 - typed lambda calculus
    1960 - Passam a aplicar o sistema lógico em
    linguagens de programação

    View Slide

  15. (+ 1 2)
    (defun mult2 (x) x * 2)

    View Slide

  16. TURING MACHINE
    1937 - Provou equivalencia ao
    calculo lambda em termos de
    computabilidade
    "Tese de church-turing"

    View Slide

  17. Mas até poucos anos atrás computadores não eram tão rapidos
    quanto hoje em dia e tinham bem pouco poder de
    processamento.
    Pra isso era importante utilizar linguagens que possibilitassem
    uma economia na memória e para isso linguagens imperativas
    que lidavam bem com a memória e faziam tarefas de forma
    procedural ficaram em alta.

    View Slide

  18. View Slide

  19. View Slide

  20. SMALLTALK
    Allan Kay pensou em uma
    forma de tornar código
    imperativo mais modular

    View Slide

  21. SMALLTALK
    - Mensagens
    - Objetos / Prototypes
    - Estado controlado
    - Metodos Privados

    View Slide

  22. “We were after the C++ programmers. We
    managed to drag a lot of them about
    halfway to Lisp.”
    Guy Steele, co-author of the Java language specification

    View Slide

  23. IMPERATIVA
    Sequencia de instruções que
    alteram o estado do programa a
    medida que são executadas

    View Slide

  24. IMPERATIVA
    int total number1 number2;
    number1 = 5;
    number2 = 10;
    total = number1 + number2

    View Slide

  25. IMPERATIVA

    View Slide

  26. OO
    Classe cupcake
    Instancias
    Props: Ser fofinho

    View Slide

  27. OO
    Massa do cupcake tem um estado(self ou this)
    Esse estado é MUTAVEL
    E os metodos vão constantemente mudar esse estado
    Existe uma ordem pra que tudo seja feito(É imperativo)

    View Slide

  28. DECLARATIVAS
    - Descreve o "o que" ao invés do "como"
    - Descreve do "input" os valores do "output" ao invés de pensar
    na manipulação de variaveis na memoria.

    View Slide

  29. DECLARATIVA
    Normalmente fazemos uma massa doce com proporcoes x de leite, farinha e açucar
    Fermento faz a massa crescer
    A massa cresce 30 por minutos ate ficar boa pra assar
    O forno é o lugar em que assamos bolo
    A forma ideal é diferente para se queremos bolo, cupcake ou pão
    Por assar entendemos colocar a massa sob uma temperatura de 200c ou por 40
    minutos no microondas.

    View Slide

  30. FUNÇOES
    - Código que pode ser executado mais de uma vez
    - Relação entre input e output

    View Slide

  31. FUNÇOES
    - Você se lembra de aprender sobre f(x) na escola?
    - O que é equação y = f(x)? f(x) = 2x^3 + 3

    View Slide

  32. FUNÇOES
    - Supondo que o valor de x é 2. Se você coloca em uma equação o
    valor fica 11.
    - 11 é o retorno da função f(2), que representaria o y na img

    View Slide

  33. FUNCIONAL

    View Slide

  34. OOP x FUNCIONAL
    - Criar codigo claro
    - Ser flexível ao crescimento do código
    - Ser bug-free

    View Slide

  35. OOP x FUNCIONAL
    - Dados e comportamento são separados
    - OOP muda estado enquanto fp faz os dados fluirem
    - Um é declarativo outro imperativo
    - Base teorica por trás

    View Slide

  36. OOP x FUNCIONAL
    Foco do programador Como executar tarefas (algoritmos) e
    como controlar alterações no estado.
    Informações que é desejada e que
    transformações são necessárias.
    Alterações de estado Importante. Inexistente.
    Ordem de execução Importante. Baixa importância.
    Controle de fluxo
    primária
    Loop, condições, e chamadas de função
    (método).
    Chamadas de função, incluindo a
    recursão.
    Unidade principal de
    manipulação
    Instâncias das classes ou estruturas. Funções como objetos de primeira
    classe e coleções de dados.
    https://docs.microsoft.com/pt-br/dotnet/standard/linq/functional-vs-imperative-programming

    View Slide

  37. FUNCIONAL

    View Slide

  38. FUNCIONAL

    View Slide

  39. FUNCIONAL

    View Slide

  40. View Slide

  41. JS
    Pode ter
    ● Partial application
    ● Pipeline
    ● Pattern Matching
    Tem
    ● HOF
    ● Funções anonimas
    ● Loops
    declarativos(map,
    filter, reduce,
    flatmap)

    View Slide

  42. View Slide

  43. λx x*2

    View Slide

  44. View Slide

  45. Produtivo
    Seguro

    View Slide

  46. JS pode ser mais produtivo mas certamente não é tão
    seguro quando falamos de mutabilidade de estado.

    View Slide

  47. ● Mil bibliotecas diferentes
    ● Atualizações melhorando a linguagem
    ● Padrões de codigo
    ● Já que as mutações não são seguras podemos
    procurar aplicar padrões que garantem um código
    mais bug free

    View Slide

  48. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  49. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  50. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  51. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  52. SEEEE… tentassemos garantir um pouco de
    predictabilidade da linguagem talvés podemos tornar o
    código mais seguro...

    View Slide

  53. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e
    Se funções fossem
    100% independente
    não teriamos
    patifarias escondidas.
    Isso é similar ao que a gente vê
    como funções matematicas, input
    e um output.
    Esse estilo chama-se

    View Slide

  54. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e
    - Mutações de qualquer varíavel ou objeto
    - Logs
    - I/O
    - Banco de dados
    - API
    - Fazer trigger de algum processo

    View Slide

  55. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  56. IDEPOTENCIA
    Em funções puramente matematicas não existe a
    possibilidade de chamar a mesma função com os
    mesmos valores duas vezes e dar diferentes
    resultados

    View Slide

  57. View Slide

  58. View Slide

  59. View Slide

  60. View Slide

  61. View Slide

  62. View Slide

  63. PUREZA
    ● São Idepotentes
    ● Não tem side-efffects

    View Slide

  64. PUREZA
    Quando as funções são puras, ou seja, independentes de
    estado ou do ambiente, não precisamos dar a mínima
    importância para quando ou onde elas serão computadas.

    View Slide

  65. View Slide

  66. View Slide

  67. View Slide

  68. View Slide

  69. View Slide

  70. View Slide

  71. View Slide

  72. View Slide

  73. View Slide

  74. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  75. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  76. Funções com uma única responsabilidade desacopladas!!!

    View Slide

  77. IMUTABILIDADE
    INT: 1
    REF 21909
    COUNT
    COUNT++

    View Slide

  78. IMUTABILIDADE
    INT: 2
    REF 21909

    View Slide

  79. INT: 1
    REF 21909
    COUNT
    INC
    INT: 2
    REF 21909

    View Slide

  80. View Slide

  81. CONTA
    CLIENTE
    TRANSACAO
    LIST
    PONTOS
    ENDERECO
    TRANSACAO
    TRANSACAO

    View Slide

  82. View Slide

  83. https://danlebrero.com/2019/03/06/java-with-a-clojure-mindset/

    View Slide

  84. - O dominio do que é estado e o que é logica
    - Pequenas modificações tocam um estado espalhado
    pela aplicação
    - Em caso de algo falhar, ou concorrencia estamos
    mais prunes a erros

    View Slide

  85. View Slide

  86. View Slide

  87. CONTA
    CLIENTE
    TRANSACA
    O
    LIST
    PONTOS
    ENDERECO
    TRANSACAO
    TRANSACAO
    TRANSACAO

    View Slide

  88. View Slide

  89. View Slide

  90. View Slide

  91. View Slide

  92. IMUTABILIDADE

    View Slide

  93. View Slide

  94. View Slide

  95. View Slide

  96. ● O estado aumenta a complexidade e torna dificil de "reason about"
    problemas locais.
    ● A solução é isolar o estado e aumentar o codigo puro
    ● Se você precisa de umestado local, encapsule-o em funções puras.
    ● Side Effects são necessarios, mas podem ficar isolados e abstraidos
    ● Testar funções puras é só questão de checar um valor de retorno!

    View Slide

  97. MOTIVACAO
    ● Mantenabilidade de código
    ● Menos bugs
    ● Testar se torna uma tarefa facil!
    ● Muito mais facil lidar com estado!
    ● Front end: estado imutavel, declaratividade
    ● Lidar com o caos que é o estado

    View Slide

  98. NA PRATICA
    As vezes você vai precisar sacrificar pureza por performance,
    limitações da linguagem ou por simplicidade.
    Nesse caso o ideal é tentar encapsular o estado ou tentar de alguma
    forma isolar o efeito colateral.

    View Slide

  99. https://medium.com/outsystems-engineering/programming-without-state-chaos-6b3dbbd58b7e

    View Slide

  100. NA PRATICA
    Se em programação funcional tudo são funções como lidamos
    com estas funções?
    A ideia é que cada uma delas tenha uma unica responsabilidade
    dentro de um contexto

    View Slide

  101. QUIZ RESULTS

    View Slide

  102. View Slide

  103. ● Em linguagens procedurais nossas computações
    envolvem nosso código separado em modulos
    operando em dados.
    ● Já em linguagens orientadas a objetos encapsulamos
    nosso código e dados para que eles interajam entre si
    por meio de mensagens.

    View Slide

  104. View Slide

  105. View Slide

  106. View Slide

  107. Independentes
    Puras
    Dados fluem nelas

    View Slide

  108. View Slide

  109. View Slide

  110. COMPOSICAO
    FUNCAO
    INPUT OUTPUT

    View Slide

  111. FUNCAO1
    INPUT OUTPUT FUNCAO2 OUTPUT

    View Slide

  112. COMPOSICAO
    COMP
    (FN1 + FN2)
    INPUT OUTPUT

    View Slide

  113. COMPOSICAO
    Aluno foi aprovado?
    ● Fazer a média dos trabalhos e provas
    ● Incrementa 1 se o aluno tem nota de participação
    ● Se for maior que 6 está provado

    View Slide

  114. COMPOSICAO
    Lista de notas => Aplicar a média => Checa se deve incrementar 1 => Passou?

    View Slide

  115. COMPOSICAO
    gte(6)(inc(mean(list)))

    View Slide

  116. COMPOSICAO
    isAprovado(list)
    IsAprovado = list => gte(6)(inc(mean(list)))

    View Slide

  117. FUNÇOES
    f(x) = x + 1
    g(x) = x * 2
    f . g

    View Slide

  118. PIPE
    Pipeline em ciência da computação é todo tipo de
    processamento de dados conectado em série em que a saída
    de um elemento é a entrada do proximo similar ao pipe do
    UNIX.

    View Slide

  119. PIPE
    list
    => mean
    => inc
    => gte(6)

    View Slide

  120. Resolver com PIPE!
    Aluno foi aprovado?
    ● Fazer a média dos trabalhos e provas
    ● Incrementa 1 se o aluno tem nota de participação
    ● Se for maior que 6 está provado

    View Slide

  121. PIPE

    View Slide

  122. PIPE

    View Slide

  123. PIPE

    View Slide

  124. condition ? expr1 : expr2

    View Slide

  125. View Slide

  126. View Slide

  127. View Slide

  128. View Slide

  129. View Slide

  130. HOF
    A ideia de que funções são entidades primarias. Elas
    são tratadas como valores e usados como dados!
    - Passadas como paramentros
    - Passadas como resposta de uma função

    View Slide

  131. HOF
    const doubleSum = (a, b) => (a + b) * 2;

    View Slide

  132. HOF
    Agora a função subtrai os valores e faz
    o double
    const doubleSum = (a, b) => (a - b) * 2;

    View Slide

  133. Essas funções são parecidas, a unica diferença é o
    operador.
    Se podemos tratar funções como valores e
    passa-los como argumentos, pq não passar a
    operação por argumento?

    View Slide

  134. HOF
    doubleOperator(+, 3, 1); // 8
    doubleOperator(-, 3, 1); // 8

    View Slide

  135. View Slide

  136. View Slide

  137. View Slide

  138. View Slide

  139. View Slide

  140. Como resolver com JS?
    Quero a soma dos valores + taxa de 10% que são
    maiores que 500

    View Slide

  141. View Slide

  142. View Slide

  143. View Slide

  144. DICA
    - Qual parte é recursiva?
    - Qual parte é a condição de saida

    View Slide

  145. to𝑡𝑎𝑙= (1+(3+(5+(7+9))))
    𝑡𝑜𝑡𝑎𝑙= (1+(3+(5+16)))
    𝑡𝑜𝑡𝑎𝑙= (1+(3+21))
    𝑡𝑜𝑡𝑎𝑙= (1+24)
    𝑡𝑜𝑡𝑎𝑙= 25

    View Slide

  146. Fazer uma função que calcula fatorial

    View Slide

  147. O que acontece se colocar um numero
    mto grande?

    View Slide

  148. - Ao invés de Loops, iterações declarativas.
    - Ao invés de design patterns,
    componentização
    - Novos fluxos de trabalho: pipelines, pattern
    matching, partial application, laziness,
    currying.

    View Slide

  149. View Slide

  150. View Slide

  151. CREDITS: This presentation template was created by
    Slidesgo, including icons by Flaticon and infographics &
    images by Freepik
    Perguntas?
    [email protected]
    anabastos.dev
    Contact
    @naluhh
    anabastos

    View Slide