Re[22]: Что вы предлагаете на замену эксепшенов?
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 24.11.05 11:51
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Вариант 1 (с транзакциями):

C>
void transfer_money(Account *from, Account *to, Money money)
{
    transaction transaction(...); //Создаем транзакцию
   
    //Вводим объекты в контекст транзакции
    LockedAccount *from_locked=from->enroll(transaction);
    LockedAccount *to_locked=to->enroll(transaction);

    //Перечисляем деньги
    Transfer  t(from_locked->get_money(money));
    to_locked->add_money(t.get_money());

    //Коммитим транзакцию
    transaction.commit();
}


Ну, значит, вот так:
PROCEDURE TransferMoney (src, dst: Account; m: Money; log: Log): BOOLEAN;
  VAR r: BOOLEAN; t: Transaction; s, d: LockedAccount; x: Transfer;

   PROCEDURE BeginTransfer;
   BEGIN (*...*)
   END BeginTransfer;

   PROCEDURE GetMoney (): BOOLEAN;
   BEGIN (*...*)
   END GetMoney;

   PROCEDURE AddMoney (): BOOLEAN;
   BEGIN (*...*)
   END AddMoney;

   PROCEDURE Enroll (a: Account; OUT b: LockedAccount): BOOLEAN;
   BEGIN (*...*)
   END Enroll;

   PROCEDURE Commit (): BOOLEAN;
   BEGIN (*...*)
   END Commit;

   PROCEDURE EndTransfer;
   BEGIN (*...*)
   END EndTransfer;

BEGIN r := (src # NIL) & (dst # NIL) & (m > 0);
  IF r THEN
    BeginTransfer;
    r := Enroll(src, s) & Enroll(dst, d) & GetMoney() & AddMoney() & Commit();
    EndTransfer
  END;
  RETURN r
END TransferMoney;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.