Здравствуйте, 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;