Qual è un termine per una funzione che quando viene chiamata ripetutamente, ha lo stesso effetto di chiamare una volta?


96

(Supponendo un ambiente a thread singolo)

Una funzione che soddisfa questo criterio è:

bool MyClass::is_initialized = false;

void MyClass::lazy_initialize()
{
    if (!is_initialized)
    {
        initialize(); //Should not be called multiple times
        is_initialized = true;
    }
}

In sostanza, posso chiamare questa funzione più volte e non preoccuparmi dell'inizializzazione MyClasspiù volte

Una funzione che non soddisfa questo criterio potrebbe essere:

Foo* MyClass::ptr = NULL;

void initialize()
{
    ptr = new Foo();
}

La chiamata initialize()più volte provoca una perdita di memoria

Motivazione

Sarebbe bello avere una sola parola concisa per descrivere questo comportamento in modo che le funzioni che dovrebbero soddisfare questo criterio possano essere debitamente commentate (particolarmente utili quando si descrivono funzioni di interfaccia che dovrebbero essere sovrascritte)


67
Per gli elettori vicini: mentre è vero che il 99,999% (stima approssimativa) di tutte le domande "nominali-cosa" sono fuori tema perché non hanno una risposta unica, corretta, non ambigua, obiettiva e il denominazione è puramente soggettiva e l'opinione-based, questo fa avere un unico, corretto, senza ambiguità, risposta obiettiva, che è stato dato dal PO stesso.
Jörg W Mittag

30
Chiamarlo più volte ha un effetto, come ci potrebbe essere altro codice che ha cambiato 'var' in mezzo.
Remco Gerlich

7
Perché è stata posta questa domanda, se l'OP conosceva la risposta al momento della domanda ? C'è qualche motivo diverso dalla costruzione di rep / points / karma?
dotancohen

13
@dotancohen Q / Uno stile di risposta automatica è uno dei concetti chiave su StackExchange.
glglgl

17
@glglgl: sono d'accordo, per domande con merito. Che merito ha questa domanda? Sono seriamente preoccupato che inizieremo a ricevere tutte le domande CS 101 poste immediatamente e le risposte dall'OP, ogni singolo termine CS richiesto e immediatamente definito dall'OP, e tutti i pro e contro degli algoritmi di base messi in discussione e poi immediatamente risposto dall'OP ( non necessariamente questo PO). È quello il sito che vogliamo che softwareengineering.SE sia?
dotancohen

Risposte:


244

Questo tipo di funzione / operazione si chiama Idempotent

Idempotence (UK: / ˌɪdɛmˈpoʊtəns /, [1] US: / ˌaɪdəm - /) [2] è la proprietà di alcune operazioni in matematica e informatica in base alle quali possono essere applicate più volte senza modificare il risultato oltre l'applicazione iniziale.

In matematica, ciò significa che se f è idempotente, f ( f (x)) = f (x), che equivale a dire ff = f .

In informatica, ciò significa che se f(x);è idempotente, f(x);è lo stesso di f(x); f(x);.

Nota: questi significati sembrano diversi, ma sotto la semantica denotazionale dello stato , la parola "idempotente" ha in realtà lo stesso significato esatto sia in matematica che in informatica.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
maple_shaft

51

Il termine preciso per questo (come menziona Woofas ) è idempotenza. Volevo aggiungere che mentre potevi definire func1idempotente il tuo metodo, non potevi definirlo una pura funzione. Le proprietà di una funzione pura sono due: deve essere idempotente e non deve avere effetti collaterali, vale a dire nessuna mutazione di variabili statiche locali, variabili non locali, argomenti di riferimento mutabili o flussi I / O.

Il motivo per cui menziono questo è che una funzione idempotente con effetti collaterali non è neanche buona, dal momento che tecnicamente idempotente si riferisce all'output di ritorno della funzione e non agli effetti collaterali. Quindi tecnicamente il tuo func2metodo è idempotente, poiché l'output non cambia in base all'input.

