(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 MyClass
vá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)
Respostas:
Esse tipo de função / operação é chamado Idempotent
Em matemática, isso significa que, se f é idempotente, f ( f (x)) = f (x), que é o mesmo que dizer f ∘ f = f .
Na ciência da computação, isso significa que se
f(x);
é idempotente,f(x);
é o mesmo quef(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.
fonte
O termo exato para isso (como Woofas menciona ) é idempotência. Eu gostaria de acrescentar que, embora você possa chamar seu
func1
mé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
func2
mé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:
Mais leitura pode ser encontrada no artigo da Wikipedia "Função pura" .
fonte
PUT
eDELETE
sã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 significaf∘f = f
", enquanto que na programação queremos dizer "executarf
tem o mesmo efeito que executarf; f
". Observe que você pode facilmente transformar o segundo significado no primeiro adicionando um parâmetro "world".func1(1) != func1(func1(1))
.void f(int var) { someGlobalVariable = var; }
. Pure, não idempotentes:int func1(int var) { return var + 1; }
.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).
fonte
Na física, ouvi isso referido como uma projeção :
Graficamente, isso faz sentido se você observar um desenho animado de uma projeção vetorial :
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.
fonte
É um algoritmo determinístico porque, dada a mesma entrada (neste caso, nenhuma entrada), sempre produzirá a mesma saída.
Os bancos de dados SQL estão interessados em funções determinísticas .
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()
esqlite3_version()
.fonte
func2
é determinístico (não há efeitos aleatórios envolvidos), mas já foi declarado como violador da propriedade que ele está procurando.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 .
fonte