Qual è il termine quando una funzione è "temporaneamente corretta" o "temporaneamente sicura"?

3

Una funzione (o qualsiasi blocco discreto di codice) può essere considerata come avente varie forme di "correttezza" o "sicurezza", ad esempio se una funzione non accede o non modifica uno stato condiviso (o lo fa in modo sicuro, ad es. usando le serrature) quindi è considerato "sicuro per i thread". In C ++, una funzione è "const-correct" se solo i parametri minimi assoluti mancano del modificatore const e "type-safety" significa che la funzione non si basa su un comportamento tardivo o dinamico che potrebbe causare un errore di accesso membro in fase di runtime.

Ora considera una funzione che prende il valore di "now", ad es. System.DateTime.UtcNow in .NET:

public static Resource CreateResource() {

    Resource ret = new Resource();
    ret.Created = DateTime.UtcNow;
    ret.Modified = DateTime.UtcNow;
    return ret;
}

Il bug qui è che il valore di UtcNow potrebbe cambiare tra l'impostazione .Created e .Modified , quindi i due valori di proprietà sarebbero diversi, implicando che la risorsa è stata modificata dopo che è stata creata.

L'implementazione corretta memorizzerebbe nella cache il valore iniziale di UtcNow in modo che i valori delle due proprietà siano identici:

DateTime now = DateTime.UtcNow;

Resource ret = new Resource();
ret.Created = now;
ret.Modified = now;

O in alternativa:

Resource ret = new Resource();
ret.Modified = ret.Created = DateTime.UtcNow;
return ret;

Qual è il termine per descrivere questa "correttezza"? Ho pensato a "time-correct" o leggermente più pretenzioso "temporalmente corretto" o "cronologicamente corretto", ma mi chiedo se quei termini potrebbero implicare qualcos'altro.

    
posta Dai 08.08.2016 - 11:14
fonte

3 risposte

5

Sono abbastanza sicuro che non esiste un termine generale ampiamente accettato per questo, dal momento che questo problema è relativamente raro, rispetto a "cost-correctness" o "thread-safety", che sono termini applicabili a una gamma molto più ampia di programmi e funzioni.

Tuttavia, indipendentemente dall'argomento "tempo", la funzione UtcNow appartiene alla classe più ampia di cosiddetti impure funzioni. E poiché chiamate multiple di funzioni impure non garantiscono mai di fornire lo stesso risultato (anche se chiamate con gli stessi parametri di input), bisogna sempre fare attenzione a non aspettarsi questo tipo di comportamento dalle funzioni impure, le funzioni temporali non sono in alcun modo speciali per Questo.

Se avessi bisogno di un termine per descriverlo, probabilmente direi qualcosa come " CreateResource si prende cura dell'accesso atomico quando chiama UtcNow ".

    
risposta data 08.08.2016 - 16:28
fonte
1

Non esiste un termine per tutto. Il tuo esempio è semplicemente errato perché usa ripetutamente un valore volatile supponendo che non lo sia.

Questo è un caso in cui avere una specifica chiara di ciò che ci si aspetta dalla tua funzione prima di scriverlo evita questo tipo di bug.

Unclear: "La struttura restituita dalla funzione f() deve avere i tempi di creazione e modifica impostati sull'ora UTC corrente." Ecco come si presenta il tuo primo esempio.

Più chiaro: "La struttura restituita dalla funzione f() deve avere i tempi di creazione e modifica impostati sull'ora UTC quando la funzione ha iniziato l'esecuzione." Questo potrebbe portarti a scrivere questo:

timenow = DateTime.UtcNow;
ret.Created = timenow;
ret.Modified = timenow;

Clearest: "La struttura restituita dalla funzione f() deve avere il tempo di creazione impostato sull'ora UTC quando la funzione ha iniziato l'esecuzione e il tempo di modifica identico al tempo di creazione." Questo è funzionale come l'ultimo ma taglia la quantità di codice di un terzo e ha il vantaggio di rendere ciò che è stato specificato apparente senza dover tornare indietro e leggere le specifiche:

ret.Created = DateTime.UtcNow;
ret.Modified = ret.Created;
    
risposta data 08.08.2016 - 21:57
fonte
1

Direi che il termine migliore applicabile a questo caso è transactional -your CreateResource function agisce in un modo che dipende dallo stato, ma vuole vedere uno snapshot coerente di quello stato come esisteva in un singolo punto nell'esecuzione del programma.

Questo concetto è familiare nei database relazionali, dove transazioni stabilisce istantanee dello stato del database per ottenere isolamento . Il problema nel tuo primo esempio, inserito in questa terminologia, è che la tua funzione vuole eseguire un lettura ripetibile , uno dei livelli di isolamento definiti negli standard SQL.

E infatti, la ripetibilità delle funzioni del tempo corrente è una caratteristica comune nei database SQL. Quando viene creata una transazione, il timestamp viene registrato come parte dei suoi metadati e tutte le chiamate a funzioni come CURRENT_TIMESTAMP leggono il valore catturato della transazione. Vedi ad esempio questa sezione della documentazione di PostgreSQL :

Since these functions return the start time of the current transaction, their values do not change during the transaction. This is considered a feature: the intent is to allow a single transaction to have a consistent notion of the "current" time, so that multiple modifications within the same transaction bear the same time stamp.

PostgreSQL also provides functions that return the start time of the current statement, as well as the actual current time at the instant the function is called.

    
risposta data 08.08.2016 - 23:14
fonte

Leggi altre domande sui tag