paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de...

135
Marcel Gonçalves dos Santos @marcelgsantos paradigmas de programação uma visão geral sobre orientação a objetos e programação funcional

Transcript of paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de...

Page 1: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Marcel Gonçalves dos Santos

@marcelgsantos

paradigmas de programaçãouma visão geral sobre orientação a objetos

e programação funcional

Page 2: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

pensandonaweb.com.br

desenvolvedor web full-stack

Marcel Gonçalves dos Santos

@marcelgsantos

Page 3: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as
Page 4: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

@femugspsp.femug.com

Page 5: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

@phpspphpsp.org.br

Page 6: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Interaja nas mídias sociais!

- fale sobre o evento, palestrantes e conteúdo - tire fotos do evento e publique- interaja com outros participantes do evento - tire dúvidas ou dê feedbacks para os palestrantes

Page 7: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

1. seguir @marcelgsantos no Twitter2. tuitar utilizando as hashtags #TheDevConf, #TrilhaJavaScript e #JavaScript3. não vale tuíte em branco e retuíte4. ler e preencher este simples formulário bit.ly/sorteio-tdc-3

Concorra a um livro da Casa do Código! 🤩

Page 8: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

O que é paradigma de programação?

Page 9: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

são modelos ou estilos de programação suportados por linguagens que agrupam certas características comuns

Page 10: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

os paradigmas de programação definem como os códigos são estruturados…

Page 11: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

principais paradigmas de programaçãoos dois principais paradigmas são o imperativo e o declarativo

Page 12: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

paradigma imperativodescreve a resolução de um problema através de comandos que o computador pode compreender e executar

Page 13: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

paradigma imperativoos paradigmas procedural e orientado a objetos são exemplos de paradigmas imperativos

Page 14: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

let result = 0;

!// Imperative code to sum 1 to 10 for (let i = 0; i !<= 10; i!++) { result += i; }

console.log(result); !// 55

Page 15: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

paradigma declarativopermite especificar o que deve ser computado e não como deve ser computado

Page 16: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

paradigma declarativoos paradigmas funcional e lógico são exemplos de paradigmas declarativos

Page 17: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

!// Declarative code to sum 1 to 10 const sum = (a, b) !=> a + b; const result = numbers.reduce(sum);

console.log(result);

Page 18: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

paradigmas de linguagens de programação

imperativoprocedural - C e Pascal orientado a objetos - C++, Java, PHP, Python e Rubydeclarativológico - Prolog funcional - Clojure, Elixir, Elm, Erlang, F#, Haskell, Lisp, OCaml e Scala

Page 19: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Programação Orientada a Objetos

Page 20: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

trata da comunicação entre objetos através da troca de mensagens

Page 21: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

um objeto é uma representação concreta de uma abstração…

Page 22: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

…que possui características, comportamentos e estado atual

Page 23: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a orientação a objetos pode ser baseada em classes ou baseada em protótipos

Page 24: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

em programação orientada a objetos baseada em classes as classes são definidas de antemão e objetos são instanciados baseados em classes

Page 25: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// class to create a Person object class Person { constructor(name, age) { this.name = name; this.age = age; }

!// sayName method sayName() { console.log('Hi, my name is ' + this.name + '!'); } }

!// create an instance of Person let person = new Person('John', 32); person.sayName(); !// Hi, my name is John!

Page 26: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

em programação orientada a objetos baseada em protótipos os objetos são as entidades primárias e não existe nenhuma classe

Page 27: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// constructor function to create a Person object function Person(name, age) { this.name = name; this.age = age; }

!// sayName method is added to the prototype of Person Person.prototype.sayName = function() { console.log('Hi, my name is ' + this.name + '!'); };

!// create an instance of Person let person = new Person('John', 32); person.sayName(); !// Hi, my name is John!

Page 28: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

em JavaScript, as classes são açúcar sintático para funções construtoras

Page 29: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// constructor functions to create a Person object class Person { constructor(name, age) { this.name = name; this.age = age; }

sayName() { console.log('Hi, my name is ' + this.name + '!'); } }

!// add sayAge method to the Person prototype Person.prototype.sayAge = function() { console.log('I\'m ' + this.age + ' years old!'); };

!// create an instance of Person let person = new Person('John', 32); person.sayName(); !// Hi, my name is John! person.sayAge(); !// I'm 32 years old!

Page 30: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o protótipo de um objeto é apenas outro objeto que o objeto é ligado

Page 31: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

todo objeto possui uma ligação com o protótipo (e apenas uma)

Page 32: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

novos objetos são criados baseados em objetos já existentes escolhidos como seu protótipo

Page 33: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Pilares da Orientação a Objetos

Page 34: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