Molto probabilmente vuoi specificare che vuoi una funzione pura. Un esempio di una funzione pura potrebbe essere il seguente:

int func1(int var)
{
    return var + 1;
}

Altre letture sono disponibili nell'articolo di Wikipedia "Funzione pura" .


37
Penso che la tua definizione di idempotenza sia troppo ristretta, o in altri termini, stai usando la definizione matematica di idempotenza, non quella di programmazione. Ad esempio, i metodi HTTP PUTe DELETEsono chiamati idempotenti proprio perché eseguire gli effetti collaterali più volte ha lo stesso effetto che eseguirli una sola volta. Stai dicendo "significa idempotenza f∘f = f", mentre in programmazione intendiamo "l'esecuzione fha lo stesso effetto che ha nell'esecuzione f; f". Nota che puoi facilmente trasformare il secondo significato nel primo aggiungendo un parametro "world".
Jörg W Mittag

23
@Neil "Idempotenza è strettamente un termine matematico." No, non lo è, viene utilizzato anche in reti e sistemi di comunicazione / distribuzione server client e viene descritto come descritto da JörgWMittag. È un concetto utile perché consente a più richieste a un server / client con la stessa operazione / messaggio di cambiare ciò che quel messaggio originale aveva intenzione di fare. Ciò è utile quando si dispone di comunicazioni inaffidabili ed è necessario ritentare un comando perché il messaggio del client è stato eliminato o la risposta del server lo è stata.
Opa

7
Dovresti andare più in dettaglio sulla differenza tra puro e idempotente. Il tuo esempio func1 non è idempotente perché func1(1) != func1(func1(1)).
Tezra

5
Purezza e idempotenza sono diverse. Una funzione pura non deve essere idempotente in senso matematico (è inevitabilmente idempotente in termini di effetti collaterali, in quanto non ne ha). La funzione idempotente (in senso programmatico) non deve essere pura, come nell'esempio dato da OP. Inoltre, come detto l'opa, l'idempotenza è una proprietà utile con un uso strettamente diverso dalla purezza. La tua definizione di purezza come "idempotente e senza effetti collaterali" è sbagliata o quantomeno fuorviante, il cui voto negativo.
Frax

5
Nel contesto della programmazione, non ci sono "effetti collaterali", ma se dovessi espandere la definizione per includerla, allora una funzione idempotente e una funzione pura significherebbero la stessa cosa. No, non significherebbero affatto la stessa cosa. Idempotente, non è puro: void f(int var) { someGlobalVariable = var; }. Pure, non idempotente: int func1(int var) { return var + 1; }.
JLRishe

6

Il termine è idempotenza . Si noti di seguito che esiste una netta differenza tra una funzione idempotente (chiamata in modo ricorsivo su se stessa; secondo blocco di codice e la definizione matematica) e l'idempotenza funzionale (chiamata ripetutamente con lo stesso input in sequenza; primo blocco di codice e spesso il termine inteso nella programmazione).

