Não tenho certeza sobre definições universais de pureza, mas do ponto de vista do Haskell (uma linguagem em que os programadores tendem a se importar com coisas como pureza e transparência referencial), somente a primeira das suas funções é "puro". A segunda versão do add
não é pura . Então, em resposta à sua pergunta, eu chamaria de "impuro";)
De acordo com esta definição, uma função pura é uma função que:
- Depende apenas da sua entrada. Isto é, dada a mesma entrada, sempre retornará a mesma saída.
- É referencialmente transparente: a função pode ser livremente substituída por seu valor e o "comportamento" do programa não será alterado.
Com esta definição, fica claro que sua segunda função não pode ser considerada pura, já que quebra a regra 2. Ou seja, os dois programas a seguir NÃO são equivalentes:
function f(a, b) {
return add(a, b) + add(a, b);
}
e
function g(a, b) {
c = add(a, b);
return c + c;
}
Isso ocorre porque, mesmo que ambas as funções retornem o mesmo valor, a função f
gravará no banco de dados duas vezes, mas g
gravará uma vez! É muito provável que as gravações no banco de dados façam parte do comportamento observável do seu programa. Nesse caso, mostrei que sua segunda versão do add
não é "pura".
Se as gravações no banco de dados não forem uma parte observável do comportamento do seu programa, as duas versões de add
poderão ser consideradas equivalentes e puras. Mas não consigo pensar em um cenário em que escrever no banco de dados não tenha importância. Até mesmo questões de registro!