Pureza
Uma função pura é uma função em que o valor de retorno é determinado apenas por seus valores de entrada, sem efeitos colaterais observáveis.
Constantes globais vs. locais vs. parâmetros
Uso de constantes definidas globalmente no código gera funções impuras e instáveis.
// Constante global.
const PI = 3.141592
// Impura: se alguém modificar o valor de PI,
// a mesma função gerará um valor diferente.
function areaCirc(raio) {
return raio * raio * PI
}
console.log(`Impura: ${areaCirc(10)}`)
Impura: 314.1592
Uso de constantes pré-definidas pela própria linguagem gera funções impuras, porém, estáveis.
// Impura, mas estável.
// Modificar o valor de Math.PI é bem mais raro.
function areaCirc2(raio) {
return raio * raio * Math.PI
}
console.log(`Impura estável: ${areaCirc2(10)}`)
Impura estável: 314.1592653589793
Constante definida na própria função promove pureza.
// Pura: depende apenas dos argumentos passados.
// Usa parâmetros inicializados.
function areaCirc3(raio, pi=3.14) {
return raio * raio * pi
}
console.log(`Pura param: ${areaCirc3(10)}`)
console.log(`Pura param: ${areaCirc3(10, 3.141592)}`)
console.log(`Pura param: ${areaCirc3(10, Math.PI)}`)
// Pura: depende apenas dos argumentos passados.
// Usa constante local.
function areaCirc4(raio) {
const PI = 3.14
return raio * raio * PI
}
console.log(`Pura local: ${areaCirc4(10)}`)
Pura param: 314
Pura param: 314.1592
Pura param: 314.1592653589793
Pura local: 314
Valores aleatórios
Função com geração aleatória é naturalmente impura. A cada execução, o resultado será diferente.
function gerarNumeroAleatorio(min, max) {
const fator = max - min + 1
return parseInt(Math.random() * fator) + min
}
console.log(gerarNumeroAleatorio(1, 10000))
console.log(gerarNumeroAleatorio(1, 10000))
console.log(gerarNumeroAleatorio(1, 10000))
console.log(gerarNumeroAleatorio(1, 10000))
console.log(gerarNumeroAleatorio(1, 10000))
7236
6080
1722
7450
4254
Efeitos colaterais observáveis
Alterar valores fora do escopo da função fere o paradigma.
let qtde = 0
// Impura
function somar(a, b) {
qtde++ // efeitos colaterais observáveis.
return a + b
}
// Impura
function imprimeQtde(valor) {
console.log(`Qtde: ${valor}`)
}
imprimeQtde(qtde)
console.log(somar(68, 31))
console.log(somar(68, 31))
console.log(somar(68, 31))
console.log(somar(68, 31))
console.log(somar(68, 31))
imprimeQtde(qtde)
Qtde: 0
99
99
99
99
99
Qtde: 5