Una funzione f con effetti collaterali si dice idempotente nella composizione sequenziale f; f se, quando viene chiamato due volte con lo stesso elenco di argomenti, la seconda chiamata non ha effetti collaterali e restituisce lo stesso valore della prima chiamata [citazione necessaria] (supponendo che non siano state chiamate altre procedure tra la fine della prima chiamata e l'inizio della seconda chiamata).

Ad esempio, considera il seguente codice Python:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

Qui setx è idempotente perché la seconda chiamata a setx (con lo stesso argomento) non cambia lo stato del programma visibile: x era già impostato su 5 nella prima chiamata ed è nuovamente impostato su 5 nella seconda chiamata, mantenendo così stesso valore. Si noti che questo è distinto dall'idempotenza nella composizione della funzione f ∘ f. Ad esempio, il valore assoluto è idempotente nella composizione della funzione:

def abs(n):
    if n < 0:
        return -n
    else:
        return n

abs(-5) == abs(abs(-5)) == abs(5) == 5

3

In fisica ho sentito questo indicato come una proiezione :

una sporgenza è una trasformazione lineare P da uno spazio vettoriale per sé tale che P 2 = P . Cioè, ogni volta che P viene applicato due volte a qualsiasi valore, dà lo stesso risultato come se fosse applicato una volta (idempotente).

Graficamente, questo ha senso se guardi un cartone animato di una proiezione vettoriale :

inserisci qui la descrizione dell'immagine

Nell'immagine, a 1 è la proiezione di a on a b , che è come la prima applicazione della tua funzione. Le successive proiezioni di a 1 su b danno lo stesso risultato a 1 . In altre parole, quando si chiama ripetutamente una proiezione, ha lo stesso effetto di chiamarla una volta.

Avviso equo: non l'ho mai sentito al di fuori della fisica, quindi a meno che tu non abbia questi tipi nella tua squadra, potresti confondere tutti.


2
Questo è davvero un bell'esempio concreto di come può essere visualizzata una funzione idempotente (matematicamente e specialmente nel campo della geometria vettoriale / algebra lineare). Mentre l '"idempotenza" della funzione software è un concetto molto vicino, non credo che gli sviluppatori / informatici spesso usino la parola "proiezione" in questo contesto (una "funzione di proiezione" nell'ingegneria del software preferirebbe fare riferimento a una funzione che prende un oggetto e restituisce un nuovo oggetto derivato da esso, o una proprietà di quell'oggetto, per esempio)
Pac0

2
@ Pac0 Oh, ok. Lavoro ai margini tra scienza e programmazione e non ho capito che la parola era già sovraccarica. Mi vengono in mente alcuni esempi inventati sul lavoro in cui utilizzerei questa terminologia, ma devo ammettere che lavoro con persone che sono disposte a sopportare il gergo scientifico sul quotidiano :-)
user1717828

3

È un algoritmo deterministico perché dato lo stesso input (in questo caso nessun input), produrrà sempre lo stesso output.

In informatica, un algoritmo deterministico è un algoritmo che, dato un input particolare, produrrà sempre lo stesso output, con la macchina sottostante che passa sempre attraverso la stessa sequenza di stati. Gli algoritmi deterministici sono di gran lunga il tipo di algoritmo più studiato e familiare, oltre che uno dei più pratici, poiché possono essere eseguiti su macchine reali in modo efficiente.

I database SQL sono interessati alle funzioni deterministiche .

Una funzione deterministica dà sempre la stessa risposta quando ha gli stessi input. La maggior parte delle funzioni SQL integrate in SQLite sono deterministiche. Ad esempio, la funzione abs (X) restituisce sempre la stessa risposta purché il suo input X sia lo stesso.

Una funzione deve essere deterministica se utilizzata nel calcolo di un indice.

Ad esempio, in SQLite, le seguenti funzioni non deterministiche non possono essere utilizzati in un indice: random(), changes(), last_insert_rowid()e sqlite3_version().


6
Il richiedente func2è deterministico (non ci sono effetti casuali coinvolti), ma ha già dichiarato di violare la proprietà che sta cercando.
Draco18s

Che lo stesso risultato sia prodotto dalla ripetizione non equivale a dire che lo stesso risultato è prodotto dalla nidificazione o dal concatenamento. Le funzioni deterministiche sono importanti per i risultati della memorizzazione nella cache, più che per l'indicizzazione / hashing.
mckenzm,

3

Oltre alle altre risposte, se esiste un input specifico per la funzione che ha questa proprietà, si tratta di un punto fisso , un punto invariante o un punto fisso della funzione. Ad esempio, 1 per qualsiasi potenza è uguale a 1, quindi (1ⁿ) ⁿ = 1ⁿ = 1.

Il caso speciale di un programma che si produce come output è un quinino .


Le quines sono al software come i set di Cantor in matematica :-). E ovviamente le quine non sono idempotenti: o falliscono quando l'output esiste già o "bloccano" il risultato precedente e scrivono un nuovo, sebbene identico output.
Carl Witthoft,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.