-Ïîèñê ïî äíåâíèêó

Ïîèñê ñîîáùåíèé â vizhim

 -Ïîäïèñêà ïî e-mail

 

 -Ïîñòîÿííûå ÷èòàòåëè

 -Ñòàòèñòèêà

Ñòàòèñòèêà LiveInternet.ru: ïîêàçàíî êîëè÷åñòâî õèòîâ è ïîñåòèòåëåé
Ñîçäàí: 14.07.2010
Çàïèñåé: 115
Êîììåíòàðèåâ: 9
Íàïèñàíî: 123


Øàã 22 - Êëàññû îáúåêòîâ, ïîääåðæèâàþùèå òðàíçàêöèè. / Albert Makhmutov

Ïÿòíèöà, 01 Îêòÿáðÿ 2010 ã. 12:51 + â öèòàòíèê

Áûâàåò îñîáåííî ïðèÿòíî, êîãäà çàíèìàåøüñÿ òåîðèåé. Çàíèìàåøüñÿ, äóìàåøü: "íó íèêàêîé ñâÿçè ñ æèçíüþ, õîòü áû ìèíèìóì ïîëüçû"… è âäðóã ðàç! è ïîëüçà ÿâëÿåòñÿ âî âñåé ñâîåé êðàñå, áëèñòàÿ â ëó÷àõ ñîëíöà è õðóñòÿ ïà÷êàìè äåíåã. ×òî ÷óâñòâîâàë Ìåíäåëååâ, êîãäà ïîñëå äîëãèõ èçûñêàíèé, æóòêèõ òàáëèö, ÿâëÿâøèõñÿ åìó â íî÷íûõ êîøìàðàõ, âäðóã ïîëó÷èë-òàêè íîðìàëüíóþ, íå ïàëåíóþ, 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(); íå áûëî âîâñå.


 

Äîáàâèòü êîììåíòàðèé:
Òåêñò êîììåíòàðèÿ: ñìàéëèêè

Ïðîâåðêà îðôîãðàôèè: (íàéòè îøèáêè)

Ïðèêðåïèòü êàðòèíêó:

 Ïåðåâîäèòü URL â ññûëêó
 Ïîäïèñàòüñÿ íà êîììåíòàðèè
 Ïîäïèñàòü êàðòèíêó