Programação funcional: O que é e seus principais conceitos

Programação funcional: O que é e seus principais conceitos


Se você quer ingressar na área de tecnologia ou já trabalha no ramo, com certeza já ouviu falar sobre programação funcional (Functional Programming). Este conteúdo foi preparado para você que está iniciando sua jornada na programação e também para quem quer saber mais sobre essa “revolução” do mundo do software.Toda essa revolução se deve a esse paradigma da programação. Programação funcional é um paradigma de programação. Mas, ao decorrer do texto você irá entender melhor sobre isso.

O que é programação funcional?

Imagine que existe um paradigma de programação orientada a objetos e a programação funcional. Ambos são a mesma coisa, mas em relação a orientação a objetos, enquanto paradigma, ela vai determinar algumas estruturas e elementos que você irá utilizar no seu código. É o caso de métodos e objetos. Já a funcional, vai ditar outras coisas, como utilizar funções para criar o seu código. 

A programação funcional te permite criar códigos confiáveis e fáceis de testar, até mesmo a indústria da aeronáutica está utilizando linguagens de programação funcional, com o intuito de criar controladores de voo mais seguros. 

Algo importante para você entender sobre a programação funcional, é que ela tem o conceito de função pura e função impura. As funções puras precisam atender a dois pré-requisitos que são:

1. Ela precisa retornar sempre a mesma coisa, se você passar o mesmo parâmetro para ela.

2. Ela não pode ter efeito “colateral”.

Side effects (efeitos colaterais) ocorrem quando uma função ao ser executada causa mudanças no estado da aplicação, o que são chamadas de funções impuras.

Programação imperativa

A programação imperativa é um paradigma de programação que descreve a computação como ações ou comandos que mudam o estado (variáveis) de um programa. A base da programação imperativa pode ser definida por esses conceitos:

A descrição de estados de uma máquina abstrata por valores de um conjunto de variáveis

  • Reconhecedores desses estados – expressões compostas por relações entre esses valores ou os resultados de operações utilizando valores
  • Comandos de atribuição e controle

As funções de linguagens de programação imperativas são descritas como algoritmos que especificam como processar um intervalo de valores, a partir de um valor de domínio, com uma série de passos prescritos. A repetição, ou laço, é usada extensivamente para processar os valores desejados.

Programação Orientada a Objetos 

Programação Orientada a Objetos (POO) é um modelo de análise, projeto e programação de software baseado na composição e interação entre diversas unidades chamadas de “objetos”. É fundamental que todos os programadores saibam quais são os pilares da POO:

O encapsulamento é um dos pilares da POO e por meio dele é possível simplificar bastante a programação, protegendo informações sensíveis. Além disso, esse conceito deixa mais legível e reutilizável o código. É uma técnica de programação que mantém escondido os detalhes internos do funcionamento dos métodos de uma classe.

Herança

A ideia da herança em programação de objetos é simplificar a programação, possibilitando que as classes compartilhem seus atributos, métodos e demais membros da classe entre si. 

Com ela, podemos criar classes mais complexas sem precisar repetir um código. Aqui, a palavra-chave é Reuso de código e é uma das metas a se atingir ao desenvolver software. O reuso permite reduzir o esforço despendido no desenvolvimento de software ao reaproveitarmos códigos de uma classe na criação de outras classes. A Herança é, portanto, um conceito extremamente importante em Orientação a Objetos.

Polimorfismo

Em programação orientada a objetos, polimorfismo é o princípio pelo qual duas ou mais classes derivadas da mesma superclasse podem invocar métodos que têm a mesma assinatura, mas comportamentos distintos. Polimorfismo significa “múltiplas formas”. Ele ocorre quando um objeto possui um comportamento diferente para uma mesma ação. Por exemplo, nas classes Gato e Humano existe um comportamento (método) em comum que é o andar. Mas, cada uma dessas classes implementa o método de andar de uma forma diferente. Ambos podem percorrer a mesma distância andando,porém o farão de forma diferente entre si. 

Abstração

A programação orientada a objetos é voltada para a resolução de problemas reais, ou seja, que acontecem em nosso dia a dia.

Por isso, abstrair essas informações e transformá-las em códigos é uma das características mais importantes da orientação a objetos. De acordo com o livro Orientação a Objetos de Thiago Leite, ele explica que a abstração é a capacidade de não se preocupar com todas as características de um elemento, sendo possível então trabalhar apenas com o essencial.

Quais as vantagens da programação funcional?

O código em programação funcional tende a ser mais objetivo do que os outros tipos de paradigmas. Abaixo vou listar mais algumas vantagens:

  1. Possui grande flexibilidade;
  2. Facilidade nos testes e na busca por bugs;
  3. Visualização dos programas como funções uniformes;
  4. Tratamento das funções como dados;
  5. Notação concisa;
  6. Uso de gerenciamento de memória automático;
  7. Semântica simples.

