DEV Community

Cover image for Programação funcional: o que são funções puras, determinísticas e que não provocam efeitos colaterais
Lais Frigério
Lais Frigério

Posted on

Programação funcional: o que são funções puras, determinísticas e que não provocam efeitos colaterais

Programação funcional é um paradigma de construção e desenvolvimento de um software baseado em funções. Essas funções podem ser puras, que não provocam efeitos colaterais, ou impuras.

Funções Puras

É uma função que dada a mesma entrada (parâmetros), sempre retornará a mesma saída. Por conta disso, também são conhecidas como funções determinísticas.

A função a seguir, responsável por somar 2 valores, sempre retorna a mesma saída quando a mesma entrada é informada:

function sum (num1, num2) {
  return num1 + num2
}

sum(1,2) // sempre vai retornar 3
sum(2,2) // sempre vai retornar 4

Enter fullscreen mode Exit fullscreen mode

Além disso, funções puras também são conhecidas por não provocarem mutação de estado ou efeitos colaterais. Isso significa que uma dependência externa (e.g variável) nunca pode ser alterada.

A seguir, vamos conhecer alguns exemplos de funções impuras.

Funções Impuras

Analise o seguinte trecho de código:

let message =  'Hello'

function showMessage (newMessage = message) {
  message = newMessage
  alert(message)
}

showMessage() // o alerta exibe o texto 'Hello'
console.log(message) // Hello

showMessage('Bye, Bye') // o alerta exibe o texto 'Bye, Bye'
console.log(message) // Bye, Bye
Enter fullscreen mode Exit fullscreen mode

A função showMessage provoca um efeito colateral ao alterar o estado de uma variável externa: message. Logo, esta função é considerada impura.

Se uma função tem dependência de uma ou mais variáveis que podem ser alteradas, a função é considerada impura.


Lembra que as funções puras retornam sempre o mesmo valor ao passar como parâmetro a mesma entrada?

Pois bem, nas funções impuras isto não acontece.

As funções impuras podem retornar diferentes valores para a mesma entrada. No exemplo a seguir, a função multiplication pode retornar um valor diferente a cada chamada:


let multiplicationTable = 2;
function multiplication(num) {
  return num * multiplicationTable
}

Enter fullscreen mode Exit fullscreen mode

Neste caso, a função multiplication tem uma dependência externa, a variável multiplicationTable. Ao chamar a função multiplication passando o valor 5 como parâmetro o retorno é 10:

multiplication(5) // retorna 10
Enter fullscreen mode Exit fullscreen mode

Mas, se o valor da variável multiplicationTable for alterado em outro momento no código, ao acionar a função multiplication mesmo passando o valor 5 como parâmetro, a função vai ter um retorno diferente:

multiplicationTable = 3

multiplication(5) // retorna 15
Enter fullscreen mode Exit fullscreen mode

Conclusão

Um software construído com base no paradigma funcional é composto tanto por funções puras e impuras. O ideal é construir uma aplicação através do desenvolvimento do maior número possível de funções determinísticas.

As funções puras são mais fáceis de testar, debugar e de fazer manutenção. Além do mais, é altamente recomendável que seu código tenha uma alta cobertura de casos de testes para funções puras.

Top comments (0)