O que é um termo para uma função que, quando chamada repetidamente, tem o mesmo efeito que chamar uma vez?


96

(Assumindo um ambiente de thread único)

Uma função que atende a esse critério é:

bool MyClass::is_initialized = false;

void MyClass::lazy_initialize()
{
    if (!is_initialized)
    {
        initialize(); //Should not be called multiple times
        is_initialized = true;
    }
}

Em essência, eu posso chamar essa função várias vezes e não me preocupar em inicializar MyClassvárias vezes

Uma função que não atende a esse critério pode ser:

Foo* MyClass::ptr = NULL;

void initialize()
{
    ptr = new Foo();
}

Ligar initialize()várias vezes causará um vazamento de memória

Motivação

Seria bom ter uma única palavra concisa para descrever esse comportamento, para que as funções que devem atender a esse critério possam ser devidamente comentadas (especialmente útil ao descrever as funções da interface que devem ser substituídas)


67
Para o (s) eleitor (es) próximo (s): embora seja verdade que 99,999% (estimativa aproximada) de todas as perguntas de "nomeie essa coisa" sejam fora de tópico, porque elas não têm uma única resposta correta, objetiva e inequívoca e objetiva. nomeação é puramente subjetiva e baseada em opinião, este não tem um único,,, resposta objetiva inequívoca correta, que foi dado pelo próprio OP.
Jörg W Mittag

30
Chamando-o várias vezes faz ter um efeito, como poderia haver outro código que mudou 'var' no meio.
RemcoGerlich 4/03

7
Por que essa pergunta foi feita, se o OP sabia a resposta no momento da pergunta ? Existe alguma razão além da construção de pontos / rep / karma?
dotancohen 4/03

13
A resposta automática no estilo Q / A é um dos principais conceitos do StackExchange.
glglgl 4/03

17
@glglgl: Eu concordo, para perguntas com mérito. Que mérito tem essa pergunta? Estou seriamente preocupado com o fato de começarmos a receber todas as perguntas do CS 101 feitas e respondidas imediatamente pelo OP, todos os termos do CS solicitados e imediatamente definidos pelo OP, e os prós e contras de todos os algoritmos básicos questionados e depois respondidos imediatamente pelo OP ( não necessariamente este OP). É esse o site que queremos que a engenharia de software.SE seja?
dotancohen 4/03

Respostas:


244

Esse tipo de função / operação é chamado Idempotent

Idempotência (Reino Unido: / ˌɪdɛmˈpoʊtəns /, [1] US: / ˌaɪdəm - /) [2] é propriedade de certas operações em matemática e ciências da computação nas quais elas podem ser aplicadas várias vezes sem alterar o resultado além da aplicação inicial.

Em matemática, isso significa que, se f é idempotente, f ( f (x)) = f (x), que é o mesmo que dizer ff = f .

Na ciência da computação, isso significa que se f(x);é idempotente, f(x);é o mesmo que f(x); f(x);.

Nota: Esses significados parecem diferentes, mas, sob a semântica denotacional do estado , a palavra "idempotente" realmente tem o mesmo significado exato na matemática e na ciência da computação.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
maple_shaft

51

O termo exato para isso (como Woofas menciona ) é idempotência. Eu gostaria de acrescentar que, embora você possa chamar seu func1método de idempotente, você não pode chamá-lo de uma função pura . As propriedades de uma função pura são duas: ela deve ser idempotente e não deve ter efeitos colaterais, ou seja, nenhuma mutação de variáveis ​​estáticas locais, variáveis ​​não locais, argumentos de referência mutáveis ​​ou fluxos de E / S.

A razão pela qual mencionei isso é que uma função idempotente com efeitos colaterais também não é boa, pois tecnicamente idempotente se refere à saída de retorno da função e não aos efeitos colaterais. Portanto, tecnicamente, seu func2método é idempotente, pois a saída não muda de acordo com a entrada.

Você provavelmente deseja especificar que deseja uma função pura. Um exemplo de uma função pura pode ser o seguinte:

int func1(int var)
{
    return var + 1;
}

Mais leitura pode ser encontrada no artigo da Wikipedia "Função pura" .


37
Eu acho que sua definição de idempotência é muito estreita, ou, em outras palavras, você está usando a definição matemática de idempotência, não a de programação. Por exemplo, os métodos HTTP PUTe DELETEsão chamados idempotentes precisamente porque executar seus efeitos colaterais várias vezes tem o mesmo efeito que executá-los apenas uma vez. Você está dizendo "idempotência significa f∘f = f", enquanto que na programação queremos dizer "executar ftem o mesmo efeito que executar f; f". Observe que você pode facilmente transformar o segundo significado no primeiro adicionando um parâmetro "world".
Jörg W Mittag

23
@ Neil "Idempotência é estritamente um termo matemático." Não, não é, também é usado em redes e sistemas distribuídos / de comunicação com o servidor cliente e é descrito como o JörgWMittag o descreve. É um conceito útil porque permite várias solicitações a um servidor / cliente com a mesma operação / mensagem sem alterar o que a mensagem original se propôs a fazer. Isso é útil quando você possui comunicação não confiável e precisa tentar um comando novamente porque a mensagem do cliente foi descartada ou a resposta do servidor.
opa

7
Você deve entrar em mais detalhes sobre a diferença entre puro e idempotente. Seu exemplo func1 não é idempotente porque func1(1) != func1(func1(1)).
Tezra 04/03

5
Pureza e idempotência são diferentes. Uma função pura não precisa ser idempotente no sentido matemático (é obviamente idempotente em termos de efeitos colaterais, pois não possui nenhum). A função idempotente (no sentido de programação) não precisa ser pura, como no exemplo dado pelo OP. Além disso, como mencionado anteriormente, a idempotência é uma propriedade útil com um uso estritamente diferente da pureza. Sua definição de pureza como "idempotente e sem efeitos colaterais" está errada ou, pelo menos, enganosa, com voto negativo.
Frax