Este tipo de programação gera um código completo, que pode trazer diversos benefícios ao trabalho dos desenvolvedores. 

Quais os principais conceitos da programação funcional?

Agora que você já sabe um pouco sobre a programação funcional, vou listar abaixo alguns conceitos fundamentais para você começar a desenvolver de forma funcional:

Composição de Função 

Composições de funções, significa criar uma nova função através da composição de outras. No exemplo abaixo, vamos criar uma função que vai filtrar um array, filtrando somente os números pares e multiplicando por dois:

const numeros = [2, 3, 4, 5, 6, 7, 8, 9, 10]

numeros.filter((numero) => numero % 2 === 0).map((numero) => numero * 2) 

// [ 4, 8, 12, 16, 20 ]

Funções Puras 

 A função sempre avalia o mesmo valor de resultado, dado o mesmo valor do argumento. O valor do resultado da função não pode depender de qualquer informação ou estado oculto que possa mudar à medida que a execução do programa prossiga ou entre diferentes execuções do programa, nem pode depender de qualquer entrada externa de dispositivos de E/S. A avaliação do resultado não causa nenhum efeito colateral nem saída semanticamente observável, como mutação de objetos mutáveis ​​ou saída para dispositivos de E/S. Portanto, se uma das instruções for falsa quando comparada ao seu código, ela é impura.

Funções puras são funções que dado um parâmetro input sempre vão retornar o mesmo output sem causar side effects (efeitos colaterais). Esses efeitos ocorrem quando uma função ao ser executada causa mudanças no estado da aplicação, o que são chamadas de funções impuras.

Vamos criar duas funções: uma função pura e outra impura. Confira:

Função Pura:

## ES6 ##

const sum = (x, y) => x+y;

## ES5 ##

var sum = function (x, y) {

  return x + y;

}

Função Impura:

## ES6 ##

const x = 20;

const sum = (y) => x+y;

## ES5 ##

var x = 20;

var sum = function (y) {

  return x+y;

}

Repare que a variável x está sendo definida no estado global da aplicação, sendo assim o output da função sum sempre dependerá da mudança de estado global e não pelo input passado como parâmetro, o que torna a função dependente de fatores externos.

Uma função possui efeito colateral (side effect) quando altera o estado fora do seu contexto local.

Imutabilidade 

Imutabilidade significa que uma vez que uma variável recebe um valor, vai possuir esse valor para sempre, ou quando criamos um objeto, ele não poderá ser modificado.

Por exemplo, o objeto string do Javascript por exemplo é imutável:

const sobreNome = “Silveira”

sobreNome.replace(“Silveira”, “Souza”) //’Souza’

sobreNome //’Silveira’

Efeito Colateral

Um efeito colateral é toda e qualquer modificação no estado da aplicação que seja percebida fora do destino da função chamada. Uma função possui efeito colateral (side effect) quando altera o estado fora do seu contexto local. 

Mas, qual seria a forma de fazermos com que uma função impura, se torne uma função pura? 

A resposta é simples: as funções não podem depender de dados globais. Se elas dependem de algum dado global, esse dado não pode ser acesso dentro da função direta, ele tem que ser passado como parâmetro para a função.

Estado Compartilhado  

Estado Compartilhado é qualquer variável ou objeto que existe em um escopo compartilhado.

Normalmente na programação orientada a objetos, os objetos são compartilhados entre escopos adicionando propriedades a demais objetos. Por exemplo, um jogo de computador pode ter um objeto principal, com personagens e itens de jogo armazenados como propriedades pertencentes a esse objeto. O único ponto de atenção com o estado compartilhado é que, para entender os efeitos de uma função, é necessário conhecer o histórico das variáveis compartilhadas que a função usa ou afeta. 

Conclusão 

Em virtude dos fatos apresentados aqui e em outro conteúdo do blog: Programação Funcional, podemos concluir que a programação funcional é aquela que destaca o uso das funções e, na hora de resolver um entrave, o divide o problema em blocos onde são implementadas estas funções. Estas funções definem algumas variáveis que podem ou não retornar resultados. Para você que é iniciante na área de programação ou deseja se aperfeiçoar, entender de forma mais profunda a programação funcional é essencial. Com a virada de ano, é o momento ideal para iniciar uma nova jornada profissional e a Kenzie Academy Brasil está preparada para te oferecer todo o suporte necessário.

Se você gostou desse conteúdo e gostaria de entrar na área de programação, eu recomendo que você faça a sua inscrição na Kenzie Academy Brasil. Estude Desenvolvimento Full Stack e só pague quando estiver formado. Faça já a sua inscrição.

 

+2

Escreva o primeiro comentário

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *