(En supposant un environnement mono-threadé)
Une fonction qui remplit ce critère est:
bool MyClass::is_initialized = false;
void MyClass::lazy_initialize()
{
if (!is_initialized)
{
initialize(); //Should not be called multiple times
is_initialized = true;
}
}
En substance, je peux appeler cette fonction plusieurs fois et ne pas m'inquiéter de l'initialiser MyClass
plusieurs fois.
Une fonction qui ne remplit pas ce critère pourrait être:
Foo* MyClass::ptr = NULL;
void initialize()
{
ptr = new Foo();
}
Appeler initialize()
plusieurs fois provoquera une fuite de mémoire
Motivation
Il serait bien d’avoir un seul mot concis pour décrire ce comportement afin que les fonctions censées répondre à ce critère puissent être dûment commentées (particulièrement utile lors de la description de fonctions d’interface censées être remplacées)
Réponses:
Ce type de fonction / opération s'appelle Idempotent
En mathématiques, cela signifie que si f est idempotent, f ( f (x)) = f (x), ce qui revient à dire que f ∘ f = f .
En informatique, cela signifie que si
f(x);
est idempotent,f(x);
est identique àf(x); f(x);
.Remarque: ces significations semblent différentes, mais sous la sémantique dénotationnelle d'état , le mot "idempotent" a en fait la même signification exacte en mathématiques et en informatique.
la source
Le terme précis pour cela (comme le mentionne Woofas ) est idempotence. Je voulais ajouter que même si vous pouviez appeler votre
func1
méthode idempotente, vous ne pouviez pas l'appeler une fonction pure . Les propriétés d'une fonction pure sont deux: elle doit être idempotente et ne pas avoir d'effets secondaires, c'est-à-dire aucune mutation de variables statiques locales, de variables non locales, d'arguments de référence modifiables ou de flux d'E / S.La raison pour laquelle je mentionne ceci est qu’une fonction idempotente avec des effets secondaires n’est pas bonne non plus, puisque techniquement idempotent fait référence au résultat de la fonction, et non aux effets secondaires. Donc techniquement, votre
func2
méthode est idempotente, car la sortie ne change pas en fonction de l’entrée.Vous voudrez probablement spécifier que vous voulez une fonction pure. Voici un exemple de fonction pure:
Vous trouverez plus de lectures dans l'article de Wikipedia "Fonction pure" .
la source
PUT
etDELETE
HTTP sont appelées idempotent précisément parce que l’ exécution répétitive de leurs effets secondaires a le même effet que de les exécuter une seule fois. Vous dites "idempotencyf∘f = f
", alors que dans la programmation, on entend "exécuterf
a le même effet que l'exécutionf; f
". Notez que vous pouvez facilement transformer le second sens en ancien en ajoutant un paramètre "world".func1(1) != func1(func1(1))
.void f(int var) { someGlobalVariable = var; }
. Pur, non idempotent:int func1(int var) { return var + 1; }
.Le terme est Idempotence . Notez ci-dessous qu'il existe une différence distincte entre une fonction Idempotente (appelée récursivement sur elle-même; deuxième bloc de code et la définition mathématique) et idempotence fonctionnelle (appelée à plusieurs reprises avec la même entrée de manière séquentielle; premier bloc de code et souvent le terme utilisé dans la programmation).
la source
En physique, j'ai entendu parler de projection :
Graphiquement, cela a du sens si vous regardez un dessin animé d’une projection vectorielle :
Dans l'image, un 1 est la projection de a sur b , ce qui ressemble à la première application de votre fonction. Projections ultérieures de un 1 sur de b donnent le même résultat a 1 . En d'autres termes, lorsque vous appelez une projection à plusieurs reprises, cela a le même effet que si vous l'appeliez une fois.
Avertissement juste: je n'ai jamais entendu dire que ce soit utilisé en dehors de la physique, donc à moins que vous n'ayez de tels types dans votre équipe, vous risquez de dérouter tout le monde.
la source
C'est un algorithme déterministe car, avec la même entrée (dans ce cas aucune entrée), il produira toujours la même sortie.
Les bases de données SQL sont intéressées par les fonctions déterministes .
Une fonction doit être déterministe si elle est utilisée dans le calcul d’un index.
Par exemple, dans SQLite, les fonctions non déterministes suivantes ne peuvent pas être utilisées dans un index:
random()
,changes()
,last_insert_rowid()
etsqlite3_version()
.la source
func2
est déterministe (il n'y a pas d'effets aléatoires), mais il est déjà déclaré en violation de la propriété qu'il recherche.En plus des autres réponses, s'il existe une entrée spécifique dans le functon qui possède cette propriété, il s'agit d'un point fixe , d' un point invariant ou d'un point fixe de la fonction. Par exemple, 1 pour tout pouvoir est égal à 1, donc (1ⁿ) = 1ⁿ = 1.
Le cas particulier d'un programme qui se produit en sortie est un quine .
la source