abstraçãotrata da representação de um objeto da vida real dentro do sistema

Page 35: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// class to create a Person object class Person { constructor(name, age) { this.name = name; this.age = age; }

!// sayName method sayName() { console.log('Hi, my name is ' + this.name + '!'); } }

!// create an instance of Person let person = new Person('John', 32); person.sayName(); !// Hi, my name is John!

Page 36: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

herançapermite o reaproveitamento de código em que uma classe herda características e atributos de uma classe base

Page 37: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

encapsulamento permite ocultar a implementação interna de um objeto

Page 38: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// hiding data through convention class Person { constructor(name, age) { this._name = name; this._age = age; }

sayName() { console.log('Hi, my name is ' + this._name + '!'); } }

!// create an instance of Person let person = new Person('John', 'Doe', 32);

!// accessing hiding data console.log(person._name); !// John

Page 39: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// hiding data using private fields class Person { #name; #age; constructor(name, age) { this.#name = name; this.#age = age; }

sayName() { console.log('Hi, my name is ' + this.#name + '!'); } }

let person = new Person('John', 'Doe', 32);

!// accessing through accessor method and property console.log(person.sayName()); !// Hi, my name is John! console.log(person.name); !// undefined console.log(person.#name); !// Uncaught SyntaxError: Undefined private field #name: must be declared in an enclosing class

Page 40: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

polimorfismoconsiste na alteração do funcionamento interno de um método herdado do pai

Page 41: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Princípios da Orientação a Objetos

Page 42: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

os princípios de design ajudam a projetar códigos melhores

Page 43: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

coesãoindica o grau de relação entre os membros de um módulo

Page 44: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// not cohesive class class Cart { constructor() { this._items = []; }

numberOfItems() { return this._length; }

calculateDeliveryPrice() { !// code used to calculate the delivery price } }

Page 45: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

acoplamentoindica o grau de dependência entre módulos

Page 46: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o acoplamento ocorre quando o código de um módulo utiliza código de outro módulo, seja ao chamar uma função ou acessar algum dado

Page 47: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

class Engine { start() { console.log('Starting the engine'); } }class Car { constructor() { this.engine = new Engine; }

start() { this.engine.start(); } }

!// create an instance of Car let toyota = new Car(); toyota.start(); !// Starting the engine

Page 48: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

ao controlar o acoplamento, o software torna-se mais flexível e fácil de manter

Page 49: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

pode-se reduzir o acoplamento através da injeção de dependências

Page 50: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

class Engine { start() { console.log('Starting the engine'); } }

class Car { constructor(engine) { this.engine = engine; }

start() { this.engine.start(); } }

!// injecting an engine dependency into the car let engine = new Engine(); let toyota = new Car(engine); toyota.start(); !// Starting the engine

Page 51: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

utilizar injeção de dependências auxilia nos testes unitários pois tornam os módulos fracamente acoplados, altamente coesos e facilita o mocking de objetos

Page 52: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

“prefira classes com alta coesão e baixo acoplamento”

Page 53: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Programação Funcional λ

Page 54: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

paradigma de programação que utiliza funções puras e foca na transformação do estado

Page 55: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

baseado no cálculo lambda proposto por Alonzo Church na década de 30

Page 56: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

na programação funcional as funções são tratadas como conceito principal

Page 57: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Uma função matemática trata-se de um simples mapeamento entre o domínio e o contra-domínio.

1

2

3

D

B

A

C

X Y

Page 58: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Estado λ

Page 59: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o estado de um programa é representado pelos valores dos dados armazenados na memória…

Page 60: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

…em qualquer ponto de execução do programa

Page 61: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o estado de uma aplicação é alterado a cada interação feita pelo usuário ou pelo próprio sistema…

Page 62: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

…e pode ser representado por uma estrutura de dados

Page 63: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a maioria dos bugs são relacionados ao controle de estado

Page 64: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Funções Puras λ

Page 65: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

funções puras

1. ter parâmetros de entrada 2. não depender do estado externo 3. retorno baseado nos valores de entrada 4. não devem causar efeitos colaterais

Page 66: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// pure or impure function?

let counter = 0;

function increment() { counter!++; return counter; }

console.log(increment()); !// 1

Page 67: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// pure function (ES5 syntax)

function add(x, y) { return x + y; }

console.log(add(2, 3)); !// 5

Page 68: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// pure function (ES6 syntax)

const add = (x, y) !=> x + y;

console.log(add(2, 3)); !// 5

Page 69: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

por que utilizar funções puras?são reutilizáveis, componíveis, fáceis de testar, fáceis de cachear e paralelizáveis

Page 70: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

transparência referencialpropriedade que garante que a saída de uma função pura sempre será a mesma dado um mesmo conjunto de argumentos

Page 71: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// referential transparency

const add = (x, y) !=> x + y;

console.log(add(2, 3) !!=== 5); !// true console.log(5 !!=== 5); !// true

Page 72: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

pode não ser fácil criar funções puras

Page 73: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

porém, a restritividade ajuda a melhorar o foco

Page 74: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Mais sobre Funções λ

Page 75: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

funções de alta ordem e funções de primeira classe são funções que podem ser atribuídas a variáveis, passadas como argumentos e retornadas de uma função

Page 76: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// high-order function

const add = (x, y) !=> x + y; const numbers = [1, 2, 3, 4, 5];

const sum = numbers.reduce(add); const sum10 = numbers.reduce(add, 10);

console.log(sum); !// 15 console.log(sum10); !// 25

Page 77: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

funções anônimasfunções que não possuem nome e que, geralmente, são passadas como argumento ou atribuídas

Page 78: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// anonymous function

const numbers = [1, 2, 3, 4, 5];

const sum = numbers.reduce((x, y) !=> x + y);

console.log(sum); !// 15

Page 79: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

closuresfunções que possuem acesso à valores do escopo externo

Page 80: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// closure function

function greet(greeting) { return function (name) { return `${greeting} ${name}!`; }; }

const greet2 = greeting !=> name !=> `${greeting} ${name}!`;

console.log(greet('Hello')('Mary')); !// Hello Mary! console.log(greet2('Hello')('John')); !// Hello John!

Page 81: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

recursãoé quando uma função é definida em termos de si própria, ou seja, quando a função chama ela mesma

Page 82: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

diferença entre função e procedimento (procedure)uma função recebe um valor e retorna um resultado; um procedimento é um conjunto de comandos executados numa ordem

Page 83: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

“Don't think of functions as a collection of instructions. Think of them as non-destructive operations on input `double = n => n * 2;`”Eric Elliott, 2016.

https://twitter.com/_ericelliott/status/685172918784004097

Page 84: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

memoizetécnica que permite que funções custosas sejam cacheadas para execuções posteriores mais rápidas

Page 85: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Imutabilidade λ

Page 86: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a imutabilidade diz que um dado não pode ser alterado após a sua criação

Page 87: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a imutabilidade permite maior confiança e evita que erros ocorram

Page 88: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o JavaScript não possui suporte a dados imutáveis de forma nativa

Page 89: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

porém, pode-se trabalhar com dados imutáveis em JavaScript utilizando algumas técnicas

Page 90: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Currying e aplicação parcialλ

Page 91: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o currying é a técnica que permite transformar uma função que recebe múltiplos argumentos…

Page 92: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

…em uma função que recebe apenas um argumento e que retorna uma função que aceita os argumentos restantes

Page 93: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a aplicação parcial é quando se executa uma função e passa apenas parte de seus argumentos

Page 94: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a aplicação parcial permite fazer a especialização de uma função mais genérica

Page 95: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// specialization from a curried function !// using partial application

const greet = R.curry((greeting, name) !=> `${greeting} ${name}`); const greetMorning = greet('Good Morning');

console.log(greetMorning('Alice')); !// Good Morning Alice

Page 96: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

currying e aplicação parcial são recursos muito utilizados em programação funcional

Page 97: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

na programação funcional deve-se levar em consideração a ordem dos parâmetros

Page 98: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

os parâmetros mais genéricos devem vir mais para o início e os parâmetros mais específicos devem vir mais para o final

Page 99: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o JavaScript não possui suporte nativo para currying como nas linguagens puramente funcionais Elm ou Haskell

Page 100: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Composição de Funções λ

Page 101: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a composição é o processo de combinar uma ou mais funções para criar uma nova função

Page 102: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// creating a new function from others by composition

const sentence = 'estava à toa na vida o meu amor me chamou pra ver a banda passar cantando coisas de amor '; const wordCount = R.length(R.split(' ', sentence));

console.log(wordCount); !// 19

Page 103: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

é uma solução elegante e legível e ajuda a evitar a utilização do aninhamento de funções

Page 104: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

o Ramda possui uma função que permite criar uma nova função a partir da composição de funções

Page 105: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// create a function using composition

const sentence = 'estava à toa na vida o meu amor me chamou pra ver a banda passar cantando coisas de amor '; const countWords = R.compose(R.length, R.split);

console.log(countWords(' ', sentence)); !// 19

Page 106: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

BibliotecaRamda λ

Page 107: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

uma biblioteca construída para o estilo de programação funcional que facilita a utilização de pipelines e dados imutáveis

Page 108: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

possui foco no estilo puramente funcional

Page 109: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

todas as funções do Ramda são auto-curried

Page 110: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

os argumentos das funções do Ramda são organizados de forma a facilitar a utilização de currying

Page 111: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Caso de Uso 1 somar os preços dos produtos de um carrinho de compras

Page 112: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// shopping cart const cart = [ {id: 1, product: 'iPhone', price: 499}, {id: 2, product: 'Kindle', price: 179}, {id: 3, product: 'Macbook Pro', price: 1199}, ];

!// get prices from shopping cart and sum them!// using intermediate values const cartPrices = R.map(item !=> item.price, cart); const cartSum = R.sum(cartPrices);

console.log(cartSum); !// 1877 realiza o mapeamento da lista de produtos (objetos) para uma lista de preços (números)

faz a somatória da lista de números e retorna o total

Passo 1

Page 113: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// shopping cart const cart = [ {id: 1, product: 'iPhone', price: 499}, {id: 2, product: 'Kindle', price: 179}, {id: 3, product: 'Macbook Pro', price: 1199}, ];

!// get prices from shopping cart and sum them!// using function composition const totalCart = R.compose( R.sum, R.map(item !=> item.price), );

console.log(totalCart(cart)); !// 1877

cria uma nova função a partir da composição de funções e elimina valores intermediários

aplicação parcial da função map

a composição é feita da direita para a esquerda

Passo 2

Page 114: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// shopping cart const cart = [ {id: 1, product: 'iPhone', price: 499}, {id: 2, product: 'Kindle', price: 179}, {id: 3, product: 'Macbook Pro', price: 1199}, ];

!// get prices from shopping cart and sum them !// using function composition with pipe const totalCart = R.pipe( R.map(item !=> item.price), R.sum, );

console.log(totalCart(cart)); !// 1877

o pipe de funções é feito da esquerda para a direita e facilita a leitura do código

Passo 3

Page 115: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Caso de Uso 2 limpar dados vindo de um formulário e realizar um cálculo

Page 116: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// cleaning data from an input const price = '100';

const discount = (perc, value) !=> perc * value;

let priceInt = parseInt(price); let priceDiscount = discount(0.2, priceInt);

console.log(priceDiscount); !// 20

Passo 1

Page 117: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// cleaning data from an input const price = '100';

const discount = (perc, value) !=> perc * value;

!// using partial application const discount20 = R.partial(discount, [0.2]);

let priceInt = parseInt(price); let priceDiscount = discount20(priceInt);

console.log(priceDiscount); !// 20

cria uma nova função a partir da aplicação parcial de uma existente

Passo 2

Page 118: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// cleaning data from an input const price = '100';

const discount = (perc, value) !=> perc * value;

!// using function composition const priceDiscount = R.pipe( parseInt, R.partial(discount, [0.2]), );

console.log(priceDiscount(price)); !// 20

cria uma nova função a partir da composição de funções utilizando a função pipe e elimina valores intermediários

Passo 3

Page 119: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// cleaning data from an input const price = 'lambda!';

const discount = (perc, value) !=> perc * value;

!// using function composition const priceDiscount = R.pipe( parseInt, R.partial(discount, [0.2]), );

console.log(priceDiscount(price)); !// nullerro ao receber um valor não numérico

Passo 4

Page 120: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

!// cleaning data from an input const price = 'lambda!';

const discount = (perc, value) !=> perc * value;

!// using function composition const priceDiscount = R.pipe( parseInt, R.defaultTo(0), R.partial(discount, [0.2]), );

console.log(priceDiscount(price)); !// 0

retorna o valor padrão para o caso de um valor não truthy

Passo 5

Page 121: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

existem inúmeros conceitos relacionados a programação funcional como functors, monads, lazy evaluation, tail call optimization…

Page 122: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Conclusão

Page 123: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

os princípios de design ajudam a projetar códigos melhores

Page 124: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

um código mau projetado é um código difícil de mudar

Page 125: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

prefira módulos com alta coesão e baixo acoplamento

Page 126: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

a programação funcional não é sobre não ter estado…

Page 127: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

…e sim sobre eliminar estado e efeito colateral sempre que possível e controlar efeitos colaterais quando necessário

Page 128: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

foque na transformação do estado e evite efeitos colaterais

Page 129: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

conhecer bem os paradigmas de programação te permite escolher a melhor ferramenta para cada problema

Page 130: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

vá em frente e divirta-se!

Page 131: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Referências

Page 132: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

bit.ly/referencias-palestra-paradigmas

Page 133: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

Avalie!

Page 134: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

bit.ly/avalie-palestra-paradigmas

Page 135: paradigmas de programação - Amazon S3 · programação funcional que facilita a utilização de pipelines e dados imutáveis. possui foco no estilo puramente funcional. todas as

@marcelgsantosspeakerdeck.com/marcelgsantos

Obrigado.Perguntas?