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