PROGRAMAÇÃO FUNCIONAL: O QUE É E SEUS PRINCIPAIS CONCEITOS

Ugo Roveda

Por Ugo Roveda04 nov 202210 min de leitura

Imagem ilustrativa

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. Ao decorrer do texto você irá entender melhor sobre isso. 

O que é programação funcional?

A programação funcional é um paradigma da programação que te permite criar códigos confiáveis e fáceis de testar. Atualmente, até a indústria aeroespacial 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:

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”.

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:

Encapsulamento

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.

Por que usar programação funcional?

Primeiramente, é importante frisar que essa metodologia é muito utilizada no mercado de trabalho. Dessa forma, é fundamental que uma pessoa desenvolvedora estude e conheça os conceitos para aplicá-los em seus projetos. Além disso, trabalhando com a programação funcional, o código tende a ficar mais completo e objetivo do que em outros tipos de paradigmas.

Posteriormente, veremos sobre as vantagens desse paradigma, porém, abaixo listarei algumas, para que já tenham ciência da sua importância:

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

Quais os principais conceitos da programação funcional?

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

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, criaremos uma função que filtrará um array, retornando somente os números pares e multiplicando-os por dois:

Funções Puras

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). 

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.

A função sempre avalia o mesmo valor de resultado, dado o mesmo valor do argumento. O valor do resultado 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. Além disso, também não 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 ​​ou saída para dispositivos de E/S. Portanto, se uma das instruções for falsa quando comparada ao seu código, ela é impura.

Criaremos duas funções: uma pura e outra impura. Confira:

Função Pura:

Função Impura:

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, tornando a função dependente de fatores externos.

Imutabilidade

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

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

Efeito Colateral

Um efeito colateral é toda e qualquer modificação no estado da aplicação 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 acessado na função diretamente. Ao invés disso, ele tem que ser passado como parâmetro.

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. 

Vantagens de usar Programação Funcional?

Por tornar o código mais objetivo e completo, as vantagens de se utilizar esse paradigma são muitas, fazendo com que grande parte da comunidade de desenvolvedores do mundo a utilizem em seus projetos. Veja algumas dessas vantagens a seguir:

Código limpo

O Clean Code, como também é conhecido pelos desenvolvedores, é um tema muito atual e que vem ganhando cada vez mais força no ramo da tecnologia. Afinal, trabalhando como pessoa desenvolvedora, precisamos ter consciência que estamos escrevendo os nossos códigos para que outras pessoas também possam ler e compreender.

Dessa forma, é essencial que mantenhamos uma padronização de escrita e um código limpo, tornando-o de fácil correção, caso seja necessário.

Padrões de projeto

Acabamos de ver a importância de um código limpo e bem escrito. Para que isso possa acontecer, é necessário seguir alguns padrões pré-estabelecidos. Esses padrões são muito importantes no ambiente de desenvolvimento, pois geram uma maior produtividade, tornando-o o trabalho do desenvolvedor mais dinâmico e otimizado.

Facilita a manutenção do código ou mudanças

Percebe que todas as vantagens estão interligadas? A grande magia da programação funcional é exatamente essa.

Por termos um código limpo e padronizado, se torna mais fácil a manutenção e implementação de mudanças ou novas funcionalidades, quando necessário.

Mais simples de adicionar testes

Pelo fato da programação funcional ter como objetivo evitar os efeitos colaterais e serem escritos de maneira imperativa, as aplicações podem ser testadas mais facilmente, pois dependem apenas de um input (valor de entrada).

Código imutável

Como citamos anteriormente em nosso texto, o objeto imutável é aquele que não pode ter os valores das suas propriedades alterados após a sua criação. Dessa forma, conseguimos manter um código mais estável e diminuir a chance de bugs acontecerem.

Qual a diferença entre programação funcional e orientada a objetos?

Sabemos que ambos são paradigmas da programação. Porém, em relação à orientação a objetos, enquanto paradigma, ela determinará algumas estruturas e elementos que a pessoa desenvolvedora irá utilizar em seu código. Como, por exemplo, os métodos e objetos. 

Já a funcional, ditará outras coisas, como, por exemplo, a utilização de funções para criar o seu código. 

Conclusão

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ê, iniciante na área de programação ou que 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 e estude Desenvolvimento Full Stack.

VOCÊ TAMBÉM PODE SE INTERESSAR POR: