(Unter der Annahme einer Umgebung mit einem Thread)
Eine Funktion, die dieses Kriterium erfüllt, ist:
bool MyClass::is_initialized = false;
void MyClass::lazy_initialize()
{
if (!is_initialized)
{
initialize(); //Should not be called multiple times
is_initialized = true;
}
}
Im Wesentlichen kann ich diese Funktion mehrmals aufrufen und muss mir keine Sorgen machen, dass sie MyClass
mehrmals initialisiert wird
Eine Funktion, die dieses Kriterium nicht erfüllt, kann sein:
Foo* MyClass::ptr = NULL;
void initialize()
{
ptr = new Foo();
}
Ein initialize()
mehrmaliger Aufruf führt zu einem Speicherverlust
Motivation
Es wäre schön, ein einziges prägnantes Wort zur Beschreibung dieses Verhaltens zu haben, damit Funktionen, von denen erwartet wird, dass sie dieses Kriterium erfüllen, ordnungsgemäß kommentiert werden können (besonders nützlich bei der Beschreibung von Schnittstellenfunktionen, von denen erwartet wird, dass sie überschrieben werden).
Antworten:
Diese Art von Funktion / Operation wird als idempotent bezeichnet
In der Mathematik bedeutet dies, dass wenn f idempotent ist, f ( f (x)) = f (x) ist, was dasselbe ist, wie wenn man f ∘ f = f sagt .
In der Informatik bedeutet dies, dass wenn
f(x);
idempotentf(x);
ist, dasselbe wief(x); f(x);
.Anmerkung: Diese Bedeutungen scheinen unterschiedlich zu sein, aber unter den Bezeichnungen der Staatssemantik hat das Wort "idempotent" in Mathematik und Informatik genau dieselbe Bedeutung.
quelle
Der genaue Begriff dafür (wie Woofas erwähnt ) ist Idempotenz. Ich wollte hinzufügen, dass Sie Ihre
func1
Methode zwar idempotent, aber keine reine Funktion nennen können. Es gibt zwei Eigenschaften einer reinen Funktion: Sie muss idempotent sein und darf keine Nebenwirkungen haben, dh keine Mutation lokaler statischer Variablen, nicht lokaler Variablen, veränderlicher Referenzargumente oder E / A-Ströme.Der Grund, warum ich dies erwähne, ist, dass eine idempotente Funktion mit Nebenwirkungen auch nicht gut ist, da sich technisch idempotent auf die Rückgabe der Funktion und nicht auf die Nebenwirkungen bezieht. Technisch gesehen ist Ihre
func2
Methode also idempotent, da sich die Ausgabe nicht entsprechend der Eingabe ändert.Sie möchten höchstwahrscheinlich angeben, dass Sie eine reine Funktion wünschen. Ein Beispiel für eine reine Funktion könnte sein:
Weitere Informationen finden Sie im Wikipedia-Artikel "Reine Funktion" .
quelle
PUT
undDELETE
HTTP-Methoden genau deshalb als idempotent bezeichnet , weil die mehrfache Ausführung ihrer Nebenwirkungen dieselbe Wirkung hat wie die einmalige Ausführung. Sie sagen, "Idempotenz bedeutetf∘f = f
", während wir in der Programmierung meinen, "Ausführenf
hat den gleichen Effekt wie Ausführenf; f
". Beachten Sie, dass Sie die zweite Bedeutung einfach in die erstere umwandeln können, indem Sie einen "world" -Parameter hinzufügen.func1(1) != func1(func1(1))
.void f(int var) { someGlobalVariable = var; }
. Rein, nicht idempotent:int func1(int var) { return var + 1; }
.Der Begriff ist Idempotenz . Beachten Sie, dass es einen deutlichen Unterschied zwischen einer idempotenten Funktion (die rekursiv für sich selbst aufgerufen wird; zweiter Codeblock und die mathematische Definition) und einer funktionalen Idempotenz (die wiederholt mit der gleichen Eingabe nacheinander aufgerufen wird; erster Codeblock und häufig der in der Programmierung verwendete Begriff) gibt.
quelle
In der Physik habe ich gehört, dass dies als Projektion bezeichnet wird :
Grafisch ist dies sinnvoll, wenn Sie sich eine Karikatur einer Vektorprojektion ansehen :
Im Bild ist a 1 die Projektion von a auf b , was wie die erste Anwendung Ihrer Funktion ist. Nachfolgende Projektionen von a 1 auf b ergeben das gleiche Ergebnis wie a 1 . Mit anderen Worten, wenn Sie eine Projektion wiederholt aufrufen, hat dies den gleichen Effekt wie ein einmaliger Aufruf.
Faire Warnung: Ich habe noch nie gehört, dass dies außerhalb der Physik verwendet wird. Wenn Sie also nicht über solche Typen in Ihrem Team verfügen, könnten Sie alle verwirren.
quelle
Es ist ein deterministischer Algorithmus, da er bei gleicher Eingabe (in diesem Fall keine Eingabe) immer die gleiche Ausgabe erzeugt.
SQL-Datenbanken interessieren sich für deterministische Funktionen .
Eine Funktion muss deterministisch sein, wenn sie zur Berechnung eines Index verwendet wird.
Zum Beispiel in SQLite können die folgenden nicht-deterministischen Funktionen nicht in einem Index verwendet werden:
random()
,changes()
,last_insert_rowid()
undsqlite3_version()
.quelle
func2
ist deterministisch (es gibt keine zufälligen Effekte), aber bereits als Verstoß gegen die gesuchte Eigenschaft deklariert.Zusätzlich zu den anderen Antworten, wenn es einen bestimmten Eingang an den functon ist , die diese Eigenschaft hat, ist es ein Fixpunkt , Festpunkt oder Fixpunkt der Funktion. Zum Beispiel ist 1 zu jeder Potenz gleich 1, also (1ⁿ) ⁿ = 1ⁿ = 1.
Der Spezialfall eines Programms, das sich selbst als Ausgabe produziert, ist ein Quine .
quelle