5
No contexto da programação, não há "efeitos colaterais", mas se você expandir a definição para incluir isso, uma função idempotente e uma função pura significariam a mesma coisa. Não, eles não significariam a mesma coisa. Idempotente, não puro: void f(int var) { someGlobalVariable = var; }. Pure, não idempotentes: int func1(int var) { return var + 1; }.
JLRishe 5/03

6

O termo é idempotência . Observe abaixo que há uma diferença distinta entre uma função Idempotente (chamada recursivamente em si mesma; segundo bloco de código e a definição matemática) e idempotência funcional (chamada repetidamente com a mesma entrada sequencialmente; primeiro bloco de código e geralmente o termo que significa programação).

Uma função f com efeitos colaterais é considerada idempotente sob a composição seqüencial f; f se, quando chamada duas vezes com a mesma lista de argumentos, a segunda chamada não tiver efeitos colaterais e retornar o mesmo valor da primeira chamada [citação necessária] (assumindo que nenhum outro procedimento foi chamado entre o final da primeira chamada e o início da segunda chamada).

Por exemplo, considere o seguinte código Python:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

Aqui, setx é idempotente porque a segunda chamada para setx (com o mesmo argumento) não altera o estado visível do programa: x já estava definido para 5 na primeira chamada e novamente para 5 na segunda chamada, mantendo assim o mesmo valor. Observe que isso é diferente da idempotência na composição da função f ∘ f. Por exemplo, o valor absoluto é idempotente na composição da função:

def abs(n):
    if n < 0:
        return -n
    else:
        return n

abs(-5) == abs(abs(-5)) == abs(5) == 5

3

Na física, ouvi isso referido como uma projeção :

uma projecção é uma transformação linear P a partir de um espaço vectorial a si mesmo de modo a que P 2 = P . Ou seja, sempre que P é aplicado duas vezes a qualquer valor, obtém o mesmo resultado como se tivesse sido aplicado uma vez (idempotente).

Graficamente, isso faz sentido se você observar um desenho animado de uma projeção vetorial :

insira a descrição da imagem aqui

Na figura, a 1 é a projeção de a para b , que é como a primeira aplicação de sua função. Projeções subseqüentes de a 1 a b dão o mesmo resultado a 1 . Em outras palavras, quando você chama uma projeção repetidamente, ela tem o mesmo efeito que uma vez.

Aviso justo: nunca ouvi isso ser usado fora da física, portanto, a menos que você tenha esses tipos em sua equipe, poderá confundir todo mundo.


2
Este é realmente um bom exemplo concreto de como uma função idempotente pode ser visualizada (matematicamente, e especialmente no campo geometria vetorial / álgebra linear). Embora a "idempotência" da função de software seja um conceito muito próximo, não acho que desenvolvedores / cientistas da computação usem frequentemente a palavra "projeção" nesse contexto (uma "função de projeção" na engenharia de software prefere se referir a uma função que pega um objeto e retorna um novo objeto derivado dele, ou uma propriedade desse objeto, por exemplo)
Pac0

2
@ Pac0 Oh, ok. Eu trabalho na margem entre ciência e programação e não percebi que a palavra já estava sobrecarregada. Posso pensar em alguns exemplos inventados no trabalho em que usaria essa terminologia, mas admito que trabalho com pessoas que estão dispostas a tolerar o jargão científico no diário :-)
user1717828

3

É um algoritmo determinístico porque, dada a mesma entrada (neste caso, nenhuma entrada), sempre produzirá a mesma saída.

Na ciência da computação, um algoritmo determinístico é um algoritmo que, dada uma entrada específica, sempre produzirá a mesma saída, com a máquina subjacente sempre passando pela mesma sequência de estados. Os algoritmos determinísticos são, de longe, o tipo de algoritmo mais estudado e familiar, além de um dos mais práticos, pois podem ser executados em máquinas reais com eficiência.

Os bancos de dados SQL estão interessados ​​em funções determinísticas .

Uma função determinística sempre dá a mesma resposta quando possui as mesmas entradas. A maioria das funções SQL internas no SQLite são determinísticas. Por exemplo, a função abs (X) sempre retorna a mesma resposta, desde que sua entrada X seja a mesma.

Uma função deve ser determinística se for usada no cálculo de um índice.

Por exemplo, no SQLite, as seguintes funções não-determinística não pode ser usada em um índice: random(), changes(), last_insert_rowid()e sqlite3_version().


6
O autor da pergunta func2é determinístico (não há efeitos aleatórios envolvidos), mas já foi declarado como violador da propriedade que ele está procurando.
Draco18s 4/03

Que o mesmo resultado seja produzido pela repetição não é o mesmo que dizer que o mesmo resultado é produzido pelo aninhamento ou encadeamento. As funções determinísticas são importantes para armazenar resultados em cache, mais do que para indexação / hash.
mckenzm 5/03

3

Além das outras respostas, se houver uma entrada específica para o functon que possui essa propriedade, é um ponto fixo , ponto invariável ou ponto fixo da função. Por exemplo, 1 para qualquer potência é igual a 1, então (1ⁿ) ⁿ = 1ⁿ = 1.

O caso especial de um programa que se produz como saída é uma Quine .


Quines são para software como os conjuntos Cantor são para matemática :-). E, é claro, os quines não são idempotentes - eles falham quando a saída já existe ou "clobberam" o resultado anterior e escrevem uma nova saída, embora idêntica.
Carl Witthoft
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.