ConclusioniIl C++ si e' rivelato abbastanza potente da permettere
l'implementazione di una logica di rollback su strutture
dati complesse in memoria senza un appesantimento sintattico
nell'uso della struttura. Ovviamente questo comporta un
costo in termini di prestazioni e occupazione di memoria
ma in alcuni casi e' comunque un aiuto interessante.
Vista questa potenza ho deciso di implementare i servizi
gestionali di un server transazionale direttamente in C++
(senza cioe' scrivere un interprete specifico come ho fatto
in passato). Forse sara' una decisione su cui tornero'
indietro ma per il momento sembra una strada percorribile.
Allegato c'e' un semplice esempio di implementazione di
quanto ho descritto. Il programma dichiara tre variabili di
tipo Field<std::string>, Field<int>, Ptr<int>(1) le modifica,
le stampa, esegue un Rollback e le stampa di nuovo.
Ovviamente il comando di Commit consiste semplicemente
nell'azzerare il vettore Transaction (ricordandosi di
eliminare tutti gli oggetti TrOp puntati).
| Dimostrazione gestione transazioni in C++ Il programma e' stato provato con il compilatore BCC55(2) messo a disposizione gratuitamente da Borland/Inprise, con g++
sotto linux e con VisualC++ 6.0 di Microsoft.
|
| |
(1) | Per qualche strana ragione non sono riuscito a descrivere
la specializzazione Field<T*>in modo da poter compilare
con Visual C++ di Microsoft (i messaggi di errore erano
decisamente oscuri e sia BCC55 che g++ compilavano senza
problemi). Utilizzando un template specifico per i puntatori
la cosa si e' risolta non senza lasciarmi qualche perplessita'
sulla portabilita' del C++ quando si inizia a esplorare
angoli bui della sintassi.
|
(2) | Sembra che io sia incappato in qualche bug del compilatore in quanto
durante l'espansione dei template ricevo un warning che segnala che
ad una funzione che riceve un non-const reference viene passata una
istanza temporanea. In realta' questo non avviene nel codice
presentato (la funzione e' correttamente dichiarata ricevere un
const reference) e ho gia' sottomesso al riguardo un bug report
agli autori del compilatore.
|