(Zakładając, że środowisko jednowątkowe)
Funkcja spełniająca to kryterium to:
bool MyClass::is_initialized = false;
void MyClass::lazy_initialize()
{
if (!is_initialized)
{
initialize(); //Should not be called multiple times
is_initialized = true;
}
}
Zasadniczo mogę wywoływać tę funkcję wiele razy i nie martw się, że zainicjuje się MyClass
wiele razy
Funkcją niespełniającą tego kryterium może być:
Foo* MyClass::ptr = NULL;
void initialize()
{
ptr = new Foo();
}
initialize()
Wielokrotne wywołanie spowoduje wyciek pamięci
Motywacja
Byłoby miło mieć jedno zwięzłe słowo opisujące to zachowanie, aby funkcje, które powinny spełniać to kryterium, mogły zostać należycie skomentowane (szczególnie przydatne przy opisywaniu funkcji interfejsu, które powinny zostać zastąpione)
Odpowiedzi:
Ten typ funkcji / operacji nosi nazwę Idempotent
W matematyce oznacza to, że jeśli f jest idempotentny, f ( f (x)) = f (x), co jest równoznaczne z wypowiedzeniem f ∘ f = f .
W informatyce oznacza to, że jeśli
f(x);
jest idempotentny,f(x);
jest taki sam jakf(x); f(x);
.Uwaga: znaczenia te wydają się inne, ale w denotacyjnej semantyce stanu słowo „idempotent” ma tak samo dokładne znaczenie zarówno w matematyce, jak i informatyce.
źródło
Dokładny termin na to (jak wspomina Woofas ) to idempotencja. Chciałem dodać, że chociaż można nazwać tę
func1
metodę idempotent, nie można nazwać jej czystą funkcją. Właściwości czystej funkcji są dwa: musi być idempotentna i nie może mieć skutków ubocznych, to znaczy nie może powodować mutacji lokalnych zmiennych statycznych, zmiennych nielokalnych, zmiennych argumentów referencyjnych ani strumieni we / wy.Powiadam o tym, że funkcja idempotentna z efektami ubocznymi też nie jest dobra, ponieważ technicznie idempotentna odnosi się do wyniku zwrotnego funkcji, a nie do efektów ubocznych. Więc technicznie twoja
func2
metoda jest idempotentna, ponieważ dane wyjściowe nie zmieniają się zgodnie z danymi wejściowymi.Najprawdopodobniej chcesz określić, że chcesz mieć czystą funkcję. Przykładem czystej funkcji może być:
Więcej lektur można znaleźć w artykule na Wikipedii „Czysta funkcja” .
źródło
PUT
iDELETE
HTTP są nazywane idempotentnymi właśnie dlatego , że wielokrotne wykonywanie ich skutków ubocznych daje taki sam efekt, jak wykonywanie ich tylko raz. Mówisz „idempotencja oznaczaf∘f = f
”, podczas gdy w programowaniu mamy na myśli „wykonywanief
ma ten sam efekt, co wykonywanief; f
”. Zauważ, że możesz łatwo przekształcić drugie znaczenie w poprzednie, dodając parametr „world”.func1(1) != func1(func1(1))
.void f(int var) { someGlobalVariable = var; }
. Czysta, nie idempotent:int func1(int var) { return var + 1; }
.Terminem jest idempotencja . Zauważ, że istnieje wyraźna różnica między funkcją Idempotent (wywoływaną rekurencyjnie na sobie; Drugi blok kodu i definicja matematyczna), a idempotencją funkcjonalną (wywoływaną wielokrotnie z tym samym wejściem sekwencyjnym; Pierwszy blok kodu i często termin oznaczony w Programowaniu).
źródło
W fizyce słyszałem, że jest to projekcja :
Graficznie ma to sens, jeśli spojrzysz na kreskówkę z projekcją wektorową :
Na zdjęciu, 1 jest projekcją do B , który jest podobny do pierwszego zastosowania swojej funkcji. Kolejne występy na 1 w celu b dać ten sam rezultat 1 . Innymi słowy, wielokrotne wywoływanie projekcji ma taki sam efekt jak jednorazowe wywołanie.
Uczciwe ostrzeżenie: nigdy nie słyszałem o tym używanym poza fizyką, więc jeśli nie masz tego typu w zespole, możesz wszystkich pomylić.
źródło
Jest to algorytm deterministyczny, ponieważ przy tych samych danych wejściowych (w tym przypadku bez danych wejściowych) zawsze będzie generować takie same dane wyjściowe.
Bazy danych SQL są zainteresowane funkcjami deterministycznymi .
Funkcja musi być deterministyczna, jeśli jest używana do obliczania indeksu.
Na przykład, w SQLite następujące funkcje nie deterministyczne nie może być stosowany w indeksie:
random()
,changes()
,last_insert_rowid()
isqlite3_version()
.źródło
func2
jest deterministyczny (nie ma w nim żadnych efektów losowych), ale już zadeklarował, że narusza właściwość, której szuka.W uzupełnieniu do innych odpowiedzi, jeśli nie ma konkretnego wejścia do functon który ma tę właściwość, że jest to punkt stały , niezmienny punkt lub fixpoint funkcji. Na przykład 1 do dowolnej potęgi jest równy 1, więc (1ⁿ) ⁿ = 1ⁿ = 1.
Szczególnym przypadkiem programu, który produkuje się jako wyjście, jest quine .
źródło