Øàã 22 - Êëàññû îáúåêòîâ, ïîääåðæèâàþùèå òðàíçàêöèè. / Albert Makhmutov |
Áûâàåò îñîáåííî ïðèÿòíî, êîãäà çàíèìàåøüñÿ òåîðèåé. Çàíèìàåøüñÿ, äóìàåøü: "íó íèêàêîé ñâÿçè ñ æèçíüþ, õîòü áû ìèíèìóì ïîëüçû"… è âäðóã ðàç! è ïîëüçà ÿâëÿåòñÿ âî âñåé ñâîåé êðàñå, áëèñòàÿ â ëó÷àõ ñîëíöà è õðóñòÿ ïà÷êàìè äåíåã. ×òî ÷óâñòâîâàë Ìåíäåëååâ, êîãäà ïîñëå äîëãèõ èçûñêàíèé, æóòêèõ òàáëèö, ÿâëÿâøèõñÿ åìó â íî÷íûõ êîøìàðàõ, âäðóã ïîëó÷èë-òàêè íîðìàëüíóþ, íå ïàëåíóþ, 40-ãðàäóñíóþ âîäêó? Èëè Ýéëåð, êîãäà, ïîñëå òåðçàíèé è äåïðåññèé, èçâëåê òàêè ñîïðîòèâëÿþùèéñÿ, âèçæàùèé è öåïëÿþùèéñÿ ùóïàëüöàìè è æâàëàìè êâàäðàòíûé êîðåíü èç ìèíóñ åäèíèöû? Ê ÷åìó ýòî ÿ? À âîò ê ÷åìó: êîíöåïöèÿ smart-óêàçàòåëåé ìîæåò ïðåäëîæèòü ïðîñòûå è ïðîçðà÷íûå ðåøåíèÿ äëÿ íåêîòîðûõ ñëîæíûõ çàäà÷; è åñëè Âû ñ÷èòàåòå, ÷òî ïîääåðæêà òðàíçàêöèé (à òàê æå ìíîãîóðîâíåâîé îòìåíû è ïîâòîðà) åñòü ñëîæíàÿ çàäà÷à, òî ñìàðòû ïîìîãóò Âàì ñ çàìå÷àòåëüíîé ëåãêîñòüþ.
Âñïîìíèì äëÿ íà÷àëà, ÷òî äåëàåò òðàíçàêöèÿ:
1. Åñëè òðàíçàêöèÿ íà÷àëàñü, òî âñå èçìåíåíèÿ â íåé ëèáî âíîñÿòñÿ âìåñòå, ëèáî íå âíîñÿòñÿ âîîáùå (ýòî âîîáùå îïðåäåëåíèå òðàíçàêöèè).
2. Åñëè êëèåíò íà÷àë è íå çàâåðøèë òðàíçàêöèþ, òî äðóãèå êëèåíòû íå âèäÿò åãî èçìåíåíèé.
3. Äâå òðàíçàêöèè íå ìîãóò îäíîâðåìåííî èçìåíÿòü îäíè è òå æå äàííûå.
Íà÷íåì ñ ïåðâîãî ïóíêòà. Åñëè ìû õîòèì çàêðåïèòü èëè îòìåíèòü ïðîâåäåííûå èçìåíåíèÿ, íóæíî õðàíèòü ñîñòîÿíèå îáúåêòà íà çàäàííûé ìîìåíò - íà÷àëî òðàíçàêöèè, è â ìîìåíò ïðèíÿòèÿ ðåøåíèÿ èëè óíè÷òîæàòü ïðåäûäóùåå ñîñòîÿíèå (çàêðåïëåíèå) èëè âîçâðàùàòüñÿ ê íåìó (îòìåíà). Ïóñòü îáñëóæèâàíèåì çàíèìàåòñÿ smart-óêàçàòåëü. Êëàäåì â íåãî äâà óêàçàòåëÿ - îäèí íà òåêóùèé îáúåêò, à âòîðîé - íà îáúåêò, ïðåäñòàâëÿþùèé åãî ïðåäûäóùåå ñîñòîÿíèå, è òðè ôóíêöèè - ñòàðò, çàêðåïëåíèå, îòìåíà.
#include ‹iostream.h›
// Íåêèé ñêðîìíûé êëàññ.
class CSomeClass {
public:
int x;
int y;
};
// Åãî îïëåòêà: smart-pointer ñ ïîääåðæêîé îòìåíû.
class CSimpleTr {
public:
CSomeClass* that; // òåêóùåå çíà÷åíèå
CSomeClass* previos; // ïðåäûäóùåå çíà÷åíèå
public:
// êîíñòðóêòîð-äåñòðóêòîð-ïðèñâàèâàíèå-êîïèðîâàíèå
CSimpleTr(): previos(NULL), that(new CSomeClass) {}
CSimpleTr(const CSimpleTr& _st): that(new CSomeClass(*(_st.that))), previos(NULL) {}
~CSimpleTr() {delete that; delete previos;}
CSimpleTr& operator=(const CSimpleTr& _st) {
if (this!=&_st) {
delete that;
that = new CSomeClass(*(_st.that));
}
return *this;
}
// íà÷àëî òðàíçàêöèè
void BeginTrans() {
delete previos;
previos = that;
that = new CSomeClass(*previos);
}
// çàêðåïëåíèå
void Commit() {
delete previos;
previos = NULL;
}
// îòìåíà òðàíçàêöèè
void Rollback() {
if (previos != NULL) {
delete that;
that = previos;
previos = NULL;
}
}
// ðåàëèçàöèÿ óêàçàòåëÿ
CSomeClass* operator-›() { return that; }
};
int main (void) {
// ïðîâåðèì áûñòðåíüêî
CSimpleTr lvPair;
lvPair-›x = 5;
lvPair-›y = 8;
lvPair.BeginTrans();
lvPair-›x = 7;
lvPair-›y = 11;
lvPair.Rollback();
lvPair.BeginTrans();
lvPair-›x = 7;
lvPair-›y = 11;
lvPair.Commit();
return 0;
}
×òî ìîæåò áûòü ïðîùå? Ñåìàíòèêà çíà÷åíèé, î÷åâèäíî. Êëàññû äîëæíû èìåòü ïîëíûé íàáîð îáÿçàòåëüíûõ ôóíêöèé, êàê îáû÷íî; â íàøåì ñëó÷àå êëàññ CSomeClass áîëüíî óæ òðèâèàëåí, ïîýòîìó ñîéäåò è òàê. Êëàññ CSimpleTr èìååò ñìûñë ïåðåïèñàòü â âèäå øàáëîíà, åñëè íå õîòèòå åãî çàíîâî ïåðåïèñûâàòü äëÿ êàæäîãî íîâîãî êëèåíòà, äà åùå äîáàâèòü ôóíêöèþ isStarted(). Ôóíêöèîíàëüíîñòü íà Âàø âêóñ è ôàíòàçèþ. MTS, íàïðèìåð, âîññòàíîâèò îòìåíåííóþ òðàíçàêöèþ, åñëè Âû ïîñëå îòìåíû ñäåëàåòå çàêðåïëåíèå: SetAbort(); SetComplete(); ñðàáîòàåò òàê, êàê áóäòî SetAbort(); íå áûëî âîâñå.
| Êîììåíòèðîâàòü | « Ïðåä. çàïèñü — Ê äíåâíèêó — Ñëåä. çàïèñü » | Ñòðàíèöû: [1] [Íîâûå] |