(Suponiendo un entorno de subproceso único)
Una función que cumple este criterio es:
bool MyClass::is_initialized = false;
void MyClass::lazy_initialize()
{
if (!is_initialized)
{
initialize(); //Should not be called multiple times
is_initialized = true;
}
}
En esencia, puedo llamar a esta función varias veces y no preocuparme de que se inicialice MyClass
varias veces
Una función que no cumple este criterio podría ser:
Foo* MyClass::ptr = NULL;
void initialize()
{
ptr = new Foo();
}
Llamar initialize()
varias veces provocará una pérdida de memoria
Motivación
Sería bueno tener una sola palabra concisa para describir este comportamiento para que las funciones que se espera que cumplan este criterio puedan ser debidamente comentadas (especialmente útil cuando se describen funciones de interfaz que se espera que se anulen)
Respuestas:
Este tipo de función / operación se llama Idempotente
En matemáticas, esto significa que si f es idempotente, f ( f (x)) = f (x), que es lo mismo que decir f ∘ f = f .
En informática, esto significa que si
f(x);
es idempotente,f(x);
es lo mismo quef(x); f(x);
.Nota: Estos significados parecen diferentes, pero bajo la semántica de estado denotacional , la palabra "idempotente" en realidad tiene el mismo significado exacto tanto en matemáticas como en ciencias de la computación.
fuente
El término preciso para esto (como menciona Woofas ) es idempotencia. Quería agregar que si bien podría llamar
func1
idempotente a su método, no podría llamarlo una función pura . Las propiedades de una función pura son dos: debe ser idempotente y no debe tener efectos secundarios, es decir, sin mutación de variables estáticas locales, variables no locales, argumentos de referencia mutables o flujos de E / S.La razón por la que menciono esto es que una función idempotente con efectos secundarios tampoco es buena, ya que técnicamente idempotente se refiere al rendimiento de retorno de la función, y no a los efectos secundarios. Entonces, técnicamente, su
func2
método es idempotente, ya que la salida no cambia de acuerdo con la entrada.Lo más probable es que desee especificar que desea una función pura. Un ejemplo de una función pura podría ser el siguiente:
Se puede encontrar más lectura en el artículo de Wikipedia "Función pura" .
fuente
PUT
yDELETE
se denominan idempotentes precisamente porque ejecutar sus efectos secundarios varias veces tiene el mismo efecto que ejecutarlos solo una vez. Estás diciendo "idempotencia significaf∘f = f
", mientras que en programación, queremos decir "ejecutarf
tiene el mismo efecto que ejecutarf; f
". Tenga en cuenta que puede transformar fácilmente el segundo significado en el primero agregando un parámetro "mundo".func1(1) != func1(func1(1))
.void f(int var) { someGlobalVariable = var; }
. Puro, no idempotente:int func1(int var) { return var + 1; }
.El término es idempotencia . Observe a continuación que hay una clara diferencia entre una función Idempotente (llamada recursivamente sobre sí misma; segundo bloque de código y la definición matemática) y la idempotencia funcional (llamada repetidamente con la misma entrada secuencialmente; primer bloque de código y, a menudo, el término que se entiende en Programación).
fuente
En física he escuchado esto referido como una proyección :
Gráficamente, esto tiene sentido si nos fijamos en una caricatura de una proyección vectorial :
En la imagen, a 1 es la proyección de a sobre b , que es como la primera aplicación de su función. Las proyecciones posteriores de a 1 sobre b dan el mismo resultado a 1 . En otras palabras, cuando llama a una proyección repetidamente, tiene el mismo efecto que llamarla una vez.
Advertencia justa: nunca he escuchado que esto se use fuera de la física, por lo que a menos que tenga ese tipo de equipo en su equipo, podría confundir a todos.
fuente
Es un algoritmo determinista porque dada la misma entrada (en este caso sin entrada), siempre producirá la misma salida.
Las bases de datos SQL están interesadas en las funciones deterministas .
Una función debe ser determinista si se usa para calcular un índice.
Por ejemplo, en SQLite, las siguientes funciones no deterministas no se pueden utilizar en un índice:
random()
,changes()
,last_insert_rowid()
ysqlite3_version()
.fuente
func2
es determinista (no hay efectos aleatorios involucrados), pero ya se ha declarado que viola la propiedad que está buscando.Además de las otras respuestas, si hay una entrada específica al functon que tiene esta propiedad, es un punto fijo , un punto invariante o un punto fijo de la función. Por ejemplo, 1 a cualquier potencia es igual a 1, entonces (1ⁿ) ⁿ = 1ⁿ = 1.
El caso especial de un programa que se produce como salida es una quine .
fuente