Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

Транзакции в коде

Есть примерно такой код:
ПриВыходеИзВарпРежима() { ДобавитьКораблиВКосмос(); УстановитьУНихДефолтныеКоординаты(); ... ВключитьЩиты(); ОбнаружитьПротивников(); }
В методе ВключитьЩиты произошла ошибка, а значит, я хочу всё откатить назад. С базами данных всё легко, там есть транзакции. А как быть с кодом? Может придумали что-то? Чтобы не писать кучу обратных шагов.


Ответ

Попробуйте написать ваш код в стиле «опасные изменения — безопасный коммит» + иммутабельность.
// изменения локальные корабли' = создать корабли с дефолтными координатами и включённым щитом(); локальный космос' = космос.ДобавитьКораблиИВернутьНовыйКосмос(корабли'); ... локальные противники' = обнаружить противников в (космос');
// безопасный коммит космос = космос' противники = противники'
Если какая-то часть из изменений вылетит — она затрагивает лишь локальные объекты, которые съест garbage collector или RAII.

Если все объекты у вас иммутабельны, то новый локальный космос — не расходная штука: он делит большую часть своих объектов со старым космосом.

Комментариев нет:

Отправить комментарий