Elementos de Programação Funcional

Como visto até agora, JavaScript é uma linguagem de programação que permite o desenvolvimento de sistemas orientados a objetos, ou seja, está baseada no paradigma de Programação Orientada a Objetos. Porém, também é possível utilizar alguns elementos do paradigma de Programação Funcional (PF).

PF, como um paradigma de programação, é um assunto tão amplo e tão diferente da Programação Orientada a Objetos que mereceria uma discplina de graduação só para ela. Há, claramente, uma tendência no mercado de desenvolvimento de software para adoção de inúmeras ideias provenientes da PF. E a motivação para isso é explorar melhor o hardware dos computadores atuais, especialmente no que diz respeito ao paralelismo (executar vários algoritmos ao mesmo temo uma vez que os compudadores possuem múltiplicas CPUs).

Na origem, o termo função é o mesmo existente na Matemática. Existem linguagens de programação, como Haskell, que seguem muito de perto esse sentido matemático. JavaScript, no entanto, possibilita que apenas algumas das idéias da PF sejam incorporadas aos programas.

De forma bem simplista, um programa baseado na PF é formado por variáveis (para armazenar os dados) e por funções. Funções recebem dados como parâmetros e produzem novos dados como resultado. Um programa é, portanto, um conjunto de funções por ondem os dados fluem.

Em JavaScript os dados são armazenados em dados simples (como números, strings, valores lógicos) ou, o que é mais prático, na forma de objetos. Estes objetos, no entanto, não possuem métodos, ou seja, não são capazes de executar algoritmos.

Dicas de PF

O texto que segue contém algumas dicas de programação que são inspiradas em PF.

Função Pura

Uma função é chamada de pura quando:

  • para os mesmos valores dos parâmetros produz o mesmo resultado. Em matemática, se f(5) é 25 então não faz sentido dizer que às vezes f(5) pode produzir um valor diferente de 25.
  • não produz efeito colateral (side-effect), ou seja, não altera o valor de nenhuma outra variável que esteja definida fora da função.

Composição de Funções

É o processo de combinar duas ou mais funções com o objetivo de criar uma nova função. Por exemplo, dadas duas funções f(x) e g(x) é possível criar uma terceira função h definida como h(x) = g(f(x)). Esse assunto tipicamente é visto no Ensino Médio (g o f).

Considere o exemplo a seguir.

function somaUm(x) {
  return x + 1;
}

function multiplicaPor3(x) {
  return x * 3;
}

A função somaUm retorna o valor do argumento somado de 1. Já a função multiplicaPor3 retorna o argumento multiplicado por 3. Por exemplo

// o valor de a será 11.
// o valor de b será 30.

let a = somaUm(10);
let b = multiplicaPo3(10);

Agora considere a seguinte função chamada gof que permite a criação de função composta. Como na matemática, G o F = G(F(x)).

function gof(g, f) {
  return function (x) { return g(f(x))};
}

Sobre a função gof observe que:

  1. Os dois parâmetros, g e f, são funções. Portanto, funções podem ser passadas como parâmetro.
  2. O resultado da função é uma função. Esta função possui um argumento, chamado x. Quando executada, ela retornará o resultado de g(f(x)).

Por exemplo,

let somaEMultiplica = gof(multiplicaPor3, somaUm);

let multiplicaESoma = gof(somaUm, multiplicaPor3);

A variável somaEMultiplica possui como valor, não um número, mas uma função. Na PF funções são dados, como são os números, as strings ou os valores lógicos true e false. A mesma ideia se aplica para a variável multiplicaESoma.

Portanto, se as variáveis acima representam funções então elas podem ser invocadas:

// o valor de a será 18 pois 5 + 1 dá 6 e então 6 * 3 dá 18
// o valor de b será 16 pois 5 * 3 dá 15 e então 15 + 1 dá 16.

let a = somaEMultiplica(5);
let b = multiplicaESoma(5);

Um dos benefícios da técnica de composição de funções é diminuir o tempo de execução: executar uma função demora menos do que executar duas. E sempre é possível compor várias funções.

Objetos Imutáveis

Objetos imutáveis são objetos que não podem ser modificados após terem sido criados.

Se um objeto é imutável então ele pode:

  • ser usado como argumento em uma função sem o risco desta deixar de ser pura.
  • ser usado em vários algoritmos (threads) executados em paralelo:

    • sem risco de causar inconsistências.
    • economizando memória (o mesmo objeto sendo usado em várias threads)

    Em JavaScript, por padrão, objetos são mutáveis (pois isso faz parte dos fundamentos da POO). Assim, programar com objetos imutáveis é uma questão de disciplina. Bibliotecas como Immutable, desenvolvida pelo Facebook, ajudam a manter esta disciplina.

Leitura Obrigatória
Explicando Programação Funcional em JavaScript
Immutable

results matching ""

    No results matching ""